本文主要介紹怎么用RT-Thread Nano的消息隊列方式實現(xiàn)串口數(shù)據(jù)接收,結合串口接收中斷和空閑中斷,接收上位機發(fā)來的一幀數(shù)據(jù)。
一、準備工作
1.硬件準備:
STM32F103RCT6(本人使用正點原子的MINI板)
ST-LINK
USB轉(zhuǎn)TTL模塊
2.軟件準備:
KEIL5 MDK
STM32CubeMX
二、使用STM32CubeMX生成MDK工程
使用STM32CubeMX創(chuàng)建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初始化函數(shù)使用自動初始化的宏添加到RTT中進行初始化,當然你也可以直接在main.c調(diào)用初始化,看個人習慣。
2.新建一個usart_test文件,在里面編寫串口接收的相關的代碼,創(chuàng)建串口接收線程、消息隊列,并使用MSH_CMD_EXPORT()將函數(shù)注冊到FinSH中。
3.USART線程
從消息隊列中將接收到的數(shù)據(jù)發(fā)送到上位機。
4.USART中斷服務函數(shù)
函數(shù)分為兩個部分,我們前面開啟了兩個USART中斷,接收中斷與空閑中斷,分別對接收到的數(shù)據(jù)做不同處理,接收中斷將數(shù)據(jù)存入recv_buf,空閑中斷等待上位機數(shù)據(jù)發(fā)送結束后觸發(fā),往recv_buf中插入結束字符,并將接收到的數(shù)據(jù)插入到消息隊列。
void HAL_UART_RxCallback(UART_HandleTypeDef*huart)
{
/* 判斷是哪個串口觸發(fā)的中斷 */
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;
/* 判斷是哪個串口觸發(fā)的中斷 */
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);
}
四、下載驗證
使用串口助手發(fā)送一個字符串到MCU,MCU將收到的內(nèi)容返回到串口助手,完成一次數(shù)據(jù)收發(fā)流程。
五、小知識點
1.串口空閑中斷產(chǎn)生條件
當接收數(shù)據(jù)后出現(xiàn)一個byte的高電平(空閑)狀態(tài),就會觸發(fā)空閑中斷。并不是空閑就會一直中斷,準確的說應該是上升沿(停止位)后一個byte,如果一直是低電平是不會觸發(fā)空閑中斷的(會觸發(fā)break中斷)。經(jīng)常在接收不定長的數(shù)據(jù)時與DMA配合使用。
2.中斷清除方式
STM32固件庫,USART_ClearITPendingBit( USARTx, USART_IT_IDLE )是不能清除中斷的,需要再讀取USARTx->DR寄存器的值才能清除。
HAL庫,使用__HAL_UART_CLEAR_IDLEFLAG(&huartx)即可清除中斷。
好啦,關于RTT串口的使用就講解到這里,大家有什么不懂的地方可后臺留言。
-
中斷
+關注
關注
5文章
904瀏覽量
42528 -
串口
+關注
關注
14文章
1586瀏覽量
78689 -
RT-Thread
+關注
關注
32文章
1371瀏覽量
41530 -
stm32cubemx
+關注
關注
5文章
286瀏覽量
15983 -
消息隊列
+關注
關注
0文章
33瀏覽量
3085
發(fā)布評論請先 登錄
RT-Thread最新推出Nano極簡版
從安裝到使用,RT-Thread Nano最全教程看完不信你還不會使用

i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)
RT-Thread Nano入門:獨立看門狗(IWDT)

【已結束】【每日一練】RT-Thread Nano入門全套教程,名師帶路,不走彎路
在 RT-Thread Studio 上使用 RT-Thread Nano
【每日一練】RT-Thread Nano-外部中斷(消息隊列使用)1(第十一節(jié)學習視頻)
【每日一練】RT-Thread Nano-外部中斷(消息隊列使用)2(第十二節(jié)學習視頻)
【每日一練】RT-Thread Nano-動態(tài)創(chuàng)建線程代碼修整(第十三節(jié)學習視頻)
【每日一練】RT-Thread Nano-通用定時器(按鍵消抖)-消息隊列(第十四節(jié)學習視頻)
RT-Thread Nano的相關資料下載
基于 Keil MDK 移植 RT-Thread Nano

如何創(chuàng)建RT-Thread Nano工程
玩轉(zhuǎn)RT-Thread之消息隊列的應用

評論