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提供的處理函數,中斷處理程序中直接判斷中斷標志位接收數據,並清除中斷標志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM