OpenEdv-开源电子网

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

SPI flash的数据地址, 可以通过attribute at来把变量数据固定?

[复制链接]

49

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1182
金钱
1182
注册时间
2020-5-13
在线时间
202 小时
发表于 2021-1-11 09:14:48 | 显示全部楼层 |阅读模式
10金钱
       工程中有一个变量,  我之前是用 attribute at放在内部flash的地址中, 然后通过flash的擦写来更改数据变量;现在我想把这个变量放在spiflash中, 然后通过SPIfalsh的擦写来更改数据;   


但是我如何去把这个变量 初始化就放在SPIflash中?

最佳答案

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

不行,你可以自己写一个函数来实现。at必须是可以直接映射的flash才可以,spi flash,对STM32F1/F4来说,就是个外设,不能映射地址。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-1-11 09:14:49 | 显示全部楼层
不行,你可以自己写一个函数来实现。at必须是可以直接映射的flash才可以,spi flash,对STM32F1/F4来说,就是个外设,不能映射地址。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10562
金钱
10562
注册时间
2017-2-18
在线时间
1912 小时
发表于 2021-1-11 16:13:35 | 显示全部楼层
帮顶~~
回复

使用道具 举报

49

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1182
金钱
1182
注册时间
2020-5-13
在线时间
202 小时
 楼主| 发表于 2021-1-11 17:19:25 | 显示全部楼层
本帖最后由 肖暗博 于 2021-1-11 17:23 编辑

  我看了正点原子的例程以及其他例程;
发现SPIFlash的地址是通过算法来算的. 0-最大; 这个地址是没有通过MCU的寄存器的, 所以不知道能不能挂载到MCU上;
这种就只能通过 : 你所需要的的数据存在SPIflash中, 也可以通过SPIflash来进行数据更新;

然后嘞, 你把你需要的变量通过SPIflash来读取;   初始化就是读取 spiflash的地址中的数据;  
明天进行试验一下; 看看这种方式可不可行?
各位有什么好的意见?
回复

使用道具 举报

49

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1182
金钱
1182
注册时间
2020-5-13
在线时间
202 小时
 楼主| 发表于 2021-1-11 17:24:05 | 显示全部楼层

多谢![抱拳]
回复

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-5-12
在线时间
56 小时
发表于 2021-1-11 18:59:15 | 显示全部楼层
在keil项目设置里,开一个地址映射,映射地址要避开内部RAM ROM和其它外设的地址,可以用0xC0000000,外部ROM的长度为spi flash的空间长度,然后将变量用attribute at定位到0xC0000000内的某个地址,在访问该地址时,地址变换为真实的flash地址(变量地址指针-0xC0000000),然后读写即可。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-1-11 20:00:16 | 显示全部楼层
肖暗博 发表于 2021-1-11 17:19
我看了正点原子的例程以及其他例程;
发现SPIFlash的地址是通过算法来算的. 0-最大; 这个地址是没有通过 ...

这同学老想玩些花哨的东西,玩之前建议打好基础,深入了解编译原理,特别是链接过程、学会链接脚本的语法。
建议学习方向为GCC工具链,因为GCC工具链无论文档还是灵活性都比Keil之类的好很多,RT-Thread的动态模块只支持GCC就是一个例证。

回到你这个需求:
  • 如果MCU是M4或以上这类支持QSPI Flash接口跟内存统一编址的,只需:编程时在片外开辟一个段(section),将变量或函数显式指定到这个段;然后用Extern Loader或bootlader辅助烧录片外Flash;
  • 如果MCU不支持SPI Flash跟内存统一编址,除了要做上述工作外,还需要在链接脚本内将片外Flash的(变量或函数)符号(symbol)地址保存在片内Flash内,C代码通过链接脚本的符号来获取片外Flash相关内容的地址。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-1-12 09:10:32 | 显示全部楼层
--------

回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-1-12 09:11:37 | 显示全部楼层
正点原子 发表于 2021-1-11 09:14
不行,你可以自己写一个函数来实现。at必须是可以直接映射的flash才可以,spi flash,对STM32F1/F4来说,就 ...

凡事无绝对,即使SPI Flash没有映射也是可以的。这需要掌握些链接脚本技巧及思维方式的转变:不要固定变量的地址,而是在源码内获得变量链接后的地址。

这个需求还是有点用的,比如:SPI Flash内存有多个图片或字体,而图片或字体会随着项目推进面不断变化的;如果能在源码内自动获得这些东西的地址的话,还是很方便的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 02:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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