ARM处理器|关于STM32处理器的HardFault_Handler错误原因

STM32xx处理器是ST公司采用Cortex-M的IP核实现的处理器,拥有紧凑代码量以及非常高的性价比,在单片机领域占用量非常强劲。本人所在的公司甚至用STM32F207直接替代了一些使用S3C4510B处理器的场景,因为S3C4510B面临着停产的危险,为了产品过度平稳,STM32F处理器也是一种不错的选择,可以应用于一些简单的单板设备或者必须不需要大量存储和内存的情况,开发过程中也遇到了STM32F初学者经常会遇到的一个系统中断错误提示:HardFault_Handler。
HandFault_Handler错误原因在我使用碰到过的有3种情况:
(1) 堆栈空间溢出
【ARM处理器|关于STM32处理器的HardFault_Handler错误原因】堆栈空间溢出问题,主要是通过增大工程中类似startup_stm32f2xx.s文件中的宏定义Stack_Size和Heap_Size来修改此问题,至于项目工程中遇到大致的堆栈空间读者可以通过MDK在线调试查看或者读者自行分析下函数调用的深度来分析。
(2) 数据访问未对齐
数据未对齐访问一般是由于指针造成的。读者可以通过打印相应变量的地址看是否为4字节对齐,比如下面给出的例子,因为你不能保证performP->rxPkt[4]或者performP->rxPkt[0]的地址就是4的整数倍,如果强制进行unsigned int *转化访问,就会出现HardFault_Hander错误:
ARM处理器|关于STM32处理器的HardFault_Handler错误原因
文章图片


ARM处理器|关于STM32处理器的HardFault_Handler错误原因
文章图片
ARM处理器|关于STM32处理器的HardFault_Handler错误原因
文章图片


(3) 数组越界或者指针越界等非法访问。


后续如果有发现其他原因造成HardFault_Hander错误,欢迎自己和大家补充。多多益善。





    推荐阅读