请选择 进入手机版 | 继续访问电脑版

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

【经验分享】STM32H7系列FLASH出现HardFault的问题

[复制链接]
STMCU小助手 发布时间:2021-12-24 19:00
一、问题描述5 U4 e  V% m) X

8 g. t: r: `( T8 c/ c        在使用STM32内部FLASH时,发现有一次在读FLASH内容时直接就进入了HardFault,因为读内部FLASH是直接操作的内存,很简单的一句话,怎么也想不通是什么原因导致的。" a0 x# d8 O: O; N

6 ?6 H  u, w* B& F* Z. |        然后调试模式下,用Keil直接看存储器的值,发现不是全A就是?号,这就确定应该是FLASH出了问题,然后擦除出问题的扇区就发现读取不会在进HardFault的。
* ^$ [! m! }% R1 |
5 S. H5 {$ v7 K! F        通过读STM32H7的手册发现,H7系列和其他系列的FLASH不同,增加了ECC校验的功能,同时有状态寄存器会报一些错误,然后调试模式看状态寄存器,果然有错误,应该是在掉电时擦写FLASH,导致ECC校验出错。
- K% }+ Y" G/ J6 I- L; Y3 J) A: R0 L7 e. ~% K
二、处理
2 y* d' N/ c3 G" h; _5 z/ R: {" R
  B$ Q% q& V) M1 `* P* v. D1.打开FLASH的中断,记住一定要解锁,否则不生效,这块就困扰了很久,最后发现是没有解锁导致的。
7 q7 S. r( n! H* }6 S' a$ P9 W$ {1 ]" p* V4 b5 O
  1.     HAL_FLASH_Unlock();             //解锁
    ' K2 @+ L% |3 {( c2 X7 i6 {5 V! \0 k
  2.     __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_ALL_BANK2);
    * t9 j: q# Y! m7 d3 b
  3.     HAL_NVIC_SetPriority(FLASH_IRQn,0,0);+ s4 ?8 q2 t+ F
  4.     HAL_NVIC_EnableIRQ(FLASH_IRQn);
    . Y) |6 ?4 L# n/ [
  5.     HAL_FLASH_Lock();           //上锁
复制代码

% ?3 a; d: O& e% M
' i5 U$ p& H; x2.中断里擦除掉出错的扇区
1 ]9 p6 j2 C* n
$ q2 z8 E5 N! o5 s# F$ m; pFLASH_ErrorPro();是我自己写的出错处理,里面就是擦除出错扇区的处理,读取的哪个扇区地址出错了,就记录下对应的地址,然后中断里擦除即可。因为断电导致FLASH编程未完成,保留里面的数据意义也不大,所以擦掉即可。- g$ W! s3 X8 t9 L# j
+ |# |) g( j3 B4 x3 |
  1. void FLASH_IRQHandler(void)
    * J& m( m: d6 x& L; @4 q; s! w- L
  2. {
    0 u5 o2 R6 Q2 Q
  3.       HAL_FLASH_IRQHandler();
    5 T/ O( {  j* F2 O! ?4 c) b
  4.         FLASH_ErrorPro();
    ( H3 \* q7 ~) }! p0 H5 J8 J
  5. }
复制代码

/ y; S  U; g! p, n- [- V
! K& D8 N0 ^& h9 B- R5 n; g* Y# ^6 C/ X
收藏 评论0 发布时间:2021-12-24 19:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版