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

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

[复制链接]
STMCU小助手 发布时间:2022-10-4 14:21
这里以STM32L4R5为例(官方出的DEMO板),将变量存储在指定的片内FLASH地址(0x081F8000)。, J! I: J" _3 U2 |
9 w" @4 d* s/ j6 F- L/ l# G5 |
一、MDK Keil软件操作! {. S8 g7 a) i! u6 N  B8 m
  1. uint8_t version[12] __attribute__((section(".ARM.__AT_0x081F8000")))= {0x11,0x12,0x13,0x14,0x15,0x16};
    2 `; P4 k' a' \, t" G% j. p8 {
  2. uint8_t version1[12] __attribute__((at(0x081F8010)))= {0x11,0x12,0x13,0x14,0x15,0x16};
复制代码
7 j3 i$ w8 n* a: H6 Y! r6 f+ P* q
如上图所示,采用上述方式,可以将version和version1分别存储在STM32单片机片内FLASH的0x081F8000和0x081F8010地址。
8 o( Z. h4 z1 K9 p
* ^2 s  |- T. }对于嵌入式系统或者单片机而言,通常会将一系列的配置文件存储在一个指定的区域(section)。也就是说,某种类型的变量存储在一个指定的区域内。在这里,就要修改STM32的链接文件了。, d; }. _+ h" g1 f
- Y( x3 B' ]( W9 `- z& @
下图为STM32的默认链接文件配置。
, T# v* n- r0 a1 f5 | 20200310140231834.png 2 T" {5 b: _8 S8 B
; N9 T4 m- @" n: V
修改Scatter File文件。添加下图中红框内的代码,该代码的含义是定义一个区域RW_IROM2(段属性为UNINIT_FIXED_LOC),该区域的起始地址为0x081F8000,大小为0x00008000。.ANY(UNINIT_FIXED_LOC)表示存储任何段属性为UNINIT_FIXED_LOC的数据。
7 X7 M" w4 B" ?1 W
" {( a/ l4 w" J4 l( {4 t5 |: p$ F: { 20200310141253364.png
8 X' `# [0 y  R7 r7 `7 L1 H: m/ `
取消1处的勾选,在2处选择自己修改过后的Scatter File。9 o8 J% U1 I' }+ Z+ E6 L, E$ K3 M

+ g. v" h+ J" p/ ?& t 20200310140527698.png - X4 M+ A5 t9 l

# O# e' w0 ^" ?+ O! S3 N  O如此,在编程时,只需如此定义相应的数据类型。
1 q- L  R* z2 F; k* K$ h3 J9 a+ G' \1 Y8 D4 f
  1. uint8_t version2[12] __attribute__((section("UNINIT_FIXED_LOC"), zero_init));
复制代码
: |+ x$ K' [: G# }6 `
在编译通过后,查看.map文件,可以看到0x081f8000处存储了0x0000000c大小的数据,段属性为UNINIT_FIXED_LOC
( u& L9 w' r9 M% F) e/ v6 [+ e. V7 O" c, f% E% d. v
20200310142417547.png 3 Z* i7 y3 Y3 M0 y$ S) Q
$ h+ i. E) Y6 g; [, I& Y
二、IAR操作
8 o% a2 [  S# I) d1 H在链接文件(.icf)中添加如下代码: f* D, v6 h4 }) X
  a9 z2 \6 N  F/ \3 Z/ M
  1. define symbol __ICFEDIT_region_FIXED_LOC_start__ = 0x081F8000;
    * ?( O2 L, Q; s1 i/ t* J; P0 E
  2. define region uninit_fixed_loc = mem:[from __ICFEDIT_region_FIXED_LOC_start__ size 32K];3 n' C+ F$ ^+ \: P1 B+ j

  3. ) r/ Q8 \* c! V$ {1 v
  4. place in uninit_fixed_loc  { readonly section UNINIT_FIXED_LOC };  
复制代码

) A. I& ^7 @, O, _% r三、注意

- e0 d+ G+ s4 }该文是将变量存储在STM32片内FLASH中,故对变量进行操作时,需要按照片内FLASH的操作方式进行,即先解锁,然后修改,再加锁。
/ D; b1 Q0 G8 ?& n# A3 Q  ~————————————————
0 D9 B' G; j8 ^7 s7 K版权声明:老谭_酸菜+ Q% g* a6 W$ V1 x6 j  @

: U7 x) p5 h, n9 `' g) }9 j' @- t$ m
0 p7 q+ @2 n% @! w
赞 收藏 1 评论0 发布时间:2022-10-4 14:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

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