踩过的坑分享出来:
. d; P4 h! Q' g( ?0 T# a& O* H官方FLASH写入数据的例程是没错的,
0 e+ F" V7 T) S- P+ |- C但是遇到复杂情况! L8 f7 H" ^7 b& N0 a
HAL_FLASHEx_Erase返回结果不是HAL_OK怎么办?% G! z" i4 Q9 L4 Q$ j2 |2 F; _) X
我天真的直接搬运过去用了。5 i2 U0 T9 T3 g6 a! U$ ?( U5 t
8 S. _5 R* }* |& s- \) {, U* {" l$ T% b
官方例程部分源代码是
& M0 Q" K! i4 i
7 X& t% \; J, ^6 {$ ]3 n- if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)% S [3 @. |( g4 l8 F' ^! w/ A8 O
- {, D7 C) q* A' G; [8 B: ]( O
- /*
) }8 Z0 {' e* r d0 Y; K - Error occurred while page erase.
& t% ^, x" X8 }# D - User can add here some code to deal with this error.5 O2 l" X6 |1 e, W
- PAGEError will contain the faulty page and then to know the code error on this page,* a4 [. r0 X5 y* _% M6 ~
- user can call function 'HAL_FLASH_GetError()'4 R9 o) i! h7 l$ }
- */
/ ^3 L* P' a( R$ \# c% |3 W: l - /* Infinite loop */
, Y, S) j9 _* P) U7 |/ m9 p -
6 Z/ d8 R ?: h6 t: P: k* m - printf("\n\r Error occurred while page erase. \n\r");3 }! g8 T! k+ V) Z1 h0 N* Q
- }
5 c+ {2 c# [- V7 g9 @1 x
复制代码 , M' J8 u+ g, i' f& R7 J: Y
3 ^# e. X' a9 f+ t$ }, Z: ~* r按照我经验必须修改为下面代码
4 n+ L/ Q- T& h0 b. _1 o# y
' Q1 Q8 N9 {. k$ y: n+ J- P) H+ ^* o8 S- while(HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
& x E( ^1 a: B/ p1 o - {
; V9 J5 |; M: ~1 N" t: q - //
4 {, b( Z9 s7 N3 z" Y7 n) K2 s; b0 z - __nop();2 l, }8 `; _. F
- }
9 p! I1 m7 v6 t- ]$ b! y9 P
复制代码
: Z: y1 N6 z( A4 A$ A; I( U* N% I, W$ T: d& q+ w* |, F( f
$ q$ P3 B; J+ ]( E2 u/ n为什么我会踩到这个坑呢?
9 E" A5 w- j8 F# D* U4 h因为我做OTA升级,APP部分跑的任务比较多,必须运行到第2次HAL_FLASHEx_Erase才能返回HAL_OK,于是就循环等待咯。- F9 U; a8 V) k( n' L" J9 @
, w* s5 ]8 d* a9 j0 i- K" }8 S
; L2 a2 q: i6 [8 k
7 i) c$ V: o) h$ u |1 ?" }& m) K Z0 D1 x' W0 A. c- @
& w, C' |0 Q1 D" Z0 M
7 N8 E. V$ a/ e
: ^8 v0 j! p0 T$ q- q1 d8 ] \7 _+ }2 }% r W% z
|