OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3340|回复: 16

关于FALSH写数据乱码

[复制链接]

22

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-5-17
在线时间
29 小时
发表于 2017-8-15 19:38:06 | 显示全部楼层 |阅读模式
请问 就是我想给两个地址写数据 然后就会有一个乱码请问怎么回事

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\r\n",datatemp);
                                delay_ms(1000);
                                u2_printf("%s\r\n",datatemp1);
                                //delay_ms(1000);
                        }               

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-5-17
在线时间
29 小时
 楼主| 发表于 2017-8-15 19:53:34 | 显示全部楼层
请问谁遇到过 第一次写可以写进去也没问题 第二次在写就会打印第一次乱码 第二次正常显示这是什么愿意啊  我两个地址就不在一个扇区啊
回复 支持 反对

使用道具 举报

9

主题

141

帖子

1

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2017-1-3
在线时间
65 小时
发表于 2017-8-15 20:39:36 | 显示全部楼层
写FLASH之前要擦除该页的数据
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-15 23:46:58 | 显示全部楼层
FLASH是以块为单位 擦除的.以页为单位写的.读取时 随意.  块=N*页.
所以  FLASH操作 比想像中的 还是要复杂一点.有时候修改一个字节,要重新擦一大片.好心疼.
不过,还好.FLASH可以随便擦.一般寿命在10万次左右.
搞清楚这些 估计程序不难了.
回复 支持 反对

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-8-16 11:15:22 | 显示全部楼层
4楼正解。
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-16 15:10:46 | 显示全部楼层
操作系统 发表于 2017-8-15 23:46
FLASH是以块为单位 擦除的.以页为单位写的.读取时 随意.  块=N*页.
所以  FLASH操作 比想像中的 还是要复 ...

有个疑问,是这样,我在看例程的时候我记得给的flash相关读写的函数里都包括了擦除了部分,也就是调用write函数的话,这个函数内部完成擦除再写入的工作,如果LZ也是调用和我一样的函数的话,应该是不会出现因为没有擦除直接写入而出现的乱码吧?
回复 支持 反对

使用道具 举报

22

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-5-17
在线时间
29 小时
 楼主| 发表于 2017-8-16 19:45:04 | 显示全部楼层
q247341184 发表于 2017-8-16 15:10
有个疑问,是这样,我在看例程的时候我记得给的flash相关读写的函数里都包括了擦除了部分,也就是调用wri ...

#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

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));后来我发现从低地址开始写 从高地址开始读是没有问题的的。我不知道这是为什么呢?用的是原子哥他们写的读写FLASH函数 人家写函数里已经对擦除和上锁解锁做了处理的了我觉得应该不是这个问题吧? 还有就是我想向FLASH_SAVE_ADDR比如这个地址里先写一个字符串然后在写按道理应该是覆盖掉原来的数据吧?不过也不是总能成功也不知道为什么
回复 支持 反对

使用道具 举报

22

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-5-17
在线时间
29 小时
 楼主| 发表于 2017-8-16 19:49:21 | 显示全部楼层
操作系统 发表于 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 然后我在接收在写在这里就不行 也不知道这是为什么呢?不应该是覆盖掉原来的吗
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-16 21:59:03 | 显示全部楼层
STM32初学~zy 发表于 2017-8-16 19:45
#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X08024000
#define FLASH_SAVE_ADD ...

我那会做的也不行,而且我不知道是不是这个原因
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-17 14:20:13 | 显示全部楼层
STM32初学~zy 发表于 2017-8-16 19:49
您好,有几个问题请教下您:
#define FLASH_SAVE_ADDR   0X08020000
#define FLASH_SAVE_ADDR1  0X0802 ...

你这个问题解决了吗??因为我也即将面临这个问题
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-18 22:34:03 | 显示全部楼层
会不会是sizeof的原因,sizeof返回的是字节数,而写FLASH是2个字节一写的,我不确定,你调试一下
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-19 08:23:24 | 显示全部楼层
17602515236 发表于 2017-8-18 22:34
会不会是sizeof的原因,sizeof返回的是字节数,而写FLASH是2个字节一写的,我不确定,你调试一下

还有一个问题我拿不太准,但是疲于我没买显示器又做不出来实验,就是假如我要存进去一个数字,那我pbuffer变量还是必须要指针型变量么,理论上声明整型变量就行吧,还有sizeof,如果我要是存进去一个数字,那我岂不是可以sizeof固定为2?
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-19 09:12:12 | 显示全部楼层
本帖最后由 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闪存编程参考手册》官方手册
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-19 09:25:14 | 显示全部楼层
17602515236 发表于 2017-8-19 09:12
建议买个逻辑分析仪,20多块钱,但非常实用(示波器太贵了)
STM32FLASH操作的地址必须是16位的地址指针 ...

方便用个其他的方式沟通一下嘛?因为我仿真过了,但是我用原子哥的例程发现了一些问题,原子哥的例程没什么毛病,但是似乎更适合字符型的输入,我将传入的数组改成整型数组就传不进去数据,具体现象就是无论传多少,我串口通讯的值都是这一个值。串口数据的获取我用的printf函数。
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-19 09:44:44 | 显示全部楼层
q247341184 发表于 2017-8-19 09:25
方便用个其他的方式沟通一下嘛?因为我仿真过了,但是我用原子哥的例程发现了一些问题,原子哥的例程没什 ...

要不你把程序打包给我看看吧....我也是个菜鸟呀
回复 支持 反对

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-19 09:47:57 | 显示全部楼层
17602515236 发表于 2017-8-19 09:44
要不你把程序打包给我看看吧....我也是个菜鸟呀

行,留个联系方式。
回复 支持 反对

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-19 09:51:43 | 显示全部楼层
q247341184 发表于 2017-8-19 09:47
行,留个联系方式。

2993048475
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 23:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表