【单片机】CH32V103串口IDLE空闲中断
2024-10-19 16:35:26
CH32V103c8t6 在寻找解决接收完数据后,怎么即时判断数据已经完成了接收。发现串口有一个IDLE空闲中断。如下图描述:
意思是在串口接收完一帧数据 会产生一个中断,此时程序可判断为数据已接收完毕。
测试例程如下:
一、串口初始化:
void User_USART_Init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* USART2 TX-->A.2 RX-->A.3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure); /*打开串口中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /*打开IDLE数据检测中断*/
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2, ENABLE);
USART_SetAddress(USART2, 0x1); }
二、串口中断程序
/*idle 数据检测中断测试*/
void USART2_IRQHandler(void)
{
uint16_t Clear = Clear; /*如果接收到一个字节*/
if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
{
USART_RX_BUF[RxCounter++]= USART_ReceiveData(USART2);
}
/*如果接收到一帧数据*/
else if(USART_GetITStatus(USART2, USART_IT_IDLE)!= RESET)
{
Clear = USART2->STATR;
Clear = USART2->DATAR; strcpy(UsartData,USART_RX_BUF); /*清空串口接收数组*/
memset(USART_RX_BUF, 0, sizeof (USART_RX_BUF));
/*重置接收数组指针*/
RxCounter = 0;
USART_RX_STA = 1; } }
三、测试接收效果:将收到数据原路发回
if(USART_RX_STA == 1)
{ USART_Send_String(USART2,UsartData);
memset(UsartData, 0, sizeof (UsartData));
USART_RX_STA = 0;
}
最新文章
- nginx 虚拟主机配置
- mysql基础用法
- loadrunner录制脚本方式笔记
- 变量声明提升 Vs. 函数声明提升
- 使用Excel制作万年历(可打印)
- StreamReader和StreamWrite和FileStream区别和用法
- 关于优化sql查询的一个方法。
- copy构造函数的秘密
- 小黄豆CRM软件安装
- js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法
- delphi 2010 动态链接库DLL断点调试
- git使用图解
- 初次接触 Android Studio FAQ
- sql中关于存在就不做操作的代码块
- instanceof 操作符实现原理解析
- js 浏览器 宽高 各种
- 1.13.Mark1
- PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
- OpenStack概念架构简述
- mysql好用的函数