本文主要介紹怎么用RT-Thread Nano的消息隊列方式實現串口數據接收,結合串口接收中斷和空閑中斷,接收上位機發來的一幀數據。
一、準備工作
1.硬件準備:
STM32F103RCT6(本人使用正點原子的MINI板)
ST-LINK
USB轉TTL模塊
2.軟件準備:
KEIL5 MDK
STM32CubeMX
二、使用STM32CubeMX生成MDK工程
使用STM32CubeMX創建STM32F103RCT6的對應工程,配置時鐘源,使能GPIO、USART,配置時鐘樹,開啟USART3中斷。
1.配置預覽效果,配置PA8引腳為推挽輸出,用于LED燈閃爍。
2.使能USART引腳,并開啟USART3中斷。
3.STM32F103RCT6的最大主頻為72M,配置PLL選擇外部時鐘。
4.生成KEIL MDK工程。
三、編寫代碼
對STM32CubeMX生成的工程稍作修改,注釋main.c中的HAL_Init()和SystemClock_Config()。
1.在STM32CubeMX生成的usart.c中添加以下兩句代碼,將USART初始化函數使用自動初始化的宏添加到RTT中進行初始化,當然你也可以直接在main.c調用初始化,看個人習慣。
2.新建一個usart_test文件,在里面編寫串口接收的相關的代碼,創建串口接收線程、消息隊列,并使用MSH_CMD_EXPORT()將函數注冊到FinSH中。
3.USART線程
從消息隊列中將接收到的數據發送到上位機。
4.USART中斷服務函數
函數分為兩個部分,我們前面開啟了兩個USART中斷,接收中斷與空閑中斷,分別對接收到的數據做不同處理,接收中斷將數據存入recv_buf,空閑中斷等待上位機數據發送結束后觸發,往recv_buf中插入結束字符,并將接收到的數據插入到消息隊列。
void HAL_UART_RxCallback(UART_HandleTypeDef*huart)
{
/* 判斷是哪個串口觸發的中斷 */
if(huart - >Instance == USART3)
{
if(HAL_UART_Receive(&huart3,&recByte,1,10)== HAL_OK)
{
recv_buf[usart_rx_pos++]= recByte;
}
}
}
void UART_IDLECallBack(UART_HandleTypeDef*huart)
{
int result;
/* 判斷是哪個串口觸發的中斷 */
if(huart - >Instance == USART3)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
recv_buf[usart_rx_pos]= '?';
result= rt_mq_send(mq, &recv_buf, sizeof(recv_buf));
if(result != RT_EOK)
{
rt_kprintf("rt_mq_sendERRn");
}
usart_rx_pos= 0;
}
}
/**
*@brief This function handles USART1 global interrupt.
*/
void USART3_IRQHandler(void)
{
/*USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_RXNE)!= RESET)
{
HAL_UART_RxCallback(&huart3);
}
if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE) != RESET)
{
UART_IDLECallBack(&huart3);
}
/*USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
}
四、下載驗證
使用串口助手發送一個字符串到MCU,MCU將收到的內容返回到串口助手,完成一次數據收發流程。
五、小知識點
1.串口空閑中斷產生條件
當接收數據后出現一個byte的高電平(空閑)狀態,就會觸發空閑中斷。并不是空閑就會一直中斷,準確的說應該是上升沿(停止位)后一個byte,如果一直是低電平是不會觸發空閑中斷的(會觸發break中斷)。經常在接收不定長的數據時與DMA配合使用。
2.中斷清除方式
STM32固件庫,USART_ClearITPendingBit( USARTx, USART_IT_IDLE )是不能清除中斷的,需要再讀取USARTx->DR寄存器的值才能清除。
HAL庫,使用__HAL_UART_CLEAR_IDLEFLAG(&huartx)即可清除中斷。
好啦,關于RTT串口的使用就講解到這里,大家有什么不懂的地方可后臺留言。
-
中斷
+關注
關注
5文章
900瀏覽量
41746 -
串口
+關注
關注
14文章
1557瀏覽量
77035 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40383 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15001 -
消息隊列
+關注
關注
0文章
33瀏覽量
3017
發布評論請先 登錄
相關推薦
評論