STM32的CubeMX关于串口中断

发布者:SHow111time最新更新时间:2019-03-25 来源: eefocus关键字:STM32  CubeMX  串口中断 手机看文章 扫描二维码
随时随地手机看文章

1、关于串口的初始化函数:


    MX_USART2_UART_Init()---波特率、奇偶校验等配置


            HAL_UART_Init()---会将 huart->RxState = HAL_UART_STATE_READY;


    HAL_UART_MspInit()---GPIO,中断优先级等配置


2、当需要使用中断接收时需要调用


    HAL_UART_Receive_IT()---配置接收的缓冲区指针,数量,huart->RxState = HAL_UART_STATE_BUSY_RX;,最后使能相应中断


3、当中断发生时,执行


    HAL_UART_IRQHandler()--判断中断的类型,在此处我用到的是非空中断,那么会继续调用UART_Receive_IT(huart);


    这个函数会首先判断串口的接收状态huart->RxState == HAL_UART_STATE_BUSY_RX,若果为真就进行数据的保存,进 如     果达到规定的传输数量就会关闭中断,改变huart->RxState = HAL_UART_STATE_READY;然后执行HAL_UART_RxCpltCallback();如果不为真,就清除接收中断标志。


4、HAL_UART_RxCpltCallback()这个函数里尽可能的少些代码否则影响效率,如果想再次开启中断,可以在这里调用       HAL_UART_Receive_IT(),进行再次接收


下面说说我遇到的问题:


初始化串口完毕后,调用一次HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE),进行一个字节的中断接收,然后在HAL_UART_RxCpltCallback()函数里,进行帧头的校验和传输数量的计算,然后继续开启。代码如下


           //如果计算的数量大于规定的数量,说明传输出错。丢弃,判定上位机发送是否错误

            if(usRecLength > DMA_BUF_MAX)

            {

                uxComDMA.ucRxBuf[eMsg_DTH] = APP_NULL;

                uxComDMA.ucRxBuf[eMsg_DTL] = APP_NULL;

                uxComDMA.usRxLen = APP_NULL;

                PTCL_Dbg("计算数量大于规定数量");

            }

            //接收的数量大于等于计算的数量

            if(uxComDMA.usRxLen >= usRecLength)

            {

                uxComDMA.uxReceiveFlag = eAppTrue;//标记接收完成。---此时不再调用HAL_UART_Receive_IT()

            }

            else//继续接受下一个数据

            {

                HAL_UART_Receive_IT(&huart2, uxComDMA.ucRxBuf+uxComDMA.usRxLen,ONE_BYTE);


            }


当正确接收一帧数据后,便不再开启,直到这一阵数据处理完,主程序再次调用HAL_UART_Receive_IT()进行下一轮的接收。


那么问题来了:规定的协议是8个字节,在正确接收到8个字节后便不再开启中断接收,主函数执行数据帧的处理完毕后才会开启。但是如果上位机一次一共发送了10个字节,前8个字节是正确的一帧,后面2个无用。当下位机接收到8个字节便关闭了中断,处理完后再次开启。然后上位机再发来数据,发现下位机再也不能执行HAL_UART_RxCpltCallback(),协议就报废了。


调试后发现,后来接收数据时虽然可以进入中断并且执行了UART_Receive_IT();但是huart->RxState 的值不是HAL_UART_STATE_BUSY_RX导致不能继续执行传输完成回调。疑问是,最后一次开启中断接收时调用HAL_UART_Receive_IT()函数确实将 huart->RxState = HAL_UART_STATE_BUSY_RX;


 


PTCL_Dbg("初始化接收的状态%d",HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE));//串口2的接收中断


函数返回值为HAL_OK


PTCL_Dbg("串口的接收状态%#x\r\n",huart2.RxState);----确实不等于HAL_UART_STATE_BUSY_RX,而是等于                                                                                                                                                   HAL_UART_STATE_READY


//    huart2.RxState = HAL_UART_STATE_BUSY_RX; ----加上这句话,可以解决问题


这是为什呢?


解决上述问题:


关于上述问题的总结:后两个字节传输时,已经关闭了中断,但是硬件将ORE位(溢出标志,看数据手册)置一和RXNE位置一。当调用HAL_UART_Receive_IT()函数时,会同时使能EIE、PEIE、RXNEIE三个中断。第一次我手动将RXNE位清除,但是没有清除ORE位,造成调用就会立即产生中断(溢出中断)。当执行HAL_UART_IRQHandler()函数时:      


 

    

关于HAL库,更多的是考虑到安全性和兼容性所以代码量比较大,一开始使用不会像我们使用寄存器那么随意,所以必须深入看源码,才能更好的使用。


关键字:STM32  CubeMX  串口中断 引用地址:STM32的CubeMX关于串口中断

上一篇:STM32F4CubeMX学习笔记之ADC不带中断
下一篇:基于CubeMX HAL库CAN的配置

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

