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

描述

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

中断

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

中断

3.USART线程

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

中断

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串口的使用就讲解到这里,大家有什么不懂的地方可后台留言。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分