搜索
查看: 3539|回复: 6

[已解决] 关于stm3L4 内部FLASH操作的问题

[复制链接]

该用户从未签到

13

主题

68

帖子

2

蝴蝶豆

高级会员

最后登录
2018-9-3
发表于 2017-10-11 11:26:57 | 显示全部楼层 |阅读模式
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位强制转换】


回复

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
发表于 2017-10-11 13:11:47 | 显示全部楼层
如果不是手动分配的地址,编译器解决。如果是手动分配的地址,自己保证

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1002

帖子

363

蝴蝶豆

版主

最后登录
2021-4-15
发表于 2017-10-12 09:14:56 | 显示全部楼层
没有看明白说的是什么!!!
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

68

帖子

2

蝴蝶豆

高级会员

最后登录
2018-9-3
 楼主| 发表于 2017-10-16 11:40:26 | 显示全部楼层
MrJiu 发表于 2017-10-12 09:14
没有看明白说的是什么!!!

程序中展示了一个64位强制转换,强制转换针对的是两个相同的数据(唯一不同就是这两个想通过数据存储地址不同),其中一个64位强制转换没问题,另一个则会触发硬件错误。分析两者汇编,发现引发错误的调用了LDRD这个汇编指令,我就问下,是不是因为LDRD针对的数据地址必须双字对齐导致了错误?
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

4

帖子

0

蝴蝶豆

初级会员

最后登录
2021-7-30
发表于 2017-12-20 14:03:21 | 显示全部楼层
QQ截图20171220140236.png
我懂, 哈哈哈, 但是回答不了你的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

4

帖子

0

蝴蝶豆

初级会员

最后登录
2021-7-30
发表于 2017-12-20 14:29:31 | 显示全部楼层
试了一下, 确实要8位对齐,不然硬件中断伺候。而且 编译器是不会自动分配地址优化的。
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

68

帖子

2

蝴蝶豆

高级会员

最后登录
2018-9-3
 楼主| 发表于 2017-12-25 15:31:16 | 显示全部楼层
2201 发表于 2017-12-20 14:29
试了一下, 确实要8位对齐,不然硬件中断伺候。而且 编译器是不会自动分配地址优化的。 ...

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

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 04:54 , Processed in 1.217171 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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