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

基于STM32 OTA的读写FLASH

[复制链接]
攻城狮Melo 发布时间:2023-3-21 16:51
读写FLASH
; c- O8 f: V. U1 w1. 简述

9 Z8 l  R4 K$ kSTM32的写FLASH相对简单,直接读即可,写FLASH相对复杂。首先看STM32的内存大小和分配。
( I5 [, O2 \6 t. E4 _! P3 ~: E; W$ r2 F  ^% n8 L
用到的HAL库函数:
% k8 V$ ]5 [5 P) u" v
  1. HAL_StatusTypeDef HAL_FLASH_Unlock(void);
    , L. Y; _. f  Y6 G3 D1 n& m
  2. HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
    . s( N) Z% p9 r8 R
  3. HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);7 w3 w% v4 v( P$ \
  4. HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);' D1 o/ g$ C8 K& Z" n6 X
  5. HAL_StatusTypeDef HAL_FLASH_Lock(void);. G- C0 X  v2 ]
复制代码
4 v- j, A6 P' t5 B' x* u* S3 Y" Q
2. 读写FLASH代码
  1. #define STM32_FLASH_BASE 0x08000000
    ( J' G9 y% }8 i2 L: z

  2. & y2 e* c$ T1 H2 g5 X& e1 [
  3. /* 获取扇区号 */
    / ^; t3 ^! T2 y/ c
  4. static uint8_t bsp_flash_get_sector(uint32_t addr). m% O) h1 a1 i; U- E# s1 n
  5. {. q' L3 D; w9 r0 b9 B% Y
  6.         if (addr < ADDR_FLASH_SECTOR_1)       return FLASH_SECTOR_0;
    2 ]+ E4 W9 B1 g7 Q8 H* T
  7.         else if (addr < ADDR_FLASH_SECTOR_2)  return FLASH_SECTOR_1;
    1 a! S/ C# k1 T8 P& T
  8.         else if (addr < ADDR_FLASH_SECTOR_3)  return FLASH_SECTOR_2;& v. T% C0 p7 D3 Q9 d+ m& R
  9.         else if (addr < ADDR_FLASH_SECTOR_4)  return FLASH_SECTOR_3;" l! d& C$ o- H/ w. [# k
  10.         else if (addr < ADDR_FLASH_SECTOR_5)  return FLASH_SECTOR_4;
    5 a& a( o4 L) y0 q
  11.         else if (addr < ADDR_FLASH_SECTOR_6)  return FLASH_SECTOR_5;/ x# T2 g( [$ a' X" V6 Y* q
  12.         else if (addr < ADDR_FLASH_SECTOR_7)  return FLASH_SECTOR_6;
    ( u( S6 P% ?3 U0 o8 T
  13.         else if (addr < ADDR_FLASH_SECTOR_8)  return FLASH_SECTOR_7;
    ; M! E0 y1 H  {; ~
  14.         else if (addr < ADDR_FLASH_SECTOR_9)  return FLASH_SECTOR_8;
    ! \, S3 M% E5 k7 k
  15.         else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;+ x% S8 I- T: Z2 j8 {
  16.         else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;   
    9 R7 ^/ M' m* `+ f
  17.         return FLASH_SECTOR_11;       
    : B- G  l, V% V' \
  18. }9 d& z: {' d! t  Q+ u7 I4 O+ B

  19. : |: D( A& V! c- s# K4 y
  20. /* 读FLASH */
    " }8 n# p: t9 G: v
  21. uint32_t bsp_flash_read(uint32_t addr)
    - q1 X+ q% X" {$ o8 d0 D
  22. {& O5 Y) [7 Q* |& t$ w. U: \
  23.         return *(__IO uint32_t*)(addr);+ M% c4 I! L( _; Z0 v
  24. }
    7 x( v, v; ?$ G# [" Q

  25. 6 g8 g. N( n; k. e5 L# h$ f6 t! V
  26. /* 写FLASH */: j- V( Q2 |% r+ b* |
  27. void bsp_flash_write(uint32_t addr)
    ' [, B  f- r. D4 C& Q
  28. {
    # }; V& k; f. h6 n0 ]8 [) N8 n# m4 y% p
  29.         FLASH_EraseInitTypeDef f;6 l& l  r6 A3 _% K, ?; O. r
  30.         uint32_t sector_error=0;
    1 m5 \" f2 Y+ ^! a/ d& A
  31.         uint32_t start_addr = addr;
    ) t; {4 M, @5 w& _$ L& [- w
  32.         uint32_t end_addr = start_addr + (size * 4);' K# I% v, A  ^: E/ e% Z2 U( t
  33.         ) j0 X% h! h# f, S
  34.         /* 1. 判断地址合法 */
    - K) ^1 I# N2 Y/ x6 d7 U$ V1 o
  35.         if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;/ P; e$ n; ~0 X! ?" p1 g" n
  36.         ' m" ]0 z: a0 ]/ Q$ G8 m
  37.         /* 2. 解锁 */
    / h4 O/ }- ?, c9 F9 t' s/ z
  38.         HAL_FLASH_Unlock();
    ; j# }" e  ~- I" Q& l: x$ H
  39.         1 w7 F1 b; ~; P3 Z4 l# }$ }
  40.         /* 3. 擦除 */
    2 L8 l3 Y' z4 x
  41.         if (addr < 0x1FFF0000)
    , O: y# V0 P: U8 b, Y: l
  42.         {- w# G* m) J9 p6 l  C  f
  43.                 while (addr < end_addr)
    9 E2 A- ?9 c/ a. ?) R% m2 @
  44.                 {" _. h( \- B- h! F+ z: g
  45.                         if (hal_flash_read(addr) != 0XFFFFFFFF)
    . [( C; B0 b% ~
  46.                         {. s, Y% w3 Q3 F/ s
  47.                                 f.TypeErase = FLASH_TYPEERASE_SECTORS;9 S9 |# J8 z; f" Y% L& D2 W' J
  48.                                 f.Sector = hal_flash_get_sector(addr);
    , z# A3 F. H  \3 ~: w1 n3 P4 o/ s6 ~
  49.                                 f.NbSectors = 1;& m' [, y4 c& z* M) I7 V
  50.                                 f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    & l+ F4 m7 m$ A, J" E
  51.                                 if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;: [7 T6 B* g. m% y* J: i
  52.                         } ; @2 ^) U5 d" J7 I  h
  53.                         else addr += 4;     2 q$ x, q7 a2 [  y( g! P7 m8 J; v
  54.                         FLASH_WaitForLastOperation(50000);
    ) F; i* C' w+ _
  55.                 }
    + V' B3 j, N! G
  56.         }3 E; W: C" I* l- T
  57.         6 N$ I6 F& d. z& ^4 l. U: M6 }; Y
  58.         /* 4. 写入 */: P+ \  ~7 {' r5 Z
  59.         addr = start_addr;
    : n( Y  t) Y' W
  60.         while (addr < end_addr)
    4 a. h7 O) O" S; e0 F$ c6 t
  61.         {7 S3 L7 B0 H1 I: b9 ~/ X, T4 a5 v4 ~
  62.                 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;       
    9 ?3 T4 ~' A( y3 J3 @: o
  63.                 addr += 4;
    + v8 b- U/ |2 T+ q# [& _$ L
  64.                 data++;
    6 p5 R- |2 n. h3 y1 j
  65.         }
    3 d9 Q; O; Y4 }- p+ j
  66.        
    9 Q7 B. I" u9 f5 p
  67.         /* 5. 上锁 */
    5 e: _$ K1 k4 A! M
  68.         HAL_FLASH_Lock();   
    ; l  z4 ^, H$ P0 F/ n( k
  69. }
复制代码
6 s) w- F/ h4 y+ V$ ~& {* M/ ]
————————————————
$ A/ B8 K7 v1 r- l* i9 T  r( t- F版权声明:lljwork20214 h( X, p4 n- Y3 }/ l
4 z! i- p: ^3 f8 r1 s
% l- ^1 S9 _0 {, G2 P% T

& o2 a, u$ U) r, f2 Y# O  W
收藏 评论0 发布时间:2023-3-21 16:51

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版