你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm3L4 内部FLASH操作的问题

[复制链接]
酱哒哒 提问时间:2017-10-11 11:26 /
1.L4的FLASH只支持双字写入,写入连续的字符就必须进行64位整型转换。

2.如下面这个程序:
  1. 1   char ID[11]={0}; //声明一个数组ID
  2. 2   strncpy(ID,"PA10235871",10);//将一串字符写入数组内部
  3. 3   u8 *ps=(char *)ID; //将ID的地址传递给指针ps
  4. 4   uint64_t I=*(uint64_t *)ID; //进行64位整型转换
  5. 5   I=*(uint64_t *)ps;
复制代码
问题就在于,第四步和第五步,这两步是我在出现问题之后,用来对比分析的。第四步执行无误,第五步会触发硬件错误。后来我分析汇编代码,发现第四步的汇编指令使用的LDR指令,而第五步使用的LDRD指令

关键就在于LDRD指令,这个指令  LDRD Ra,Rb,[xxx]   "从XXX地址中取出64位数据,存入Ra、Rb寄存器中"。
XXX这个地址必须双字对齐(即是8的倍数) !!出错的第五步,ID[11]的首地址的确不是8的倍数,后来我换了一个变量(地址满足双字对齐),果然第五步就没有问题了。

那么,问题就来了,这种变量分配,不可能每个都去指定固定地址,一旦出现双字不对齐的地址,就会导致转换出错,这怎么搞?

3.问题如下:
   (1)上述程序错误是否真的是LDRD指令的问题?
   (2)L4芯片内部FLASH写入字符型数据,有更好的方式么?【官方例程用的64位强制转换】


收藏 评论6 发布时间:2017-10-11 11:26

举报

6个回答
斜阳__ 回答时间:2017-10-11 13:11:47
如果不是手动分配的地址,编译器解决。如果是手动分配的地址,自己保证

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

MrJiu 回答时间:2017-10-12 09:14:56
没有看明白说的是什么!!!
酱哒哒 回答时间:2017-10-16 11:40:26
MrJiu 发表于 2017-10-12 09:14
没有看明白说的是什么!!!

程序中展示了一个64位强制转换,强制转换针对的是两个相同的数据(唯一不同就是这两个想通过数据存储地址不同),其中一个64位强制转换没问题,另一个则会触发硬件错误。分析两者汇编,发现引发错误的调用了LDRD这个汇编指令,我就问下,是不是因为LDRD针对的数据地址必须双字对齐导致了错误?
2201 回答时间:2017-12-20 14:03:21
QQ截图20171220140236.png
我懂, 哈哈哈, 但是回答不了你的问题。
2201 回答时间:2017-12-20 14:29:31
试了一下, 确实要8位对齐,不然硬件中断伺候。而且 编译器是不会自动分配地址优化的。
酱哒哒 回答时间:2017-12-25 15:31:16
2201 发表于 2017-12-20 14:29
试了一下, 确实要8位对齐,不然硬件中断伺候。而且 编译器是不会自动分配地址优化的。 ...

终于遇到理解我在说什么的人了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版