STM32H7 HAL库错误内容!!!

stm32H7 hal库错误内容汇总:

1. I2S

HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
函数内部有一个判断
if (hi2s->State == HAL_I2S_STATE_READY)  {
    __HAL_UNLOCK(hi2s);
    return  HAL_BUSY;
  }
函数
   HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
{
  if (hi2s->State == HAL_I2S_STATE_READY)
  {
    __HAL_UNLOCK(hi2s);
    return  HAL_BUSY;
  }
  中同样有

应该改为:

if (hi2s->State != HAL_I2S_STATE_READY)

2.寄存器定义

我用的HAL库版本为V1.2.0;
其中Device中的STM32H743XX.h中寄存器定义错误。

#define SPI_I2SCFGR_WSINV_Pos       (12U)                                      
#define SPI_I2SCFGR_WSINV_Msk       (0x1U << SPI_I2SCFGR_WSINV_Pos)            /*!< 0x00001000 */
#define SPI_I2SCFGR_WSINV           SPI_I2SCFGR_WSINV_Msk                      /*!<Word select inversion                             */
#define SPI_I2SCFGR_FIXCH_Pos       (13U)                                      
#define SPI_I2SCFGR_FIXCH_Msk       (0x1U << SPI_I2SCFGR_FIXCH_Pos)            /*!< 0x00002000 */
#define SPI_I2SCFGR_FIXCH           SPI_I2SCFGR_FIXCH_Msk                      /*!<Fixed channel length in SLAVE                     */
#define SPI_I2SCFGR_DATFMT_Pos      (12U)                                      
#define SPI_I2SCFGR_DATFMT_Msk      (0x3U << SPI_I2SCFGR_DATFMT_Pos)           /*!< 0x00003000 */
#define SPI_I2SCFGR_DATFMT          SPI_I2SCFGR_DATFMT_Msk                     /*!<Data format   

在这里插入图片描述
跟寄存器定义不同。

所以最好使用新的固件库,但项目之前用的旧固件库,并且没有用到I2s。

  1. 还是关于I2S的坑,这次使用的HAL库版本是在官网下载的最新版本
    FW_H7_V1.5.0.在使用全双工I2S时,需要包含
    stm32h7xx_hal_i2s_ex.h 头文件
    但是在这里插入图片描述
    图中宏定义根本找不到 ,自己添加宏定义后一堆错误 我也是服了。
    有了SAI就对I2S这么不上心吗?

3.USB device卡死在HAL_PCD_IRQHandler中导致主程序无法运行

但并未出现错误
调试发现
程序一直进USB_OTG_DIEPINT_TXFE 即TX FIFO 为空中断
既然如TX FIFO 后 正常逻辑需要往TX FIFO 中填充数据 测试发现并没有,
发现 (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) 刚好等于len32b导致条件不满足
又一直进FIFO为空中断 一直在中断中运行 形成死机现象
对比 HAL库1.5.0发现此处已更改为>=
更改后不会死机 但是 USB连接不上时仍需重启
库文件原代码 此BUG在F4驱动库中也存在 已更改
PCD_WriteEmptyTxFifo 函数

static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
{
  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;  
  USB_OTG_EPTypeDef *ep = NULL;
  int32_t len = 0U;
  uint32_t len32b = 0U;
  uint32_t fifoemptymsk = 0U;

  ep = &hpcd->IN_ep[epnum];
  len = ep->xfer_len - ep->xfer_count;
  
  if (len > ep->maxpacket)
  {
    len = ep->maxpacket;
  }
  
  
  len32b = (len + 3) / 4;

  while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
          ep->xfer_count < ep->xfer_len &&
            ep->xfer_len != 0)
  {
    /* Write the FIFO */
    len = ep->xfer_len - ep->xfer_count;
    
    if (len > ep->maxpacket)
    {
      len = ep->maxpacket;
    }
    len32b = (len + 3) / 4;
    
    USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable); 
    
    ep->xfer_buff  += len;
    ep->xfer_count += len;
  }
  
  if(len <= 0)
  {
    fifoemptymsk = 0x1 << epnum;
    USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
    
  }
  
  return HAL_OK;  
}

需要更改为

	  while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&
			  ep->xfer_count < ep->xfer_len &&
				ep->xfer_len != 0)

不然会一直进中断但又出不来

总结: 能用最新的HAL库就用最新的吧 可以避免很多坑

实在不行可以结合寄存器版本的函数来写,直接写寄存器还是比较靠谱,但是要参照HAL的流程

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值