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

【经验分享】STM32F4调用STMFLASH_Write总是写入失败

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

  40. 1 H- i: [! |7 s& u, d2 i# E
复制代码
7 U  S' @+ b2 s, F8 v5 U' H- G# \
赞 收藏 评论0 发布时间:2022-4-21 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版