STM32:SPI读写W25Q128写入数据卡死解决办法

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 堆栈大小的设置及分析

STM32 堆栈大小的设置及分析_stm32堆栈空间大小设置_城南花已开..的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹烟淮雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值