OpenEdv-开源电子网

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

"第三十一章 FLASH 模拟EEPROM 实验"中代码有个问题?

[复制链接]

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
发表于 2020-12-9 09:23:31 | 显示全部楼层 |阅读模式
1金钱
STM32不完全手册(库函数版)V3.1。
第三十一章 FLASH 模拟EEPROM 实验。

企业微信截图_16074407488073.png

地址偏移是不是应该如下?
WriteAddr += secremain * 2;



最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=46875&highlight=flash%C4%A3%C4%E2eeprom 确实有其它帖子提到了,谢老哥
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2020-12-9 09:23:32 | 显示全部楼层
本帖最后由 约翰一世 于 2020-12-9 20:45 编辑
liulan104 发表于 2020-12-9 15:57
这个问题 已经更正过了

http://www.openedv.com/forum.php ... h%C4%A3%C4%E2eeprom
确实有其它帖子提到了,谢老哥
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-9 11:24:06 | 显示全部楼层
刚查看完精英版代码,和你贴的一样。
if(NumToWrite==secremain)break;//写入结束了
                else//写入未结束
                {
                        secpos++;                                //扇区地址增1
                        secoff=0;                                //偏移位置为0          
                           pBuffer+=secremain;          //指针偏移
                        WriteAddr+=secremain;        //写地址偏移          
                           NumToWrite-=secremain;        //字节(16位)数递减
                        if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
                        else secremain=NumToWrite;//下一个扇区可以写完了
                }
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2020-12-9 13:38:24 | 显示全部楼层
游走在01的海洋 发表于 2020-12-9 11:24
刚查看完精英版代码,和你贴的一样。
if(NumToWrite==secremain)break;//写入结束了
                else//写入未结束
...

secremain是半字的个数,地址的话以字节为单位,应该乘个2吧?
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-9 15:40:41 | 显示全部楼层
约翰一世 发表于 2020-12-9 13:38
secremain是半字的个数,地址的话以字节为单位,应该乘个2吧?

WriteAddr+=secremain;        //写地址偏移
你要注意,这个语句的意思是WriteAddr=WriteAddr+secremain;这是一个加法运算,如果有错误的话,也是看WriteAddr是否会溢出,而在程序中也设置了边界语句:if(NumToWrite==secremain)break;//写入结束了。

如果变成你所写的WriteAddr+=secremain*2;
语句展开 WriteAddr=WriteAddr+secremain*2;这时 你就看出来了,你想加入的偏移量直接为原来的2倍,这样肯定和你想设置的不一样了。

至于你说的将他们的地址以字节为单位,应该是地址以字(32位)为单位才对吧。如果你想将secremain设置为32位,在定义的时候直接设置才行。不过在flash eeprom程序中,偏移量使用16位的已经足够了。
回复

使用道具 举报

0

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-6-23
在线时间
66 小时
发表于 2020-12-9 15:57:10 | 显示全部楼层
这个问题 已经更正过了
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2020-12-9 20:20:36 | 显示全部楼层
游走在01的海洋 发表于 2020-12-9 15:40
WriteAddr+=secremain;        //写地址偏移
你要注意,这个语句的意思是WriteAddr=WriteAddr+secremain ...

我的意思是:
那个语句作用是,一页写不完,把写入地址移到下一页。
写flash最小单位是半字 16位,所以大部分操作计数都是以半字为单位的计数,包括secremain。
地址的单位是字节 8位,所以我说该乘个2。

你可能有些地方没懂,建议再看看代码和参考手册或用户手册的memory部分,理解一下。
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-9 21:51:29 | 显示全部楼层
约翰一世 发表于 2020-12-9 20:20
我的意思是:
那个语句作用是,一页写不完,把写入地址移到下一页。
写flash最小单位是半字 16位,所以 ...

抱歉,误导你了。这段程序,还要在仔细看看才行。
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2020-12-10 16:04:46 | 显示全部楼层
游走在01的海洋 发表于 2020-12-9 21:51
抱歉,误导你了。这段程序,还要在仔细看看才行。

同样也谢谢你!关注了我的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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