ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【单片机】CH32V103串口IDLE空闲中断

2021-09-20 11:05:39  阅读:168  来源: 互联网

标签:CH32V103 USART RX NVIC 单片机 InitStructure 串口 GPIO USART2


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;
	    }

  

 

 

 

 

 

  

标签:CH32V103,USART,RX,NVIC,单片机,InitStructure,串口,GPIO,USART2
来源: https://www.cnblogs.com/xiaoyehack/p/15313850.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有