STM32F103程序运行正常,但在debug时进入HardFault_Handler是什么原因?

STM32F103程序运行正常,但在debug时进入HardFault_Handler是什么原因?,第1张

在硬件中断函数HardFault_Handler是

如果上电后, 在调试时, 执行单步, 会在不确定位歼晌置的地方产生HardFault_Handle, 检查一下时钟配置(外部晶振频率, SysTemInit/PLLConfig相关函数以及晶振频率宏定义)。

STM32出现硬氏闷锋件错误可能有以罩谈下原因:

(1)数组越界 *** 作;

(2)内存溢出,访问越界;

(3)堆栈溢出,程序跑飞;

(4)中断处理错误;

首先,你在 void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } 里面设置一个断点,看程序运槐兆行的时候会不会进去,进去则说正陆明你的程序逻辑上铅清租有问题,有可能是数组越界之类的错误

解决这个问题要涉及的方面就多了:

1、Cortex-M3程序结构的问题。

2、了解Cortex-M3启动流程。

3、Cortex-M3中断向量表问题。

4、用Flash写函数来烧写程序,烧写的应该是bin文件而不是hex文件。

直接跟你说最快最直接解决方法(我的IAR开发环境下的修改,不知道你是用Keil开发还是IAR开发,这里会有些区别):

1、先在B程序代码中修改中断向量表,修改方法,在main函数开始调用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3f000)来重新配置中断向量表。

2、在A程序里边,跳转部分进行如下 *** 作

__disable_irq()    //关闭全部兆差中断

__set_MSP(*(__IO uint32_t*) 0x0803f000)//因为要执行另外的程序,堆栈要重新初始化

((void (*) (void)) (*((vu32 *)(0x0803f000+4)))) ()    //最后进行程序跳转

3、因为程序A跳转的时候关闭了中断,在程序B里面各种初始化后要重新打开中断__enable_irq()

4、要将程序B编译生成的bin文件烧写,而不是hex文件。

5、忘了还有一拦猜稿点,修改程序B代码的起始位置,在IAR下的修改方式如下:

project->options,在linker栏目下有

点击选择固件库提供的配置文件stm32f10x_flash.icf,然后在工程下打开该文件,修改程序B的代码起始位置,做如下的修改

OK!编译生成bin文件烧写即简孝可。

你可以先试试,看能不能成再说,至于为什么这么改就需要去弄懂我上面提出的4个问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12521695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存