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

基于STM32 OTA的读写FLASH

[复制链接]
攻城狮Melo 发布时间:2023-3-21 16:51
读写FLASH
$ X2 P" Z+ ?3 T: u. p7 w9 `1. 简述
1 u6 b, v" |0 w
STM32的写FLASH相对简单,直接读即可,写FLASH相对复杂。首先看STM32的内存大小和分配。
( W. A2 ~2 R0 j3 J( \+ z3 t3 F* n. u# K: J- l- L" I; k$ V" I
用到的HAL库函数:! i# }( B8 Y# K7 \8 V; \8 h  ]
  1. HAL_StatusTypeDef HAL_FLASH_Unlock(void);2 r, e7 l, }7 p8 A" N+ y$ e! a
  2. HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
    ! ^6 v( F1 b, X
  3. HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);0 l- Y% n" B2 j$ R0 T* N$ Y6 {
  4. HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);% R& C( F( l# n' a6 f6 r" i
  5. HAL_StatusTypeDef HAL_FLASH_Lock(void);
    . w5 ]3 V4 }! i- X
复制代码

& R- A+ x$ N( p+ j5 M2. 读写FLASH代码
  1. #define STM32_FLASH_BASE 0x08000000
    ' c7 A9 P2 r3 W: E

  2. 7 v& i' a+ W+ }# D& O! {2 {" V9 W, _
  3. /* 获取扇区号 */
    2 J3 c3 U& G, O5 E* i6 P
  4. static uint8_t bsp_flash_get_sector(uint32_t addr)* @* l" U4 Z9 N0 w; q: z  J
  5. {' ]2 f& h7 V: R+ J
  6.         if (addr < ADDR_FLASH_SECTOR_1)       return FLASH_SECTOR_0;
    7 J7 v- [# g- t/ w
  7.         else if (addr < ADDR_FLASH_SECTOR_2)  return FLASH_SECTOR_1;  N- O4 }) ~+ K2 M, y
  8.         else if (addr < ADDR_FLASH_SECTOR_3)  return FLASH_SECTOR_2;
    " p1 ]5 H. L8 B
  9.         else if (addr < ADDR_FLASH_SECTOR_4)  return FLASH_SECTOR_3;; A4 M2 a  b# p" G! a
  10.         else if (addr < ADDR_FLASH_SECTOR_5)  return FLASH_SECTOR_4;
    4 C5 @& v; Q4 u# x1 R
  11.         else if (addr < ADDR_FLASH_SECTOR_6)  return FLASH_SECTOR_5;# Q1 o- R+ L/ R1 ~- G! T' F
  12.         else if (addr < ADDR_FLASH_SECTOR_7)  return FLASH_SECTOR_6;8 l5 t9 W5 m% o2 o
  13.         else if (addr < ADDR_FLASH_SECTOR_8)  return FLASH_SECTOR_7;
    ; T) m2 T$ d9 n
  14.         else if (addr < ADDR_FLASH_SECTOR_9)  return FLASH_SECTOR_8;& c3 |, t0 z8 _" l4 x
  15.         else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;
    1 A% Z' y; @5 E: W/ Y
  16.         else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;   . s5 A0 ?& h( T5 c& u
  17.         return FLASH_SECTOR_11;        4 B* \! H1 K5 T' V& V9 G6 L0 X1 `' n
  18. }
    8 y* c$ ^, G0 h3 I7 C6 O
  19. ' n/ J7 q; g  L! |* ^8 ]! ^
  20. /* 读FLASH */2 C" P/ f% ?# e; D  b
  21. uint32_t bsp_flash_read(uint32_t addr)
    ; l1 P7 C' l9 v2 P9 q5 F2 O- @
  22. {
    / _0 _0 I* ~+ a( {. F! y
  23.         return *(__IO uint32_t*)(addr);
    : J4 x, h  p9 y' J7 m
  24. }1 V% R' b# a. J) j
  25.   {) p, v0 f7 }. H  k
  26. /* 写FLASH */  B: _7 o& s. n7 L! ]! k
  27. void bsp_flash_write(uint32_t addr)0 U/ o, A% B+ H# u( E9 o
  28. {
    3 Q9 q; r: p' @
  29.         FLASH_EraseInitTypeDef f;8 D: l; R6 T' b: E8 U
  30.         uint32_t sector_error=0;4 _4 l& n+ R/ j; {" Y
  31.         uint32_t start_addr = addr;1 Q9 x- ]0 T2 Y' C" H4 n$ {" p
  32.         uint32_t end_addr = start_addr + (size * 4);' {+ O% Y5 F, I" H" o( ]! ^# G
  33.        
    8 Q2 y* a) H5 {1 g$ p" l
  34.         /* 1. 判断地址合法 */
    $ J; O; _/ h1 A" f$ B
  35.         if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;% s. }9 x* L9 \% s* j
  36.        
    % F& {, p$ q1 B" a* p# H
  37.         /* 2. 解锁 */. z/ o' @& C3 d
  38.         HAL_FLASH_Unlock();
    4 T7 `5 k' F; d6 R$ Y' Q7 Z5 @7 Z
  39.         , k+ P9 S2 U: ~
  40.         /* 3. 擦除 */
    , y  T8 j+ e4 [5 E0 e. N- b* B
  41.         if (addr < 0x1FFF0000)
    & H0 s9 O; f7 m' }( ]1 C
  42.         {; _  L7 U* Q& z! H
  43.                 while (addr < end_addr) & ~: `" k7 \6 s/ Q4 |5 x. V
  44.                 {
    8 |/ R' ~5 d+ K0 S  ?) V2 w: T
  45.                         if (hal_flash_read(addr) != 0XFFFFFFFF)
    $ t+ ^5 @) d. @- V  J/ b8 u
  46.                         {
      H+ E4 [. B. X. V
  47.                                 f.TypeErase = FLASH_TYPEERASE_SECTORS;$ D( U9 u0 X: w. i4 k' ?
  48.                                 f.Sector = hal_flash_get_sector(addr);
    ) m" ^* b- P: y% J
  49.                                 f.NbSectors = 1;
    ) f2 f6 g4 O; S! f
  50.                                 f.VoltageRange = FLASH_VOLTAGE_RANGE_3;; [7 e* w& A! R, {$ i: O
  51.                                 if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;
    - x5 R" J+ {. U8 {. e% ^+ N
  52.                         }
    - k# J0 w  I7 _1 e) [& \
  53.                         else addr += 4;     3 w; b% _) |" f- w
  54.                         FLASH_WaitForLastOperation(50000);. ?' x: A4 l8 g: [
  55.                 }: W+ C0 m7 P& a# P: D
  56.         }
    / j% }' A  |6 P1 M+ U) F
  57.        
    . F$ _  }! y, T# {% q1 E; O" a; X& P/ B
  58.         /* 4. 写入 */
    , `* G1 U% `: ]- x! I& ~
  59.         addr = start_addr;
    ( S: f3 g- q# V1 j  J; Q
  60.         while (addr < end_addr)
    - q& y8 W; _: R& t) M( }
  61.         {
    6 s, Z/ ~6 S& ~% n1 ?+ F, `
  62.                 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;        , G6 I: ~9 T$ z7 |- s, ~" J
  63.                 addr += 4;. p8 b! }5 }2 {4 w5 q( l
  64.                 data++;
    % E, A+ o7 b# V6 h; k) g( X( |
  65.         }
    4 B2 B- q+ O6 M. E7 p0 R9 ?
  66.         9 ~: D" L; @- B' p9 w8 {
  67.         /* 5. 上锁 */; i9 }4 e  G2 W
  68.         HAL_FLASH_Lock();    + w: M6 S( _2 M, U6 G
  69. }
复制代码
2 d" v' u! z1 L7 A3 E, _' W
————————————————" o9 m$ v1 N. _$ y% [# P- ]. b" |1 D
版权声明:lljwork20212 |0 W7 |$ {6 f
& i) a! W. K/ ^- }$ V# F5 ?- p$ [% i

* K% e+ y% O) s8 G, k
( H  b4 w8 c5 l
赞 收藏 评论0 发布时间:2023-3-21 16:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

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