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提供的处理函数,中断处理程序中直接判断中断标志位接收数据,并清除中断标志。
原文地址:https://www.cnblogs.com/chenbeibei/p/11404296.html
时间: 2024-10-31 00:15:27