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

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

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

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

評(píng)論