本文主要介紹怎么用RT-Thread Nano的消息隊(duì)列方式實(shí)現(xiàn)串口數(shù)據(jù)接收,結(jié)合串口接收中斷和空閑中斷,接收上位機(jī)發(fā)來的一幀數(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)確的說應(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文章
898瀏覽量
41470 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40081 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14791 -
消息隊(duì)列
+關(guān)注
關(guān)注
0文章
33瀏覽量
2972
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論