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

STM32 变量存储在片内FLASH的指定位置

[复制链接]
STMCU小助手 发布时间:2022-10-4 14:21
这里以STM32L4R5为例(官方出的DEMO板),将变量存储在指定的片内FLASH地址(0x081F8000)。
1 N0 ?- a; c' k6 o3 u  ^
" h: B8 T9 @6 y! p6 N一、MDK Keil软件操作) \: K' F/ r$ R
  1. uint8_t version[12] __attribute__((section(".ARM.__AT_0x081F8000")))= {0x11,0x12,0x13,0x14,0x15,0x16};
    5 w, W1 Z& {  b/ H; O' X6 E
  2. uint8_t version1[12] __attribute__((at(0x081F8010)))= {0x11,0x12,0x13,0x14,0x15,0x16};
复制代码
5 C- k. G! C1 b& z7 g. A
如上图所示,采用上述方式,可以将version和version1分别存储在STM32单片机片内FLASH的0x081F8000和0x081F8010地址。
- f3 [% I/ g8 @' y" ~
+ X! t9 g# G" Q对于嵌入式系统或者单片机而言,通常会将一系列的配置文件存储在一个指定的区域(section)。也就是说,某种类型的变量存储在一个指定的区域内。在这里,就要修改STM32的链接文件了。7 o& `4 ^& s; H6 ?4 z: x# Z

# x3 ?' N% t& J( W下图为STM32的默认链接文件配置。& \( U6 \: {; a2 b3 }( B& K
20200310140231834.png
* y6 i* }1 Z' A2 r- {. O' I
; q% c, r$ {$ T. o修改Scatter File文件。添加下图中红框内的代码,该代码的含义是定义一个区域RW_IROM2(段属性为UNINIT_FIXED_LOC),该区域的起始地址为0x081F8000,大小为0x00008000。.ANY(UNINIT_FIXED_LOC)表示存储任何段属性为UNINIT_FIXED_LOC的数据。
1 g- Q; m* @+ ^- z8 ?
2 g; A4 T0 E. h: y( G2 A8 Y 20200310141253364.png
& t6 T) Q; p7 ]5 G  ]) c  e) t  x7 V  o) i, Z
取消1处的勾选,在2处选择自己修改过后的Scatter File。
) P4 u5 w. j$ Z  `4 g. Y" h* ^4 N2 j
20200310140527698.png
/ A2 P0 N1 N' n$ c7 x( {; p% z  i8 M$ b3 A( E
如此,在编程时,只需如此定义相应的数据类型。
7 S4 C3 r& ]) [( h& H2 }8 _- U9 [$ d7 {  v
  1. uint8_t version2[12] __attribute__((section("UNINIT_FIXED_LOC"), zero_init));
复制代码

, V5 ~& ]3 H% M0 l) h3 @( B0 Z在编译通过后,查看.map文件,可以看到0x081f8000处存储了0x0000000c大小的数据,段属性为UNINIT_FIXED_LOC
  J4 o7 {' a! y1 Q, V# a1 E, [/ o  V6 x- p1 D
20200310142417547.png ( x+ A7 d$ S) T/ o
# P! {* z. q1 ^/ X$ o5 |/ D
二、IAR操作$ W. t+ L, V: W& d5 Z/ \7 C
在链接文件(.icf)中添加如下代码2 K4 f9 N& J3 G+ ~

0 Y) X2 }, U1 C9 o- e3 t+ S
  1. define symbol __ICFEDIT_region_FIXED_LOC_start__ = 0x081F8000;
    8 D. @0 O3 B) j4 z
  2. define region uninit_fixed_loc = mem:[from __ICFEDIT_region_FIXED_LOC_start__ size 32K];
    6 n% l: f. W# F4 e, u, `$ a: ]
  3. 6 P1 M# z# V0 X3 L
  4. place in uninit_fixed_loc  { readonly section UNINIT_FIXED_LOC };  
复制代码
+ T6 S* }2 r( _5 ?
三、注意

9 w2 Y7 A3 a$ i$ g7 u7 f5 N该文是将变量存储在STM32片内FLASH中,故对变量进行操作时,需要按照片内FLASH的操作方式进行,即先解锁,然后修改,再加锁。
  B4 @7 V8 L" q& M————————————————  r6 ?, o; L0 U9 v+ j9 {( _
版权声明:老谭_酸菜
3 H/ o) t( ~9 V9 X
- _) [6 P; F) G' k8 D# b6 u" L$ u1 q  D7 Q# `0 L# ]( s
赞 收藏 1 评论0 发布时间:2022-10-4 14:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版