操作内部FLASH导致进入HardFault
在做IAP升级程序的时候有段程序一执行就会跳入到HardFault_Handler中,求各位大神支个招,产生错误的代码如下:是不是地址访问的问题? 如果 tempaddr 如果不能被4整除,还强制uint32_t*访问的话会出硬件异常。 本帖最后由 moyanming2013 于 2017-1-18 12:27 编辑
count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不该访问的地址,进而产生HardFault异常。
moyanming2013 发表于 2017-1-18 12:26
count如果是uint8,其值最大是255,那么永远也出不来for循环。
然后,tempaddr就会越位了。越位后访问了不 ...
是UINT32_T 你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个寄存器来确定出错的原因。如果是Cortex-M0,那么查看一下反汇编,看看执行的是什么指令。 需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生 zoomdy 发表于 2017-1-18 12:43
你这个是什么核心的,如果是Cortex-M3及以上,可以查看SCB->CFSR, SCB->HFSR, SCB->MMFAR, SCB->BFAR这几个 ...
STM32F051M0内核的 Dylan疾风闪电 发表于 2017-1-18 12:44
需要限定 tempaddr 的取值范围,否则可能 读取 不存在/或者 其它异常的地址,导致错误发生 ...
地址在上层函数中已经限定,这个子函数只管编程1Kb的内部flash,基本流程是先看看这1K的空间是否被写过,没写过直接编程,写过就先擦除再编程 海迹天涯 发表于 2017-1-18 12:31
是UINT32_T
内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。 moyanming2013 发表于 2017-1-18 14:25
内部flash能这样直接读?不考虑总线时间吗?!
你可以一次性的读到一个内存中,然后在内存中再判断。 ...
太占内存了,数据很大的,1024个字节 海迹天涯 发表于 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