读写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 ]
- HAL_StatusTypeDef HAL_FLASH_Unlock(void);2 r, e7 l, }7 p8 A" N+ y$ e! a
- HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
! ^6 v( F1 b, X - HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);0 l- Y% n" B2 j$ R0 T* N$ Y6 {
- HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);% R& C( F( l# n' a6 f6 r" i
- HAL_StatusTypeDef HAL_FLASH_Lock(void);
. w5 ]3 V4 }! i- X
复制代码
& R- A+ x$ N( p+ j5 M2. 读写FLASH代码- #define STM32_FLASH_BASE 0x08000000
' c7 A9 P2 r3 W: E
7 v& i' a+ W+ }# D& O! {2 {" V9 W, _- /* 获取扇区号 */
2 J3 c3 U& G, O5 E* i6 P - static uint8_t bsp_flash_get_sector(uint32_t addr)* @* l" U4 Z9 N0 w; q: z J
- {' ]2 f& h7 V: R+ J
- if (addr < ADDR_FLASH_SECTOR_1) return FLASH_SECTOR_0;
7 J7 v- [# g- t/ w - else if (addr < ADDR_FLASH_SECTOR_2) return FLASH_SECTOR_1; N- O4 }) ~+ K2 M, y
- else if (addr < ADDR_FLASH_SECTOR_3) return FLASH_SECTOR_2;
" p1 ]5 H. L8 B - else if (addr < ADDR_FLASH_SECTOR_4) return FLASH_SECTOR_3;; A4 M2 a b# p" G! a
- else if (addr < ADDR_FLASH_SECTOR_5) return FLASH_SECTOR_4;
4 C5 @& v; Q4 u# x1 R - else if (addr < ADDR_FLASH_SECTOR_6) return FLASH_SECTOR_5;# Q1 o- R+ L/ R1 ~- G! T' F
- else if (addr < ADDR_FLASH_SECTOR_7) return FLASH_SECTOR_6;8 l5 t9 W5 m% o2 o
- else if (addr < ADDR_FLASH_SECTOR_8) return FLASH_SECTOR_7;
; T) m2 T$ d9 n - else if (addr < ADDR_FLASH_SECTOR_9) return FLASH_SECTOR_8;& c3 |, t0 z8 _" l4 x
- else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;
1 A% Z' y; @5 E: W/ Y - else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10; . s5 A0 ?& h( T5 c& u
- return FLASH_SECTOR_11; 4 B* \! H1 K5 T' V& V9 G6 L0 X1 `' n
- }
8 y* c$ ^, G0 h3 I7 C6 O - ' n/ J7 q; g L! |* ^8 ]! ^
- /* 读FLASH */2 C" P/ f% ?# e; D b
- uint32_t bsp_flash_read(uint32_t addr)
; l1 P7 C' l9 v2 P9 q5 F2 O- @ - {
/ _0 _0 I* ~+ a( {. F! y - return *(__IO uint32_t*)(addr);
: J4 x, h p9 y' J7 m - }1 V% R' b# a. J) j
- {) p, v0 f7 }. H k
- /* 写FLASH */ B: _7 o& s. n7 L! ]! k
- void bsp_flash_write(uint32_t addr)0 U/ o, A% B+ H# u( E9 o
- {
3 Q9 q; r: p' @ - FLASH_EraseInitTypeDef f;8 D: l; R6 T' b: E8 U
- uint32_t sector_error=0;4 _4 l& n+ R/ j; {" Y
- uint32_t start_addr = addr;1 Q9 x- ]0 T2 Y' C" H4 n$ {" p
- uint32_t end_addr = start_addr + (size * 4);' {+ O% Y5 F, I" H" o( ]! ^# G
-
8 Q2 y* a) H5 {1 g$ p" l - /* 1. 判断地址合法 */
$ J; O; _/ h1 A" f$ B - if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;% s. }9 x* L9 \% s* j
-
% F& {, p$ q1 B" a* p# H - /* 2. 解锁 */. z/ o' @& C3 d
- HAL_FLASH_Unlock();
4 T7 `5 k' F; d6 R$ Y' Q7 Z5 @7 Z - , k+ P9 S2 U: ~
- /* 3. 擦除 */
, y T8 j+ e4 [5 E0 e. N- b* B - if (addr < 0x1FFF0000)
& H0 s9 O; f7 m' }( ]1 C - {; _ L7 U* Q& z! H
- while (addr < end_addr) & ~: `" k7 \6 s/ Q4 |5 x. V
- {
8 |/ R' ~5 d+ K0 S ?) V2 w: T - if (hal_flash_read(addr) != 0XFFFFFFFF)
$ t+ ^5 @) d. @- V J/ b8 u - {
H+ E4 [. B. X. V - f.TypeErase = FLASH_TYPEERASE_SECTORS;$ D( U9 u0 X: w. i4 k' ?
- f.Sector = hal_flash_get_sector(addr);
) m" ^* b- P: y% J - f.NbSectors = 1;
) f2 f6 g4 O; S! f - f.VoltageRange = FLASH_VOLTAGE_RANGE_3;; [7 e* w& A! R, {$ i: O
- if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;
- x5 R" J+ {. U8 {. e% ^+ N - }
- k# J0 w I7 _1 e) [& \ - else addr += 4; 3 w; b% _) |" f- w
- FLASH_WaitForLastOperation(50000);. ?' x: A4 l8 g: [
- }: W+ C0 m7 P& a# P: D
- }
/ j% }' A |6 P1 M+ U) F -
. F$ _ }! y, T# {% q1 E; O" a; X& P/ B - /* 4. 写入 */
, `* G1 U% `: ]- x! I& ~ - addr = start_addr;
( S: f3 g- q# V1 j J; Q - while (addr < end_addr)
- q& y8 W; _: R& t) M( } - {
6 s, Z/ ~6 S& ~% n1 ?+ F, ` - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break; , G6 I: ~9 T$ z7 |- s, ~" J
- addr += 4;. p8 b! }5 }2 {4 w5 q( l
- data++;
% E, A+ o7 b# V6 h; k) g( X( | - }
4 B2 B- q+ O6 M. E7 p0 R9 ? - 9 ~: D" L; @- B' p9 w8 {
- /* 5. 上锁 */; i9 }4 e G2 W
- HAL_FLASH_Lock(); + w: M6 S( _2 M, U6 G
- }
复制代码 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 |