读写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- HAL_StatusTypeDef HAL_FLASH_Unlock(void);
, L. Y; _. f Y6 G3 D1 n& m - HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
. s( N) Z% p9 r8 R - HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);7 w3 w% v4 v( P$ \
- HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);' D1 o/ g$ C8 K& Z" n6 X
- HAL_StatusTypeDef HAL_FLASH_Lock(void);. G- C0 X v2 ]
复制代码 4 v- j, A6 P' t5 B' x* u* S3 Y" Q
2. 读写FLASH代码- #define STM32_FLASH_BASE 0x08000000
( J' G9 y% }8 i2 L: z
& y2 e* c$ T1 H2 g5 X& e1 [- /* 获取扇区号 */
/ ^; t3 ^! T2 y/ c - static uint8_t bsp_flash_get_sector(uint32_t addr). m% O) h1 a1 i; U- E# s1 n
- {. q' L3 D; w9 r0 b9 B% Y
- if (addr < ADDR_FLASH_SECTOR_1) return FLASH_SECTOR_0;
2 ]+ E4 W9 B1 g7 Q8 H* T - else if (addr < ADDR_FLASH_SECTOR_2) return FLASH_SECTOR_1;
1 a! S/ C# k1 T8 P& T - else if (addr < ADDR_FLASH_SECTOR_3) return FLASH_SECTOR_2;& v. T% C0 p7 D3 Q9 d+ m& R
- else if (addr < ADDR_FLASH_SECTOR_4) return FLASH_SECTOR_3;" l! d& C$ o- H/ w. [# k
- else if (addr < ADDR_FLASH_SECTOR_5) return FLASH_SECTOR_4;
5 a& a( o4 L) y0 q - else if (addr < ADDR_FLASH_SECTOR_6) return FLASH_SECTOR_5;/ x# T2 g( [$ a' X" V6 Y* q
- else if (addr < ADDR_FLASH_SECTOR_7) return FLASH_SECTOR_6;
( u( S6 P% ?3 U0 o8 T - else if (addr < ADDR_FLASH_SECTOR_8) return FLASH_SECTOR_7;
; M! E0 y1 H {; ~ - else if (addr < ADDR_FLASH_SECTOR_9) return FLASH_SECTOR_8;
! \, S3 M% E5 k7 k - else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;+ x% S8 I- T: Z2 j8 {
- else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;
9 R7 ^/ M' m* `+ f - return FLASH_SECTOR_11;
: B- G l, V% V' \ - }9 d& z: {' d! t Q+ u7 I4 O+ B
: |: D( A& V! c- s# K4 y- /* 读FLASH */
" }8 n# p: t9 G: v - uint32_t bsp_flash_read(uint32_t addr)
- q1 X+ q% X" {$ o8 d0 D - {& O5 Y) [7 Q* |& t$ w. U: \
- return *(__IO uint32_t*)(addr);+ M% c4 I! L( _; Z0 v
- }
7 x( v, v; ?$ G# [" Q
6 g8 g. N( n; k. e5 L# h$ f6 t! V- /* 写FLASH */: j- V( Q2 |% r+ b* |
- void bsp_flash_write(uint32_t addr)
' [, B f- r. D4 C& Q - {
# }; V& k; f. h6 n0 ]8 [) N8 n# m4 y% p - FLASH_EraseInitTypeDef f;6 l& l r6 A3 _% K, ?; O. r
- uint32_t sector_error=0;
1 m5 \" f2 Y+ ^! a/ d& A - uint32_t start_addr = addr;
) t; {4 M, @5 w& _$ L& [- w - uint32_t end_addr = start_addr + (size * 4);' K# I% v, A ^: E/ e% Z2 U( t
- ) j0 X% h! h# f, S
- /* 1. 判断地址合法 */
- K) ^1 I# N2 Y/ x6 d7 U$ V1 o - if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;/ P; e$ n; ~0 X! ?" p1 g" n
- ' m" ]0 z: a0 ]/ Q$ G8 m
- /* 2. 解锁 */
/ h4 O/ }- ?, c9 F9 t' s/ z - HAL_FLASH_Unlock();
; j# }" e ~- I" Q& l: x$ H - 1 w7 F1 b; ~; P3 Z4 l# }$ }
- /* 3. 擦除 */
2 L8 l3 Y' z4 x - if (addr < 0x1FFF0000)
, O: y# V0 P: U8 b, Y: l - {- w# G* m) J9 p6 l C f
- while (addr < end_addr)
9 E2 A- ?9 c/ a. ?) R% m2 @ - {" _. h( \- B- h! F+ z: g
- if (hal_flash_read(addr) != 0XFFFFFFFF)
. [( C; B0 b% ~ - {. s, Y% w3 Q3 F/ s
- f.TypeErase = FLASH_TYPEERASE_SECTORS;9 S9 |# J8 z; f" Y% L& D2 W' J
- f.Sector = hal_flash_get_sector(addr);
, z# A3 F. H \3 ~: w1 n3 P4 o/ s6 ~ - f.NbSectors = 1;& m' [, y4 c& z* M) I7 V
- f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
& l+ F4 m7 m$ A, J" E - if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;: [7 T6 B* g. m% y* J: i
- } ; @2 ^) U5 d" J7 I h
- else addr += 4; 2 q$ x, q7 a2 [ y( g! P7 m8 J; v
- FLASH_WaitForLastOperation(50000);
) F; i* C' w+ _ - }
+ V' B3 j, N! G - }3 E; W: C" I* l- T
- 6 N$ I6 F& d. z& ^4 l. U: M6 }; Y
- /* 4. 写入 */: P+ \ ~7 {' r5 Z
- addr = start_addr;
: n( Y t) Y' W - while (addr < end_addr)
4 a. h7 O) O" S; e0 F$ c6 t - {7 S3 L7 B0 H1 I: b9 ~/ X, T4 a5 v4 ~
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;
9 ?3 T4 ~' A( y3 J3 @: o - addr += 4;
+ v8 b- U/ |2 T+ q# [& _$ L - data++;
6 p5 R- |2 n. h3 y1 j - }
3 d9 Q; O; Y4 }- p+ j -
9 Q7 B. I" u9 f5 p - /* 5. 上锁 */
5 e: _$ K1 k4 A! M - HAL_FLASH_Lock();
; l z4 ^, H$ P0 F/ n( k - }
复制代码 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 |