STM32CubeMX串口接收中断

发布者:脑电风暴最新更新时间:2019-03-24 来源: eefocus关键字:STM32CubeMX  串口接收中断 手机看文章 扫描二维码
随时随地手机看文章

才接触到cube,目前只实现了固定长度的接收。配置好后,在while(1)前加入配置接收中断。我也是跟踪代码慢慢找到这句的,目前对于cube的库函数一点都不了解。


if(HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5)!=HAL_OK)Error_Handler();

打开it.c。找到

void USART1_IRQHandler(void)

{

  /* USER CODE BEGIN USART1_IRQn 0 */

 

  /* USER CODE END USART1_IRQn 0 */

  HAL_UART_IRQHandler(&huart1);

  /* USER CODE BEGIN USART1_IRQn 1 */

 

  /* USER CODE END USART1_IRQn 1 */

}

跟踪进中断函数。找到接收中断处。

tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);

  tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);

  /* UART in mode Receiver ---------------------------------------------------*/

  if((tmp_flag != RESET) && (tmp_it_source != RESET))

  { 

    UART_Receive_IT(huart);

  }

再次跟踪金UART_Receive_IT()


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

      }

这里是直接把接收数据装入pRxBuffPtr指向的buf里了。

然后就是下面这个if里的


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

    {

      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

 

      /* Check if a transmit process is ongoing or not */

      if(huart->State == HAL_UART_STATE_BUSY_TX_RX) 

      {

        huart->State = HAL_UART_STATE_BUSY_TX;

      }

      else

      {

        /* 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);

 

        huart->State = HAL_UART_STATE_READY;

      }

      HAL_UART_RxCpltCallback(huart);

 

      return HAL_OK;

    }

这里看到,第一句话就把接收终端给关闭了。然后就是处理各种标记,我一个都看不懂。。。。。。然后就调用回调函数了。终于找到需要的东西了。跟踪进去,说这个函数不能更改,你要用的话自己重新定义实现就好了。

于是我就重新定义了该函数


void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)

{

if(UartHandle->Instance == USART1)

{

HAL_UART_Transmit_IT(&huart1, huart1.pRxBuffPtr-huart1.RxXferSize, huart1.RxXferSize); 

HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5);//开启下一次接收中断

// __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

}

}

解释下,首先判断是否为自己用的那个USART。然后打印测试的数据出来。发送中断函数第二个参数为buf地址,因为在接收的时候pRxBuffPtr一直在不断累加了,所以这里需要减RxXferSize,就到了接收buf的头了。第三个参数就是长度了。

打印之后,重新加载一次接收中断。里边我主要就看了这几句话,其他没仔细研究。


huart->pRxBuffPtr = pData;

huart->RxXferSize = Size;

huart->RxXferCount = Size;

这里是赋值接收的ptr,Size,Couont。之所以要赋值Count,是因为没接收到一个字节,Count自减一次,直到为0了,就可以调用回调函数。


别漏了,最后它还调用了


/* Enable the UART Data Register not empty Interrupt */

    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);

因为在UART_Receive_IT()里似乎关闭了接收中断的,所以必须要打开。

现在还不知道怎么接收不定长度的数据,期待哪位大哥给讲解一下,不胜感激。


关键字:STM32CubeMX  串口接收中断 引用地址:STM32CubeMX串口接收中断

上一篇:STM32CubeMX学习教程之四:定时器中断
下一篇:STM32CUBEMX 中断管理

推荐阅读最新更新时间:2024-03-16 16:26

STM32CubeMX系列教程02_STM32CubeMX工具、HAL库下载、安装说明
一、写在前面 上一篇文章是对STM32CubeMX做了一个简单介绍,可能初学者看了之后也不是很理解。那么本文开始动手实践,实践也是快速掌握知识的一种办法。 本文针对初学者,内容比较基础,主要是给大家起引导作用。 包含:下载JRE、STM32CubeMX和HAL库三部分内容。HAL库的几种安装方式。 二、下载 本节主要下载内容:JRE、STM32CubeMX和HAL库。 2.1 下载JRE 由于 STM32CubeMX 软件是基于 JAVA 环境运行的,所以需要安装 JRE (Java Runtime Environment)才能使用, 建议到官网下载最新版本JRE。 地址: https://www.java.c
[单片机]
<font color='red'>STM32CubeMX</font>系列教程02_STM32CubeMX工具、HAL库下载、安装说明
STM32CubeMX学习--(6)USB大容量存储设备
CUBE配置 USB_OTG_FS配置 记得勾选NVIC中断使能。 USB_DEVICE配置 clock配置 修改代码 主要修改usbd_storage_if.c文件 /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : usbd_storage_if.c * @version : v1.0_Cube * @brief : Memory management layer. ***********
[单片机]
<font color='red'>STM32CubeMX</font>学习--(6)USB大容量存储设备
【STM32】HAL库 STM32CubeMX教程八---定时器输入捕获
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: PWM工作原理 STM32CubeMX创建PWM例程 HAL库定时器PWM函数库 PWM创建呼吸灯 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程八---定时器输入捕获
stm32的串口空闲中断接收数据
举个例子: 1、后台数据- USART1- USART2- 其它设备,其它设备数据- USART2- USART1- 后台,这两个数据过程也可能同时进行。 2、由于硬件的限制,USART1和USART2的传输波特率不一样,比如USART1使用GPRS通信,USART2使用短距离无线通信;或者USART1使用以太网通信,USART2使用485总线通信。 现在我把我实现的过程简单描述一下: 1、 初始化设置:USART1_RX DMA1_ Channel5,USART2_RX DMA1_ Channel6,USART1_TX DMA1_ Channel4,USART2_TX DMA1_ Channel7(具体设置请看程序包) 2
[单片机]
STM32CubeMX开发stm32f103rbt6 JLINK(一)
1、新建工程 2、选择芯片 3、管脚配置 4、时钟配置 5、工程生成配置 6、生成工程 7、打开软件工程 8、Keil 下载设置 9、下载 注意:安装好Jlink驱动 常见问题: 1、如图 解决:硬件问题,检查接线,电源以及BOOT0,BOOT1 2、JLINK不识别CPU 原因1、检查是否禁用了SWD:stm32f1xx_hal_msp.c---- void HAL_MspInit(void) __HAL_AFIO_REMAP_SWJ_DISABLE(); 短接复位电容(C7),在断开
[单片机]
<font color='red'>STM32CubeMX</font>开发stm32f103rbt6 JLINK(一)
STM32CUBEMX】增加自定义 Groups 问题
背景 最近在使用 STM32CUBEMX 生成工程,想新建几个 Groups 放自己的文件。 平常自建的工程,我都是在 Manage Project Items 里面增加的。在使用STM32CUBEMX 生成的工程,发现每次在Manage Project Items 里面增加Groups,Keil 直接就崩了,压根就建不上。下图中的InterFace就是我自建的 Groups ,点击 “OK” ,Keil 就会崩掉。 解决方法 可以右键“Target XX”,下拉菜单里面有个选项“Add Groups”,使用“Add Groups”就可以新建 Groups。 在新建完后,可以在 Manage Project Items
[单片机]
【<font color='red'>STM32CUBEMX</font>】增加自定义 Groups 问题
STM32CubeMX新建第一个工程
STM32CubeMX的新建工程其实很简单,如果需要有复杂的配置,整个工程就有很多细节的地方需要注意。 一、打开STM32CubeMX软件,点击“新建工程”: 2、选择芯片型号,点选后,双击选中对应型号(点一次是查看其信息,双击直接选择进入): 双击后 3、设置软件工程,Project - Settings弹出设置窗口,设置好参数,点击OK即可 注意:默认是选择最新版本的库,在使用时要选择自己的库,如上图第7步。 接着我们进行自由设置: 四、工程配置 接下的配置才是与我们最终运行代码密切相关的,我们这里以简单的配置IO(PE5引脚)驱动LED为例来讲述。 A、放大芯片图标,找到PE5(可以通过Fin
[单片机]
<font color='red'>STM32CubeMX</font>新建第一个工程
串口接收中断和连续发送的矛盾!
出现的问题:为什么我配置的串口中断,只能接收到数据头和尾?PC发送123,我接收到13;PC发送12345,我接收到15。 波特率也是匹配的呀,怎么就漏接了中间部分呢? 暂时想到的原因:因为串口接收中断服务程序也是需要时间来执行的,所以试想一下: MCU的串口外设在接收到二个数据的时候,MCU的主核正在执行第一个数据触发的中断服务程序,所以第二个数据触发的中断函数并未执行!如果波特率很高,那么中断服务程序就相对时间很长,这样,MCU接收到第三个数据,MCU仍在第一个中断函数里执行,但串口接收寄存器被覆盖了!直到MCU接收到最后一个数据,串口接收寄存器稳定为最后一个数据(因为没有下一个数据来覆盖它),这是等待第一个中断服务函数结
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved