本文主要是介绍stm32 各种类型错误:HardFault_Handler、MemManage_Handler、BusFault_Handler、UsageFault_Handler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STM32出现HardFault_Handler故障的原因主要有两个方面:
1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。
2、堆栈溢出。增加堆栈的大小。
MemManage_Handler:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。
BusFault_Handler:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生 BusFault。
UsageFault_Handler:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除数为0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置:
SCB->CCR |= 0x18; // 开启除数为0和内存未对齐错误中断
HardFault_Handler:在调试程序过程中,这种异常最常见。上面三种异常发生任何一种异常都会引起HardFault,在上面的三种异常未使能的情况下,默认发生异常时进入HardFault中断服务程序。使能前三种异常也要在初始化时配置:
SCB->SHCSR |= 0x00007000; // enable Usage Fault, Bus Fault, and MMU Fault
在默认复位初始化时,HardFault使能,其它三者不使能,因此当程序中出现不合法内存访问(一般是指针错误引起)或非法的程序行为(一般就是数学里面常见的除0)时都将产生HardFault中断。
这篇关于stm32 各种类型错误:HardFault_Handler、MemManage_Handler、BusFault_Handler、UsageFault_Handler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!