stm32-afio的使用
1. AFIO的功能 为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。 简言之,AFIO实现了复用功能的重新映射。 2. 在什么情况下,需要开启AFIO时钟? 参考手册中写道:对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。 在数据手册的引脚定义中(pin definitions),复用功能 Alternate functions 栏下分为两栏:默认 Default 和重映射 R
[单片机]
stm32-afio的使用
STM32驱动16位精度A/D转换芯片ADS1120
一.电路连接 原理图中使用了两个通道。 二.相关寄存器 见ADS1120官方手册 三.代码编写顺序实例(官方伪代码) 四.STM32程序 void ADC_1120_AIN1_CONVER() { //********************************************** //ADC初始化 //********************************************** Delay_N_ms(1);//延时 ADC_CS_LOW;//选中ADC芯片 Delay_N_ms(1);//
[单片机]
大联大友尚集团推出基于ST STM32 Cortex-M4(STM32F4 or L4)的码表
大联大友尚集团推出基于ST STM32 Cortex-M4(STM32F4 or L4)的 2021年4月20日,致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下友尚推出基于意法半导体(ST) STM32 Cortex-M4(STM32F4 or L4)的码表方案。 在单片机系统上实现图形界面,最简单是使用串口屏的方式,但是在体积有限的手持应用中,串口屏显的体积与适配性往往不能适应需求,这就需要使用GUI框架来完成图形界面。在单片机领域,TouchGFX是一种面向STM32微控制器优化的高级免费图形软件框架。 图示1-大联大友尚推出基于ST STM32 Cortex-M4(STM32F4 o
[单片机]
大联大友尚集团推出基于ST <font color='red'>STM32</font> Cortex-M4(STM32F4 or L4)的码表
STM32 串口发送来龙去脉以及一些问题的分析
1.介绍的串口部分会有如下优缺点: 优点:简单,适合很少量数据传输。(只要求这个优点,其实本可以不用串口中断,但是为了知道来龙去脉,避免串口故弄玄虚,故加入中断进行串口发送的分析。) 缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失。 2.了解一些基础知识: TXE=1代表发送数据寄存器空。 TC=1代表移位寄存器传输完成。 TXEIE允许在TXE标志为'1'时产生中断 TCIE允许在TC标志为'1'时产生中断 画个图介绍数据传输: 串口发送数据 3.采用判断TC的方式进行串口中断发送字符串. a.首先按照官网上的配置进行(这么晚了,码字太难了,直接上手写版) 官网配
[单片机]
<font color='red'>STM32</font> <font color='red'>串口</font>发送来龙去脉以及一些问题的分析
stm32中断解剖(非外部中断)
如果只使用TIME2全局中断,则不需要void EXTI_Config(void)//外部中断配置。只要void NVIC_Configuration(void)//嵌套中断配置和stm32f10x_it.c库文件中的void TIM2_IRQHandler(void)。具体如下配置。注意此处与外部中断的配置的区别切勿混淆。 疑问? 1.为什么不需要配置RCC_APB2Periph_AFIO 2 查看固件库手册 发现NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //选择外部中断3号线 与 NVIC_InitStructure.NVIC_IRQChannel = TIM2
[单片机]
<font color='red'>stm32</font><font color='red'>中断</font>解剖(非外部<font color='red'>中断</font>)
STM32(一) 汇编操作GPIO
平台:keil4.72 开发板:stm32F103 72M 测试代码: 汇编: __asm void asm_LED1_TOGGLE(void) { ;GPIOA_ODR EQU 0x4001080C| LDR R0, = 0x4001080C LDR R1, ;R1 = *R0 EOR R1,#0x0100 ;r1 = r1^0x0100 STR R1, ;*R0 = R1 BX LR ; } 对应的C void c_LED1_TOGGLE(void) { GPIOA- ODR ^= GPIO_Pin_8; } 测试用主函数 int main(v
[单片机]
<font color='red'>STM32</font>(一) 汇编操作GPIO
STM32基于库函数版本的系统工作频率与CAN工作波特率设置
1,系统工作频率设置 STM32系统工作频率设置寄存器版和库函数版相差较大。库函数版本系统工作频率通过system_stm32f10x.c 中的SystemInit()函数进行设置,其他的配置主要在stm32f10x_rcc.c文件中。对于系统时钟,默认情况下是在SystemInit函数的SetSysClock()函数中间判断的,而设置是通过宏定义设置的。 static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif def
[单片机]
<font color='red'>STM32</font>基于库函数版本的系统工作频率与CAN工作波特率设置
STM32高级开发(3)-设置与更新ubuntu
安装VMware tools 首先在登陆后,别着急操作,为了让我们的ubuntu在VMware下工作更加良好和方便,我们需要在ubuntu上安装VMwaretools,它可以为我们实先主机和虚拟机间拖拽文件、粘贴复制、自动调整分辨率等方便的功能。 1.下拉VMware的虚拟机选项,点击安装VMware tools,此时系统会显示检测到一个光驱,并自动打开其文件夹。 2.右键复制tar.gz格式的压缩包文件到home目录下。注意,ubuntu等Linux的文件目录定义不同于windows,他的用户目录home地位和作用就相当于windows下的桌面,对它是不分盘的。 3.右键点击压缩包,点击extract here解压到
[单片机]
<font color='red'>STM32</font>高级开发(3)-设置与更新ubuntu
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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