之前用hal庫的時候都是用一些簡單的,例如初始化一個IO用作LED指示,今天寫的代碼需要串口的例子,說真的看了官方的demo也沒看出啥名堂,反而覺得用hal寫串口驅動太麻煩了.
回顧下之前常見的串口寫法,發送用的是阻塞式發送,一般都是發送一些調試信息,接收肯定用的是中斷;
為了編程的方便,發送一般是跟printf綁定的,但是對于hal庫這些我們又怎么來編寫呢?
接下來我把我剛剛學習到的東西分享下,如果有錯誤請指教。
我的開發板是STM32F746G-DISCO,參考的是UART_TwoBoards_ComIT例子。
首先我們看看中斷發送的例子:
/* Buffer used for transmission */
uint8_t aTxBuffer[] = "****UART_TwoBoards_ComIT****\r\n";
/* Buffer used for reception */
uint8_t aRxBuffer[RXBUFFERSIZE];
if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
{
Error_Handler();
}
發送就是aTxBuffer里的數據通過中斷方式發送出去,因此這條語句是非阻塞式的,當發送完成后會回調
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle);
接下來我們把改成使用printf的來發送;
① 在main.c里添加
#include
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) //MDK
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Loop until the end of transmission */
while(__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) == RESET);
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
UartHandle.Instance->TDR = (uint8_t) ch;
return ch;
}
然后在串口初始化完畢后就可以調用printf語句試試了
printf("my printf test,compile time:%s %s\r\n",__DATE__,__TIME__);
本人特別喜歡用printf來調試,推薦使用115200波特率;
再說說接中斷框架,先看源碼:
int main()
{
//串口初始化
if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
{
Error_Handler();
}
while(1) //單片機的大循環
{
if(UartReady == SET)
{
UartReady =RESET;
//添加你的處理代碼...
HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE);//再次打開中斷接收代碼
}
//其他代碼...
}
}
/**
* @brief Rx Transfer completed callback
* @param UartHandle: UART handle
* @note This example shows a simple way to report end of DMA Rx transfer, and
* you can add your own implementation.
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
UartReady = SET;
printf("HAL_UART_RxCpltCallback\r\n");
}
HAL庫的中斷接收效率很低,而且還很死板,必須接收指定字節才能回調接收完成函數,那能不能改成超時后再回調接收完成函數呢?當然是可以的,并且我已經改出來了,思路簡單提下,在鉤子函數里加個軟件定時器,從接收到第一個字符開始倒計時,超過一定時間就調用接收回調函數,這里有個注意地方就是接收的時候接收指針千萬不要溢出了!!!
上一篇:STM32F4的HAL庫開啟串口空閑中斷
下一篇:stm32f7 HAL庫 串口重定向 使用printf
推薦閱讀
史海拾趣