STM32F0xx HAL 库使用问题记录

1. SPI 数据收发函数HAL_SPI_xxx传入传出 buf 指针地址必需16位对齐

例如,SPI收发数据函数HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
pTxData和pRxData,必需16位对齐,若不能保证16位对齐,可以在调用SPI收发函数之情,申请两个16位对齐的buf替代原有的buf进行SPI收发数据,示例如下:

HAL_StatusTypeDef spiTxRx(const uint8_t *txData, uint8_t *rxData, uint16_t length)
{
    HAL_StatusTypeDef ret;
    
    /* txbuf, rxbuf 地址是16位对齐的,可作为SPI收发函数的参数 */
    uint8_t txbuf[255];
    uint8_t rxbuf[255];
    
    /* 将SPI要发送的数据拷贝到txbuf */
    if(txData != NULL) {
        memcpy(rxbuf, txData, length);
    }
    
    /* 使用txbuf和rxbuf进行SPI数据收发 */
    ret = HAL_SPI_TransmitReceive(hspi, txbuf, rxbuf, length, Timeout);

    /* 将SPI接收的数据拷回rxData */
    if(rxData != NULL) {
        memcpy(rxData, rxbuf, length);
    }
    
    return ret;
}

2. 使用HAL库提供的串口接收中断处理函数,需要在中断处理中再次调用HAL_UART_Receive_IT使能串口接收中断,此函数调用可能会失败,导致串口接收中断未使能,无法通过串口接收中断接收数据

HAL库提供的串口接收中断API使用方法:

  1. 中断处理程序中调用HAL_UART_IRQHandler,此函数中会除能串口接收中断、调用HAL_UART_RxCpltCallback
  2. 实现HAL_UART_RxCpltCallback,在此函数中接收串口数据,并再次调用HAL_UART_Receive_IT使能串口接收中断,此时可能会失败,导致不能再次进入串口接收中断。

解决方法:不使用HAL提供的处理函数,中断处理程序中直接判断中断标志位接收数据,并清除中断标志。

猜你喜欢

转载自www.cnblogs.com/chenbeibei/p/11404296.html
今日推荐