RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread Nano入門:串口接收與消息隊(duì)列

CHANBAEK ? 來源:MrZhou的技術(shù)棧 ? 作者: zzx_mcu ? 2023-11-22 11:07 ? 次閱讀

本文主要介紹怎么用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í)慣。

image.png

2.新建一個(gè)usart_test文件,在里面編寫串口接收的相關(guān)的代碼,創(chuàng)建串口接收線程、消息隊(duì)列,并使用MSH_CMD_EXPORT()將函數(shù)注冊(cè)到FinSH中。

image.png

3.USART線程

從消息隊(duì)列中將接收到的數(shù)據(jù)發(fā)送到上位機(jī)。

image.png

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)留言。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 中斷
    +關(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread最新推出Nano極簡(jiǎn)版

    RT-Thread適時(shí)推出第一個(gè)RT-Thread Nano極簡(jiǎn)版,適用于家電、消費(fèi)電子、醫(yī)療設(shè)備、工控等領(lǐng)域大量使用的32位ARM入門級(jí)MCU的場(chǎng)合,支持多任務(wù)處理、信號(hào)量和郵箱等相
    發(fā)表于 07-31 11:35 ?5362次閱讀

    從安裝到使用,RT-Thread Nano最全教程看完不信你還不會(huì)使用

    RT-Thread Nano發(fā)布以來,小編收到不少開發(fā)者詢問RT-Thread Nano的配套教程實(shí)例,幸得RT-Thread開發(fā)者燕十三
    的頭像 發(fā)表于 09-26 06:39 ?5.7w次閱讀
    從安裝到使用,<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>最全教程看完不信你還不會(huì)使用

    i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)

    上篇介紹了如何移植 RT-Thread Nano 內(nèi)核與 Finsh 控制臺(tái)到 RT1170。本篇繼續(xù)介紹如何將 NXP 官方的 VGLite API 移植到 RT-Thread
    的頭像 發(fā)表于 11-09 11:22 ?927次閱讀

    RT-Thread Nano入門:獨(dú)立看門狗(IWDT)

    本文主要介紹怎么用RT-Thread Nano實(shí)現(xiàn)獨(dú)立看門狗IWDT驅(qū)動(dòng),創(chuàng)建一個(gè)喂狗線程,實(shí)現(xiàn)定時(shí)喂狗功能。
    的頭像 發(fā)表于 11-22 11:04 ?2271次閱讀
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b><b class='flag-5'>入門</b>:獨(dú)立看門狗(IWDT)

    【已結(jié)束】【每日一練】RT-Thread Nano入門全套教程,名師帶路,不走彎路

    )打卡第九天:【每日一練】RT-Thread Nano-串口接收(信號(hào)量使用)編寫1(第九節(jié)學(xué)習(xí)視頻)打卡第十天:【每日一練】RT-Thread
    發(fā)表于 05-17 10:27

    RT-Thread Studio 上使用 RT-Thread Nano

    _hw_console_output() ,默認(rèn)可以進(jìn)行打印。打開串口終端,可以發(fā)現(xiàn)在終端中執(zhí)行了打印?;?Nano 添加 FinSH雙擊 RT-Thread Settings 進(jìn)入配置,打開組件,勾選 FinSH Shell
    發(fā)表于 05-18 15:59

    【每日一練】RT-Thread Nano-外部中斷(消息隊(duì)列使用)1(第十一節(jié)學(xué)習(xí)視頻)

    及MSH-EXPORT-1(第七節(jié)學(xué)習(xí)視頻)【每日一練】RT-Thread Nano-自動(dòng)初始化及MSH-EXPORT-2(第八節(jié)學(xué)習(xí)視頻)【每日一練】RT-Thread Nano-
    發(fā)表于 05-27 09:53

    【每日一練】RT-Thread Nano-外部中斷(消息隊(duì)列使用)2(第十二節(jié)學(xué)習(xí)視頻)

    )【每日一練】RT-Thread Nano-串口接收(信號(hào)量使用)編寫1(第九節(jié)學(xué)習(xí)視頻) 【每日一練】RT-Thread
    發(fā)表于 05-28 09:57

    【每日一練】RT-Thread Nano-動(dòng)態(tài)創(chuàng)建線程代碼修整(第十三節(jié)學(xué)習(xí)視頻)

    及MSH-EXPORT-2(第八節(jié)學(xué)習(xí)視頻)【每日一練】RT-Thread Nano-串口接收(信號(hào)量使用)編寫1(第九節(jié)學(xué)習(xí)視頻) 【每日一練】R
    發(fā)表于 05-29 08:00

    【每日一練】RT-Thread Nano-通用定時(shí)器(按鍵消抖)-消息隊(duì)列(第十四節(jié)學(xué)習(xí)視頻)

    (第九節(jié)學(xué)習(xí)視頻) 【每日一練】RT-Thread Nano-串口接收(信號(hào)量使用)調(diào)試2(第十節(jié)學(xué)習(xí)視頻)【每日一練】RT-Thread
    發(fā)表于 05-30 08:00

    RT-Thread Nano的相關(guān)資料下載

    RT-Thread Nano入門學(xué)習(xí)筆記作者:Linkk更新時(shí)間:2021.02.17學(xué)習(xí)過程中使用的芯片:stm32f103c8t6庫(kù)函數(shù):標(biāo)準(zhǔn)庫(kù)資料獲取RT-Thread官網(wǎng):ht
    發(fā)表于 12-09 06:59

    RT-Thread Nano入門學(xué)習(xí)筆記

    RT-Thread Nano入門學(xué)習(xí)筆記
    發(fā)表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b><b class='flag-5'>入門</b>學(xué)習(xí)筆記

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thread Nano 已集成在 Keil
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK 移植 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何創(chuàng)建RT-Thread Nano工程

    本文將嘗試使用國(guó)產(chǎn)的嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread,相比較于FreeRTOS,RT-Thread還是有很多有點(diǎn)的,比如有Fish命令行界面,國(guó)產(chǎn)開源免費(fèi),Nano版本代碼量極小,移植起來非常
    的頭像 發(fā)表于 03-19 12:13 ?3787次閱讀

    玩轉(zhuǎn)RT-Thread之消息隊(duì)列的應(yīng)用

    在嵌入式系統(tǒng)開發(fā)中,實(shí)時(shí)處理串口和ADC數(shù)據(jù)是一項(xiàng)重要的任務(wù)。本文將介紹如何在RT-Thread實(shí)時(shí)操作系統(tǒng)中,利用消息隊(duì)列來同時(shí)處理來自串口和ADC的數(shù)據(jù)。通過這種方法,我們能夠高效
    的頭像 發(fā)表于 07-23 08:11 ?608次閱讀
    玩轉(zhuǎn)<b class='flag-5'>RT-Thread</b>之消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用
    RM新时代网站-首页