解决办法:
7 G/ M' Q' P; r' e& D: P9 o在擦除flash之前调用FLASH_ClearFlag( FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
- R7 }/ h+ P9 j5 `7 t0 d, R9 Q
# B; [% ?/ w/ W M; B如下:
; N* X4 y' Z* S5 N" b" O/ X
( G, J. @2 b$ R c# |: M8 L c9 x9 G- void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
: b; X" ?0 b! w# {# d& P& a7 \1 W; _) g - { % a& E6 e4 n# i; b$ x) I
- FLASH_Status status = FLASH_COMPLETE;1 n4 y8 E( I, `" j) J: ]% ]
- u32 addrx=0;
% k( \$ ?5 ^. V% r' _ - u32 endaddr=0; / H7 E# y. C+ t
- if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return; //非法地址! m# L8 r6 t: g4 h9 W6 g3 H6 G' w
- FLASH_Unlock(); //解锁
% F. r1 p: a4 D7 v" w4 Y" k+ f, t. w - FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存0 B# A+ D8 f7 N, V% I/ m! k
- F9 W2 i. D; ~3 @' q9 _ ]
- addrx=WriteAddr; //写入的起始地址
6 U1 [0 }' q% r6 Q - endaddr=WriteAddr+NumToWrite*4; //写入的结束地址+ X3 E8 v# @; G. j
- if(addrx<0X1FFF0000) //只有主存储区,才需要执行擦除操作!!
c+ ^# o% L+ o; f q8 T4 s& p - {
4 s+ ?0 N4 }: k2 I4 \, M# s9 H* m* } - while(addrx<endaddr) //扫清一切障碍.(对非FFFFFFFF的地方,先擦除), u. j2 @7 @& e. x7 F: d
- {: k) L; I. x6 m& }
- if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区0 u6 J& o0 q* r% q) S4 Q$ i
- {
# D9 Y* j1 Q9 {4 F0 h- ] - FLASH_ClearFlag( FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
9 W" Z, ^- ]) K- R - status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!1 x1 s8 n8 v' | G8 j$ E9 }3 W& l
- if(status!=FLASH_COMPLETE)break; //发生错误了' Q7 [: r- ]' @( X* P0 O
- }else addrx+=4;
! T% \& M D6 B" E2 H/ G% ~ - }
% G" O. E7 {7 e - }
/ O( A: d- a9 T% G - if(status==FLASH_COMPLETE)# P G( z" r/ U$ I7 V6 i1 z
- {$ D$ n( S# x9 a% H' X* v
- while(WriteAddr<endaddr)//写数据! T7 Z2 Y& y1 d/ U4 c
- {; l( U. k( |. Z6 s2 q% r
- if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据$ J7 J. Y* f+ Z1 X0 D( n, M
- { 3 Z& q [; N+ T0 r% A
- break; //写入异常) t) b" U$ g% [ _* K1 O
- }
( W" m# \* N( ]0 `, L6 R - WriteAddr+=4;, Z. o! S7 t- B# N
- pBuffer++;, k1 W4 k: Z( l2 v2 @
- } 0 W7 H1 p: Y9 W/ W2 _& p
- }
% w! @9 b( ?/ n/ R, ~% y - FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存
2 ]7 f6 U0 w/ D2 P2 h j - FLASH_Lock();//上锁1 l3 [" \5 r" E; J* {7 J9 O/ y( L
- } : t! i" b* Q# o- C V+ e: Q' L; q
- P8 L" ~2 K( B1 s; P: _* G9 \
1 H- i: [! |7 s& u, d2 i# E
复制代码 7 U S' @+ b2 s, F8 v5 U' H- G# \
|