在本论坛上下载了很多资料,对我帮助很大。平时项目很忙,没来写过文章,今天使用STM32F103C8T6做IAP时遇到了一个问题,每次下载完APP程序,一运行就进入HardFault_Handler。偶尔能正常运行,如果正常时,连续多次测试都正常。再用其它程序测试一运行就进入HardFault_Handler,再用这个测试好的程序试HardFault_Handler。更换新的STM32F103C8T6芯片,还是一样。修改程序在STM32F103VBT6上测试,一切正常(没有长时间测试)。根据多年编程经验,应该是个小问题,就是找不到原因,研究了4天,查阅很多资料,尝试了很多网友给的方法,都没能解决。但是给了我很大的启发,怀疑问题还是出在写Flash。
先说解决办法程序代码是在CSND下载的别人的程序,使用的是正点原子的程序模板,可是一运行就进入HardFault_Handler。相信大多数朋友用的都是这个模板。解决问题的方法很简单:看下图在第38行加入一条指令:FLASH_ErasePage(WriteAddr);即可。
期间查阅很多文档,比如IAP实现原理、HardFault定位步骤、STM32 写Flash进入HardFault_Handler,一次解决经验分享、用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法 等等,这些都是非常好的文章,解决问题的过程太长了,我就不啰嗦了。无奈都没有解决我的问题。
尝试多种方法:1、在主程序中擦除需要使用的扇区。2、在主程序中擦除FLASH_APP1_ADDR以后的全部扇区。都不行,而且程序在写入Flash时也做了检测,非空时都要先擦除,还是不行。在函数void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) 内执行擦除扇区,就可以,我也不知道到为什么。有知道的朋友可以告诉我。
在这里给大家一个提示:APP程序2kByte多,前1kB写入Flash每次都成功,后1kB多都是失败。在这里加入擦除扇区后,全部写入成功,程序正常使用。
如果该方法可以解决你的问题,请多多支持。