历史上的今天
返回首页

历史上的今天

今天是:2024年08月28日(星期三)

正在发生

2019年08月28日 | stm32f103 keil5 HAL库 UART中断接收

2019-08-28 来源:eefocus

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中断

 

}

 

     

 }


推荐阅读

史海拾趣

Davico Industrial Ltd公司的发展小趣事

Davico Industrial Ltd公司发展故事一:技术突破与创新

Davico Industrial Ltd公司自创立以来,始终将技术创新作为企业发展的核心动力。在公司成立初期,面对电子行业竞争激烈的局面,Davico凭借对市场的敏锐洞察和对技术的不断追求,成功研发出了一款具有划时代意义的电子元器件。这款产品以其高性能、低能耗的特点,迅速在市场中占据了一席之地。此后,Davico不断加大对研发的投入,通过引进高端人才、建立先进的研发实验室等举措,持续推出了一系列具有竞争力的新产品,为公司的发展奠定了坚实的基础。

Davico Industrial Ltd公司发展故事二:市场拓展与品牌建设

随着技术实力的不断增强,Davico开始积极拓展国内外市场。公司通过与国内外知名企业的合作,不断提升产品的知名度和美誉度。同时,Davico还积极参与各类行业展会和论坛,展示公司的最新成果和技术实力,赢得了广大客户的认可和信赖。在品牌建设方面,Davico注重塑造企业形象和文化内涵,通过广告宣传、公益活动等方式,提高了品牌的社会影响力和知名度。

Davico Industrial Ltd公司发展故事三:质量管理与持续改进

Davico深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了完善的质量管理体系和检测手段。通过对生产过程的严格控制和对产品质量的不断追求,Davico的产品在市场中赢得了良好的口碑。同时,公司还积极开展持续改进活动,通过引进先进的生产设备和工艺、优化生产流程等措施,不断提高生产效率和产品质量。

Davico Industrial Ltd公司发展故事四:人才战略与团队建设

Davico高度重视人才队伍建设,通过制定合理的人才战略和激励机制,吸引了一批批优秀的人才加入公司。公司注重员工的培训和发展,通过定期的技能培训、知识更新等活动,不断提升员工的综合素质和专业技能。同时,Davico还建立了完善的团队协作机制,鼓励员工之间的沟通和合作,形成了一支高效、团结、富有战斗力的团队。

Davico Industrial Ltd公司发展故事五:绿色发展与社会责任

随着全球环保意识的不断提高,Davico积极响应国家绿色发展的号召,将环保理念融入到企业的生产经营中。公司通过引进环保设备、改进生产工艺等措施,降低了生产过程中的能耗和污染排放。同时,Davico还积极参与社会公益事业,通过捐款捐物、扶贫济困等方式,回馈社会、造福人民。这些举措不仅提升了企业的社会形象,也为公司的长远发展注入了新的动力。

DMS Electronic Components, Inc公司的发展小趣事

DMS自创立之初,就致力于电子元器件的技术创新。公司投入大量研发资源,成功开发出一系列高性能、低成本的电子元器件,这些产品迅速在市场上获得了认可。随着技术的不断进步,DMS不断推出新产品,满足了客户日益增长的需求,逐渐在电子行业中树立了技术领先的形象。

Chip Technologies Inc公司的发展小趣事

为了进一步扩大市场份额,Chip Technologies Inc积极寻求与国际知名企业的合作。通过与这些企业建立战略合作关系,公司不仅获得了更多的技术支持和市场资源,还成功将产品推向了全球市场。这些合作不仅提升了公司的品牌知名度,也为公司的长期发展奠定了坚实的基础。

Electech Electronics公司的发展小趣事

随着科技的不断发展,Electech Electronics意识到仅仅依赖电子元器件的代理和销售已经无法满足市场的需求。于是,公司开始投入研发,专注于电子产品的设计和制造。经过数年的努力,Electech Electronics成功开发出一系列具有竞争力的电子产品,如智能控制模块、高精度传感器等。这些产品的推出不仅拓宽了公司的产品线,也提升了公司的市场竞争力。

Fine Products Microelectronics Corp公司的发展小趣事

随着科技的不断发展,Electech Electronics意识到仅仅依赖电子元器件的代理和销售已经无法满足市场的需求。于是,公司开始投入研发,专注于电子产品的设计和制造。经过数年的努力,Electech Electronics成功开发出一系列具有竞争力的电子产品,如智能控制模块、高精度传感器等。这些产品的推出不仅拓宽了公司的产品线,也提升了公司的市场竞争力。

Austek Microsystems公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,Austek Microsystems开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓海外市场,与多个国家和地区的客户建立了稳定的合作关系。同时,Austek Microsystems还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。

问答坊 | AI 解惑

色艺俱佳,华丽丽的notebook们

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 现在在笔记本销售专柜看到笔记本在长相上几乎都差不多,见棱见角的设计、黑白银的配色甚至在体积 和重量上也相差无几。面对如此大众化的风格,现今的时尚男女们怎么能够接受呢?以下我们来看 ...…

查看全部问答>

以奇瑞汽车为例,怎么取出来车速的脉冲信号。

在搞一个试验,和车速有关的。怎么能把车速的脉冲信号取出来呢?在哪里取。别笑话我,我本来就是一外行。…

查看全部问答>

上班了,该收心了

今天我们正式上班了,来到办公室后,大家静悄悄的,每个人都在工作。整个上午,大家都是这样,基本上也没有聊天。看来每个人都进入状态了啊。不过也是,好多事情一下子堆过来,不忙不行啊。 这个年过得太快了,实在是有些意犹未尽。…

查看全部问答>

单片机无法与ARM通信,急求高手指点

单片机是一块LED显示屏的控制芯片,它可以和PC机通信; 把程序烧入ARM以后,ARM和PC机通信也没有问题,但是ARM和 单片机之间无法通信 : PC机通过串口助手给单片机发送了“0x01 oxo1”后,单片机会 返回给PC机一个“01”的握手信号 , 我把 ...…

查看全部问答>

关于共享内存的理解

windows驱动的共享内存如何理解?谢谢各位…

查看全部问答>

大家用tms320f28335都开发那些产品啊?

你要开发产品? 选用tms320f28335是中意它那些特点啊?…

查看全部问答>

QEMU扯淡。。。。。

本人新手,最近看到QEMU的一些介绍,想扯淡耍一下。    网上关于这方面的资料看了不少,本人安的VMWARE,但一直感觉用起来不耍、 哪位哥子能上一点资料或心得。。。。。。。。。非常感谢了。。。。…

查看全部问答>

Ivor Horton的C++入门经典

当你看到 Ivor Horton时,我想,我说啥都是多余的。话说资源还真难找,费了不小的劲,然后再一次引发对CSDN的愤怒......最后这玩意不是在CSDN上下载的。它是扫描版,清晰度还行,不影响阅读,当然了,比不上那种文件版。挺大的,30来M,,我拆成几个 ...…

查看全部问答>

半导体知识之一(PN结,半导体基本概念,MOSFET)

内容 1.PN结原理: P-N 结的形成和能带 2.电子基本概念 30问:正解 and 误解 3.MOS器件的重要特性之15 个为什么? 上图 …

查看全部问答>

招聘嵌入式软件工程师 - 电池管理行业 - 深圳

职责: 编写软件及客户服务支持 要求: 1.至少5年嵌入式软件工程师经验 2.熟悉电池行业(应用于车载,通信,电力等行业) 3.英文可做为工作语言 4.熟练使用embedded C 5.有客户服务工作经验为佳 感兴趣的朋友,欢迎发送简历至judy.wang@tale ...…

查看全部问答>