stm32 程序跑死

使用官方的HAL库文件出现一个问题,死循环之后的代码会影响死循环的执行是否成功,非常奇怪!

把DFP文件复制出来,然后点灯发现无法闪烁,程序不定时跑死,发现问题是缺少it中断文件;

从.s启动的汇编文件中发现如下中断表,

但是我并没有走中断,为啥会跑进中断挂死?

led_okay()函数是一个死循环,在main中,在此函数之后加上lcd_init()会导致led_okay()不工作,led灯无法闪烁,而删除lcd_init()之后,led可以正常工作;

起初猜想加上lcd_init()之后led_okay()所在.c文件由于被编译时靠后,而ram大小没有调整导致代码丢失,引起这种奇怪的问题;

对照手册发现ram大小没有问题;对照例程,发现缺少it文件,少了irq函数的定义;但是在led_okay()执行之前并没有进入中断的流程,且加上it文件之后,并不应该影响led_okay()的执行;

此问题记下,日后再看;

### STM32 堆栈溢出导致程序飞的解决方案 当STM32程序由于堆栈溢出而导致飞时,可以采取多种措施来诊断和解决问题。以下是详细的解决方案: #### 1. 调整堆栈大小 如果应用程序使用的函数调用层次较深或局部变量较多,则可能导致堆栈空间不足。可以通过调整堆栈大小来缓解这一问题。对于大多数STM32项目,在启动文件(如`startup_stm32f4xx.s`)中定义了初始堆栈指针的位置以及默认堆栈大小。 ```c /* Stack Configuration */ __attribute__((section(".stack"))) unsigned long stack_top[0x400]; /* Adjust size as needed */ ``` 通过增加数组长度即可增大堆栈区域[^1]。 #### 2. 使用硬件看门狗防止无限循环 为了确保即使发生异常也能恢复系统工作状态,建议启用硬件看门狗定时器(WDG)功能。一旦检测到长时间未喂狗的情况就会触发复位操作,从而避免程序陷入循环无法自拔的状态。 ```c void MX_WWDG_Init(void){ WWDG_HandleTypeDef hwwdg; hwwdg.Instance = WWDG; hwwdg.Init.Window = 64; // Set window value here. hwwdg.Init.Counter = 63; // Initial counter value must be less than Window Value. hwwdg.Init.EWIVersion = WWDG_EWI_VERSION_V2; if (HAL_WWDG_Init(&hwwdg) != HAL_OK){ Error_Handler(); } } ``` #### 3. 启用中断向量表重定位保护机制 某些情况下,错误的操作可能会覆盖掉中断向量表中的数据,进而造成不可预测的行为。为此可以在初始化阶段设置SCB->VTOR寄存器指向正确的地址,并开启相应的保护选项以阻止非法访问修改该区域的内容。 ```c SCB->VTOR = FLASH_BASE | ((uint32_t)VectTabOffset & 0x1FFFFF80); NVIC_SetVectorTable(NVIC_VECTTAB_FLASH, VectTabOffset); // Enable VTOR write protection after setting up vector table location SET_BIT(SCB->CCR, SCB_CCR_STKALIGN_Msk|SCB_CCR_BFHFNMIGN_Msk); ``` #### 4. 检查并优化代码逻辑结构 仔细审查源码是否存在潜在的风险点,比如递归调用过深、动态内存分配不当等问题都容易引发此类故障。必要时可借助专业的调试工具链来进行静态分析找出隐患所在之处加以改进[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值