stm32程序跑飞的原因_stm32 程序进入hardfault原因分析实例

在STM32F030F4调试nRF24L01模块时,代码移植后接收端出现HardFault错误。问题定位在HAL_SPI_Transmit函数,由于非半字对齐的uint8_t数组转换为uint16_t进行操作,引发错误。解决方法包括调整数组长度以保证半字对齐,或者使用预编译对齐指令和__align属性确保数据对齐。
摘要由CSDN通过智能技术生成

用stm32F030F4调试nrf24l01模块,但是本来在其他地方运行好好的代码,移植过来却不行了,使用的是hal库,没办法出了问题还是要深入进去看HAL库内部的封装。

实验分为两块儿板子,一块儿作为发送,一块儿作为接收。经过各种交叉验证,可以测试出来发送端没问题,可是接收端一上电就挂掉了。调试之后发现是进入了hardfault错误。

而发送和接收都是公用的底层代码,为什么只有接收端进入hardfault,但是发送端却没有。只能一步步跟踪,最终定位在HAL库的SPI发送函数里面。

如下图所示,箭头所指地方,执行到这里一下就over了。

109335e6765797d1e0cf5e4e2ae3e7d7.png

看下这条语句,首先想到的进入hardfault的原因:是不是操作pData越界了?检查定义的buffer和要发送的数据长度没有问题,buffer长度为5,发送个数也为5。所以不存在这种情况。

那么还有什么可能?

先来看看我定义的发送数组,也就是pData指针所操作的缓冲区:

e5feb8ce83b51a87da2497f0b98f4ca4.png

TX_AD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值