0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread Nano入门:串口接收与消息队列

CHANBAEK 来源:MrZhou的技术栈 作者: zzx_mcu 2023-11-22 11:07 次阅读

本文主要介绍怎么用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调用初始化,看个人习惯。

image.png

2.新建一个usart_test文件,在里面编写串口接收的相关的代码,创建串口接收线程、消息队列,并使用MSH_CMD_EXPORT()将函数注册到FinSH中。

image.png

3.USART线程

从消息队列中将接收到的数据发送到上位机。

image.png

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

    文章

    884

    浏览量

    41023
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74511
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38869
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
  • 消息队列
    +关注

    关注

    0

    文章

    31

    浏览量

    2921
收藏 人收藏

    评论

    相关推荐

    RT-Thread最新推出Nano极简版

    RT-Thread适时推出第一个RT-Thread Nano极简版,适用于家电、消费电子、医疗设备、工控等领域大量使用的32位ARM入门级MCU的场合,支持多任务处理、信号量和邮箱等相
    发表于 07-31 11:35 5169次阅读

    RT-Thread Nano 简介

    RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括
    发表于 05-14 10:22

    【已结束】【每日一练】RT-Thread Nano入门全套教程,名师带路,不走弯路

    )打卡第九天:【每日一练】RT-Thread Nano-串口接收(信号量使用)编写1(第九节学习视频)打卡第十天:【每日一练】RT-Thread
    发表于 05-17 10:27

    RT-Thread Studio 上使用 RT-Thread Nano

    _hw_console_output() ,默认可以进行打印。打开串口终端,可以发现在终端中执行了打印。基于 Nano 添加 FinSH双击 RT-Thread Settings 进入配置,打开组件,勾选 FinSH Shell
    发表于 05-18 15:59

    【每日一练】RT-Thread Nano-外部中断(消息队列使用)1(第十一节学习视频)

    及MSH-EXPORT-1(第七节学习视频)【每日一练】RT-Thread Nano-自动初始化及MSH-EXPORT-2(第八节学习视频)【每日一练】RT-Thread Nano-
    发表于 05-27 09:53

    【每日一练】RT-Thread Nano-外部中断(消息队列使用)2(第十二节学习视频)

    )【每日一练】RT-Thread Nano-串口接收(信号量使用)编写1(第九节学习视频) 【每日一练】RT-Thread
    发表于 05-28 09:57

    【每日一练】RT-Thread Nano-动态创建线程代码修整(第十三节学习视频)

    及MSH-EXPORT-2(第八节学习视频)【每日一练】RT-Thread Nano-串口接收(信号量使用)编写1(第九节学习视频) 【每日一练】R
    发表于 05-29 08:00

    【每日一练】RT-Thread Nano-通用定时器(按键消抖)-消息队列(第十四节学习视频)

    (第九节学习视频) 【每日一练】RT-Thread Nano-串口接收(信号量使用)调试2(第十节学习视频)【每日一练】RT-Thread
    发表于 05-30 08:00

    【每日一练】RT-Thread Nano-ADC(时钟管理之软件定时器)-3软件定时器内核代码分析(第十七节学习视频)

    -串口接收(信号量使用)调试2(第十节学习视频)【每日一练】RT-Thread Nano-外部中断(消息队列使用)1(第十一节学习视频)【每
    发表于 06-02 10:32

    【每日一练】RT-Thread Nano-NTP-获取网络时间(第二十三节学习视频)

    RT-Thread Nano-串口接收(信号量使用)调试2(第十节学习视频)【每日一练】RT-Thread
    发表于 06-08 10:47

    【每日一练】RT-Thread Nano-CJSON-心知天气获取(第二十四节学习视频)

    RT-Thread Nano-串口接收(信号量使用)调试2(第十节学习视频)【每日一练】RT-Thread
    发表于 06-09 10:06

    RT-Thread Nano的相关资料下载

    RT-Thread Nano入门学习笔记作者:Linkk更新时间:2021.02.17学习过程中使用的芯片:stm32f103c8t6库函数:标准库资料获取RT-Thread官网:ht
    发表于 12-09 06:59

    RT-Thread Nano入门学习笔记

    RT-Thread Nano入门学习笔记
    发表于 11-26 12:36 20次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b><b class='flag-5'>入门</b>学习笔记

    基于 Keil MDK 移植 RT-Thread Nano

    本文介绍如何基于 Keil MDK 移植 RT-Thread Nano ,并以一个 stm32f103 的基础工程作为示例进行讲解。 RT-Thread Nano 已集成在 Keil
    发表于 01-26 17:04 16次下载
    基于 Keil MDK 移植 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何创建RT-Thread Nano工程

    本文将尝试使用国产的嵌入式实时操作系统RT-Thread,相比较于FreeRTOS,RT-Thread还是有很多有点的,比如有Fish命令行界面,国产开源免费,Nano版本代码量极小,移植起来非常
    的头像 发表于 03-19 12:13 3287次阅读