1.根据选择的串口使能中断,由于需要,我将串口空闲(IDLE)中断时能,并使能串口接收中断


HAL_NVIC_EnableIRQ(USART3_IRQn);//使能USART3中断

HAL_NVIC_SetPriority(USART3_IRQn,3,3);//配置USART3的优先级

 HAL_UART_Receive_IT(&huart3,correction_Table, datalength);//correction_Table是申请的数组首地址

  __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE); //使能串口空闲(IDLE)中断

2.在中断函数中调用HAL_UART_IRQHandler(&huart3)函数,并判断是否有IDLE中断 ,IDLE中断的作用是用来接收可变的数据量,当发送的数据个数小于datalength时可以根据读取出(&huart3)->RxXferCount的值来判断接收到的数据个数


void USART3_IRQHandler(void)               

{

uint32_t  value_RxXferSize=0;

uint32_t   value_RxXferCount=0;

uint32_t temp_IDLE_flag=0;

temp_IDLE_flag=__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE);//检测UART是否是空闲中断

if(temp_IDLE_flag!=RESET)

{

         __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除UART的空闲(IDLE)中断

           value_RxXferSize= (&huart3)->RxXferSize;       /*!< UART Rx Transfer size              */

           value_RxXferCount= (&huart3)->RxXferCount;      /*!< UART Rx Transfer Counter           */  

}

HAL_UART_IRQHandler(&huart3);//这个函数的功能包含了接收UART数据的功能  是调用了 UART_Receive_IT(huart)来实            现的

}


3.UART_Receive_IT(UART_HandleTypeDef *huart)的实现如下,当接收到的数据个数 RxXferCount达到预定的值时,代码

if(--huart->RxXferCount == 0U) 会先关闭UART的接收中断__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);然后调用回调函数 HAL_UART_RxCpltCallback(huart);



static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)

{

  uint16_t* tmp;

  

  /* Check that a Rx process is ongoing */

  if(huart->RxState == HAL_UART_STATE_BUSY_RX) 

  {

    if(huart->Init.WordLength == UART_WORDLENGTH_9B)

    {

      tmp = (uint16_t*) huart->pRxBuffPtr;

      if(huart->Init.Parity == UART_PARITY_NONE)

      {

        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);

        huart->pRxBuffPtr += 2U;

      }

      else

      {

        *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF);

        huart->pRxBuffPtr += 1U;

      }

    }

    else

    {

      if(huart->Init.Parity == UART_PARITY_NONE)

      {

        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);

      }

      else

      {

        *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);

      }

    }

 

    if(--huart->RxXferCount == 0U)

    {

      /* Disable the IRDA Data Register not empty Interrupt */

      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);//关闭UART的接收中断

 

      /* Disable the UART Parity Error Interrupt */

      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);

        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */

        __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

 

      /* Rx process is completed, restore huart->RxState to Ready */

      huart->RxState = HAL_UART_STATE_READY;

 

      HAL_UART_RxCpltCallback(huart);

 

      return HAL_OK;

    }

    return HAL_OK;

  }

  else

  {

    return HAL_BUSY;

  }

}

4.系统自带的回调函数,我测试的时候不好用,所以将其注释掉,自己写了一个简单的功能 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)。功能如下,重新配置  HAL_UART_Receive_IT(huart,correction_Table, datalength);函数,由于在第3步关闭了UART的接收中断,所以要在此使能UART中断

 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

 {

 

    if(huart==&huart3)

{

   HAL_UART_Receive_IT(huart,correction_Table, datalength);//重新配置

 

                  __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);//使能UART中断

 

}

 

     

 }


关键字:stm32f103  keil5  HAL库  UART  中断接收 引用地址:stm32f103 keil5 HAL库 UART中断接收

上一篇:STM32F4 HAL库I2S 全双工模式的一个BUG
下一篇:基于HAL库处理UART中断并接收串口传入的数据

推荐阅读

      早前在3C认证中心官网出现了魅族旗下的新机型号为M816Q,由嘉兴永瑞电子科技有限公司生产,配备的UP0512S充电头的参数让人难以直视,居然是5V/1.2A,合起来就是6W,这比当今充电速度最慢的苹果智能手机10W的充电功率还要低,可以想象手持该机的用户漫长等待手机充满电的心情有多么的复杂,不难得出该款手机定位低端的结论。今天该机成功入网,...
近期,邯郸机器人交警在巡逻过程中发现车辆遮挡号牌,便并及时通知民警赶到现场进行处置。此事一经报道就引发了广泛关注。据了解,机器人交警是邯郸打造智慧交通管理体系的一次创新尝试。借助人工智能、云计算、、多融合等前沿技术,机器人交警具备自主感知、自主行走、自主识别等能力,是能够实现全天候不下岗的“智能化交警”。 机器人参与交通管理...
1ARM处理器解析ARM9、ARM11是哈佛结构,5级流水线结构,所以性能要高一点。ARM9和ARM11大多带内存管理器,跑操作系统好一点,ARM7适合裸奔。我们惯称的 ARM9系列中又存在ARM9与ARM9E两个系列,其中ARM9 属于ARM v4T架构,典型处理器如ARM9TDMI和ARM922T;而ARM9E属于ARM v5TE架构,典型处理器如ARM926EJ和ARM946E。因为后者的芯片数量和应用更为广泛,...
导读:欧洲电池制造商InoBat公司宣布与美国电池材料供应商Group14 Technologies公司进行合作,将使用Group14的专利硅基负极材料为汽车生产高能量密度的电池。InoBat公司表示,高能量密度电池市场需求飙升,相比传统锂离子电池,硅基负极材料的单位体积能量密度更高。Group14表示,能源部已经认可其“新颖的、可投入使用的纳米材料和可靠的工业规模工艺”...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved