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使用方法:
- 中斷處理程序中調用
HAL_UART_IRQHandler
,此函數中會除能串口接收中斷、調用HAL_UART_RxCpltCallback
。- 實現
HAL_UART_RxCpltCallback
,在此函數中接收串口數據,並再次調用HAL_UART_Receive_IT
使能串口接收中斷,此時可能會失敗,導致不能再次進入串口接收中斷。
解決方法:不使用HAL提供的處理函數,中斷處理程序中直接判斷中斷標志位接收數據,並清除中斷標志。