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

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

[复制链接]
STMCU小助手 发布时间:2022-10-4 14:21
这里以STM32L4R5为例(官方出的DEMO板),将变量存储在指定的片内FLASH地址(0x081F8000)。* Y7 }5 H, Y: q' V8 Y3 M6 ^( s
4 p  ~8 H$ `: e; L) I4 }# C; V
一、MDK Keil软件操作
+ Z. i- e) V' Z6 N. T
  1. uint8_t version[12] __attribute__((section(".ARM.__AT_0x081F8000")))= {0x11,0x12,0x13,0x14,0x15,0x16};
    # y) e. \9 r4 L' l
  2. uint8_t version1[12] __attribute__((at(0x081F8010)))= {0x11,0x12,0x13,0x14,0x15,0x16};
复制代码

. Z  E% T4 H& b/ k9 \' `如上图所示,采用上述方式,可以将version和version1分别存储在STM32单片机片内FLASH的0x081F8000和0x081F8010地址。! ~8 r  k: f) n
# w7 V! |. f: i3 H1 [" i4 `
对于嵌入式系统或者单片机而言,通常会将一系列的配置文件存储在一个指定的区域(section)。也就是说,某种类型的变量存储在一个指定的区域内。在这里,就要修改STM32的链接文件了。: y1 i2 [0 B( N+ t+ [6 E% q

5 r; G  V) v' @) Q8 _, D; C5 E* f下图为STM32的默认链接文件配置。4 b  b# p8 ^. s# y# c
20200310140231834.png , V7 B! W0 Q+ C" r

% ^7 N+ W; y1 P- S修改Scatter File文件。添加下图中红框内的代码,该代码的含义是定义一个区域RW_IROM2(段属性为UNINIT_FIXED_LOC),该区域的起始地址为0x081F8000,大小为0x00008000。.ANY(UNINIT_FIXED_LOC)表示存储任何段属性为UNINIT_FIXED_LOC的数据。9 _% o. R5 y  E9 c3 @
. \' R, v6 E. e. w
20200310141253364.png
& l# W& O( P3 }9 V- o9 y( S" Y2 `. }& G. k# E" G6 i6 N
取消1处的勾选,在2处选择自己修改过后的Scatter File。0 D. S1 n9 E& r
* L+ q* F3 L" D6 B9 D- a8 L' ~
20200310140527698.png
' n' C% B* F% i" o9 d3 Y( D# j: n: ?& }/ k. W
如此,在编程时,只需如此定义相应的数据类型。
6 s# p; l2 |$ E3 u8 W! C  P- K
; I( p( P. e/ d: j
  1. uint8_t version2[12] __attribute__((section("UNINIT_FIXED_LOC"), zero_init));
复制代码
; S8 Y% E3 ^5 C
在编译通过后,查看.map文件,可以看到0x081f8000处存储了0x0000000c大小的数据,段属性为UNINIT_FIXED_LOC
" _  E& a. E7 o) N5 i3 O
$ g, q9 O& \0 z- J/ n* R) P( J9 B 20200310142417547.png
  I' }( A9 q, I4 h4 O4 F) b! B4 S6 Y5 j; M& r- ]
二、IAR操作2 s, i" }  G2 _8 A4 F
在链接文件(.icf)中添加如下代码
) v. w2 S# a( G! A3 C% X* f$ j# z7 B( k: m- T7 x4 y4 B5 I, @
  1. define symbol __ICFEDIT_region_FIXED_LOC_start__ = 0x081F8000;6 t, ?% B8 @, ?) b
  2. define region uninit_fixed_loc = mem:[from __ICFEDIT_region_FIXED_LOC_start__ size 32K];
    5 p% v) ]( \* B) r8 e! t/ Y
  3. # T6 f9 g& d. z2 |. A: n
  4. place in uninit_fixed_loc  { readonly section UNINIT_FIXED_LOC };  
复制代码
! |& c* T3 n+ j! [& i4 q9 v
三、注意

7 c: y4 ^8 m+ f6 R0 y; e! _该文是将变量存储在STM32片内FLASH中,故对变量进行操作时,需要按照片内FLASH的操作方式进行,即先解锁,然后修改,再加锁。
; \, D) K0 [2 P2 D- l  Q————————————————
5 x0 Z+ ]) [# Q- D, ^' Y1 K. \版权声明:老谭_酸菜. e6 J, ^& B9 ~/ l! B& {2 v3 [  ^

6 i- A- h# Y% ^5 l* M" j. M" g$ @& G3 C, w0 \! L0 C& r8 R2 M2 t
收藏 1 评论0 发布时间:2022-10-4 14:21

举报

0个回答

所属标签

相似分享

官网相关资源

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