本文主要介绍怎么用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串口的使用就讲解到这里,大家有什么不懂的地方可后台留言。
全部0条评论
快来发表一下你的评论吧 !