关于STM32 hal库SPI的一个BUG

本文介绍了在使用STM32 HAL库的SPI功能时遇到的一个bug,具体表现为调用HAL_SPI_TransmitReceive函数时可能会导致HardFault或调试卡死。通过分析,发现问题在于非字节对齐的指针导致。解决方案是将代码修改为字节对齐,或者在定义缓冲区时使用__align(4)进行4字节对齐,从而避免硬故障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体bug点在HAL_SPI_TransmitReceive这个函数里面。具体表现是莫名其妙会进入hardfault,但是,也不排除直接debug跑死没反应的情况。

因为在最初的时候,程序调试异常都是直接调试卡死。这其中的具体原因还没搞清楚。

既然是bug,那肯定是满足了一定条件下的错误。但是很遗憾,具体条件我没找到。但是解决方法找到了。

代码中这一段改成:

while((hspi->TxXferCount > 0) || (hspi->RxXferCount > 0))
    {
      /* check TXE flag */
      if((hspi->TxXferCount > 0) && ((hspi->Instance->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE))
      {
//        if(hspi->TxXferCount > 1)
//        {
//          hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr);
//          hspi->pTxBuffPtr += sizeof(uint16_t);
//          hspi->TxXferCount -= 2;
//        }
//        else
//        {
    
    
          *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr++);
          hspi->TxXferCount--;
//        }

        /* Enable CRC Transmission */
        if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值