关于FALSH写数据乱码

2019-08-14 07:36发布

请问 就是我想给两个地址写数据 然后就会有一个乱码请问怎么回事

const u8 TEXT_Buffer[]={"STM32 FLASH TEST"};
const u8 TEXT_Buffer1[] = {"helloword"};

#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X08024000



        STMFLASH_Write(0X08004000,(u16*)TEXT_Buffer,sizeof(TEXT_Buffer));
        delay_ms(2000);
         STMFLASH_Write(0X08006000,(u16*)TEXT_Buffer1,sizeof(TEXT_Buffer1));
         delay_ms(2000);
         STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,sizeof(datatemp));
         delay_ms(2000);
         STMFLASH_Read(FLASH_SAVE_ADDR1,(u16*)datatemp1,sizeof(datatemp1));
         while(1)
                        {
                                        LED1 =!LED1;
                                        delay_ms(500);
                                //TEST();       
                               
                                u2_printf("%s ",datatemp);
                                delay_ms(1000);
                                u2_printf("%s ",datatemp1);
                                //delay_ms(1000);
                        }               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
STM32初学~zy
1楼-- · 2019-08-14 21:52
操作系统 发表于 2017-8-15 23:46
FLASH是以块为单位 擦除的.以页为单位写的.读取时 随意.  块=N*页.
所以  FLASH操作 比想像中的 还是要复 ...

您好,有几个问题请教下您:
#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X08024000
#define FLASH_SAVE_ADDR2  0X08028000
#define FLASH_SAVE_ADDR3  0X08034000
#define FLASH_SAVE_ADDR4  0X08010000

if((STMFLASH_ReadHalfWord(FLASH_SAVE_ADDR4))==1)
                {
                                STMFLASH_Read(FLASH_SAVE_ADDR1,(u16*)cipsta,sizeof(cipsta));
                                delay_ms(1000);
                                STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)wifi,sizeof(wifi));
                                delay_ms(2000);
                                STMFLASH_Read(FLASH_SAVE_ADDR3,(u16*)cipopen,sizeof(cipopen));
                                delay_ms(1000);
                                STMFLASH_Read(FLASH_SAVE_ADDR2,(u16*)cipsto,sizeof(cipsto));
                                delay_ms(1000);       
                        while(atk_8266_send_cmd(wifi,"OK",200));         
                        while(atk_8266_send_cmd(cipsta,"OK",200));  
                        while(atk_8266_send_cmd(cipopen,"OK",200));
                }
我是这样定义 然后是从低地址开始写串口接收到的数据 然后从高地址开始读就不会有说第一次写的乱码的现象,不知道这是什么原因?我可以确定接收的数据并没有超过我定义的地址也没有在同一个扇区。。。   还有一个问题就是我从串口接收到的数据比如先写在FLASH_SAVE_ADDR1 然后我在接收在写在这里就不行 也不知道这是为什么呢?不应该是覆盖掉原来的吗
q247341184
2楼-- · 2019-08-14 23:19
STM32初学~zy 发表于 2017-8-16 19:45
#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X08024000
#define FLASH_SAVE_ADD ...

我那会做的也不行,而且我不知道是不是这个原因
q247341184
3楼-- · 2019-08-15 02:24
STM32初学~zy 发表于 2017-8-16 19:49
您好,有几个问题请教下您:
#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X0802 ...

你这个问题解决了吗??因为我也即将面临这个问题
17602515236
4楼-- · 2019-08-15 07:47
 精彩回答 2  元偷偷看……
q247341184
5楼-- · 2019-08-15 12:48
17602515236 发表于 2017-8-18 22:34
会不会是sizeof的原因,sizeof返回的是字节数,而写FLASH是2个字节一写的,我不确定,你调试一下

还有一个问题我拿不太准,但是疲于我没买显示器又做不出来实验,就是假如我要存进去一个数字,那我pbuffer变量还是必须要指针型变量么,理论上声明整型变量就行吧,还有sizeof,如果我要是存进去一个数字,那我岂不是可以sizeof固定为2?
17602515236
6楼-- · 2019-08-15 16:08
本帖最后由 17602515236 于 2017-8-19 09:19 编辑
q247341184 发表于 2017-8-19 08:23
还有一个问题我拿不太准,但是疲于我没买显示器又做不出来实验,就是假如我要存进去一个数字,那我pbuffe ...

建议买个逻辑分析仪,20多块钱,但非常实用(示波器太贵了)
STM32FLASH操作的地址必须是16位的地址指针然后数据也必须是16位的数据(所以pbuff只要声明为16位的就好了,像你这样子也是可以的,这些都无所谓,只要写入的数据是16位就好了)我是自己看手册写的FLASH函数,没用原子哥的,
但我估计原子哥的第二个形参,就是sizeof那个形参是表示你要写入的数据的个数,也就是有几个16位数据要写入
所以这里,你得算好,不能多,多了说不定或数组越界,少了又写不完整,建议还是仿真以下,看看到底sizeof得出的结果是多少
然后建议你去看一下手册《STM32F10x闪存编程参考手册》官方手册

一周热门 更多>