PS:(修改堆栈空间解决写入FLASH时程序卡死)!!!
最近用STM32F429做智能家居项目,在使用SPI读写W25Q128保存智能门锁的密码时,发现写入FLASH时程序卡死。
问题分析:
1、在写入保存密码的时候,发现printf("num=%d\n\r",key_pwd[i]);这段始终无法输出到上位机,于是我想到应该是FLASH读写出现问题了,首先我把sf_WriteBuffer注释掉,发现串口打印信息正常,于是我把问题锁定到了sf_WriteBuffer这个写入FLASH函数上。
2、因此我将sf_WriteBuffer函数放在主函数开头,烧写程序进行测试
不出所料,串口只打印了第一句,第二句“初始化成功”并没有打印出来。因此可以确定程序执行到sf_WriteBuffer的时候卡死了。
解决过程:
1、设置断点,准备调试
先在主函数设置一个断点
由于sf_WriteBuffer中通过调用sf_AutoWritePage函数进行FLASH写入。所以在sf_AutoWritePage继续设置断点。
2、使用DAP进行调试。
(1)第一步
(2)第二步,进入sf_AutoWritePage函数
(3)第三步,执行到sf_PageWrite前
(4)第四步,继续执行Run,发现程序出现卡死
(5)停止调试stop,发现程序停止在HardFault_Handler异常处理中断中
3、由于STM32出现HardFault_Handler故障的原因主要有两个方面:
(1)内存溢出或者访问越界。
(2)堆栈溢出。
因此可以判断出可能是堆栈大小不够,发生溢出了
4、到启动文件中,将堆区和栈区空间都改大(如果文件写保护,先通过修改文件属性解锁)
从栈区从0x00000400改为0x00004000,堆区从0x00000200改为0x00002000
5、修改完毕后重新烧写程序进行调试
成功执行到while循环,串口打印成功,卡死问题解决!!
6、将密码存储进FLASH
读取flash成功,数据存储正常
参考资料:
1、[STM32]KEIL调试程序进入HardFault_Handler异常处理总结
[STM32]KEIL调试程序进入HardFault_Handler异常处理总结_21ic电子工程师的博客-CSDN博客
2、STM32 堆栈大小的设置及分析