海迹天涯 发表于 2017-1-18 11:58:49

操作内部FLASH导致进入HardFault

在做IAP升级程序的时候有段程序一执行就会跳入到HardFault_Handler中,求各位大神支个招,产生错误的代码如下:

迷雾向前 发表于 2017-1-20 11:29:13

是不是地址访问的问题? 如果 tempaddr 如果不能被4整除,还强制uint32_t*访问的话会出硬件异常。

moyanming2013 发表于 2017-1-18 12:26:23

本帖最后由 moyanming2013 于 2017-1-18 12:27 编辑

count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不该访问的地址,进而产生HardFault异常。

海迹天涯 发表于 2017-1-18 12:31:04

moyanming2013 发表于 2017-1-18 12:26
count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不 ...

是UINT32_T

zoomdy 发表于 2017-1-18 12:43:39

你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个寄存器来确定出错的原因。如果是Cortex-M0,那么查看一下反汇编,看看执行的是什么指令。

Dylan疾风闪电 发表于 2017-1-18 12:44:37

需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生

海迹天涯 发表于 2017-1-18 13:36:02

zoomdy 发表于 2017-1-18 12:43
你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个 ...

STM32F051M0内核的

海迹天涯 发表于 2017-1-18 13:38:05

Dylan疾风闪电 发表于 2017-1-18 12:44
需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生 ...

地址在上层函数中已经限定,这个子函数只管编程1Kb的内部flash,基本流程是先看看这1K的空间是否被写过,没写过直接编程,写过就先擦除再编程

moyanming2013 发表于 2017-1-18 14:25:30

海迹天涯 发表于 2017-1-18 12:31
是UINT32_T

内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。

海迹天涯 发表于 2017-1-18 15:12:32

moyanming2013 发表于 2017-1-18 14:25
内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。 ...

太占内存了,数据很大的,1024个字节

Dylan疾风闪电 发表于 2017-1-19 19:24:38

海迹天涯 发表于 2017-1-18 13:38
地址在上层函数中已经限定,这个子函数只管编程1Kb的内部flash,基本流程是先看看这1K的空间是否被写过, ...参考这样写:
for (i=0; i<len; i++)
      {
      if((*(volatile uint16_t*) (addr + (i<<1))) != pData)
          return FALSE;
      }
页: [1] 2
查看完整版本: 操作内部FLASH导致进入HardFault