STM32串口发送中断试验、在初始化时不能使能串口发送中断
创始人
2025-05-28 02:29:23
0

问题描述

在测试STM32串口发送完成中断的应用中,遇到了一个很奇怪的问题,在初始化完成之后直接就进入了串口中断函数的发送完成服务中断函数部分。本测试代码是在原来的基础上更改的,原来只使能了接受中断,此次仅仅是在初始化中加入了使能发送完成中断,所以问题的重点就处在了这个使能发送完成中断了。

查阅资料发现,在使能了发送完成中断之后,硬件就会紧接着发送一个空字符,那么发送完成之后不就进入了中断服务函数了。一般的解决方法是在初始化中不使能发送完成中断。仅是在发送数据的函数中使能发送完成中断,然后在中断函数中Disable此中断。
在初始化中开启接收中断没大意义,因为必须在其接收中断服务函数中将其Disable掉,再在需要发送的函数中将其Enable

在初始化时,配置串口发送、接收引脚,配置串口参数,配置串口中断优先级。

切记:在初始化时不能使能串口发送中断,如果初始化时使能TXEIE中断允许,则会导致程序运行时一直在进串口中断。

初始化

void My_USART1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1 ,ENABLE);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);// // 不要在这里使能串口发送中断,否则一直进中断// USART_ITConfig(USART1, USART_IT_TC, ENABLE); NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);}

编写中断函数

void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE)){res=USART_ReceiveData(USART1);USART_ITConfig(USART1,USART_IT_TC,ENABLE);USART_SendData(USART1,res);}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET){USART_ITConfig(USART1, USART_IT_TC, DISABLE);USART_ClearFlag(USART1,USART_FLAG_TC);}
}

建议的是在初始化时不好启用TXE中断,只在要发送数据(尤其是字符串、数组这样的系列数据)时才启用TXE。在发送完成后立即将其关闭,以免引起不必要的麻烦。
对于发送,需要注意TXE和TC的差别——这里简单描述一下(具体参考https://editor.csdn.net/md/?articleId=129428646),假设串口数据寄存器是DR、串口移位寄存器是SR以及TXD引脚TXDpin,其关系是DR->SR->TXDpin。当DR中的数据转移到SR中时TXE置1,如果有数据写入DR时就能将TXE置0;如果SR中的数据全部通过TXDpin移出并且没有数据进入DR,则TC置1。并且需要注意TXE只能通过写DR来置0,不能直接将其清零,而TC可以直接将其写1清零。
对于发送单个字符可以考虑不用中断,直接以查询方式完成。
对于发送字符串/数组类的数据,唯一要考虑的是只在最后一个字符发送后关闭发送中断,这里可以分为两种情况:对于发送可显示的字符串,其用0x00作为结尾的,因此在ISR中就用0x00作为关闭发送中断(TXE或者TC)的条件;第二种情况就是发送二进制数据,那就是0x00~0xFF中间的任意数据,就不能用0x00来判断结束了,这时必须知道数据的具体长度。

参考文章:https://blog.csdn.net/weixin_43202477/article/details/84848295

相关内容

热门资讯

PTA:C课程设计(3) 山东大学(威海)2022级大一下C习题集(3)...
LSTM从入门到精通(形象的图... 先附上这篇文章的一个思维导图什么是RNN按照八股文来说:RNN实际上就是一个带有记忆的...
推荐系统简介+算法详解+项目介... 目录标题推荐系统简介1、推荐系统目的2、推荐系统的应用3、推荐系统的基本思想4、推荐系统的数据分析5...
redhat官网相关信息链接(... Red Hat Enterprise Linux Red Hat Enterprise Linux ...
智慧水务一体化平台建设(解决方... 平台概述柳林智慧水务一体化平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算...
白平衡,颜色校正,颜色映射Wh... 文章目录一,When Color Constancy Goes Wrong: Corr...
一碗面粉,五克酵母,一勺白糖,... 很久没有吃烙饼,突然有点想念,我是一个说干就干的人,立马就开始发面制作,因我平时不喜欢喝牛奶,所以发...
白炭黑硅膏制作指南解析工艺与用... 白炭黑硅膏是一种具有广泛应用前景的特殊材料,其制作过程需要一系列精细工艺。本文将深入探讨白炭黑硅膏的...
原创 夏... 高温肆虐的夏天,孩子蔫蔫的没精神?稍不留神窜稀跑肚?别担心,厨房里藏着天然的守护小能手!它们营养丰富...
Ubuntu20.04LTS部... 文章目录1.在服务器上安装jupyterlab、jupyter_server2.服务器端配置jupy...
如何突破卫星影像建模难点?重建... 日前,由重建大师生成的首个“珞珈三号01星”卫星影像三维模型一经发出,引...
王海庭:带你攀登金祖峰 在山顶... 小兴安岭的深夜,静谧,深邃。 位于伊春市的金祖峰已经亮起了光,不少登山客来到山脚下,他们整装待发,准...
【调优】Linux优化Swap... 【调优】Linux优化Swap设置 1 通过free -h查询到 free -h 内存还剩余很多...
DAP-seq文章合集-蓝景科... 100+物种,1000+转录因子的实战经验,高通量鉴定转...
Nginx+Tomcat负载均... 文章目录一.Nginx负载均衡实现原理1、 反向代理原理2、反向代理的概念3、反向代理的优势4、Ng...
供水自动化控制系统-数字孪生智... 平台概述柳林供水自动化控制系统平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、A...
目标检测 pytorch复现F... 目标检测 pytorch复现Fast_RCNN目标检测项目0、原理简介1、初始化COCO数据集相关类...
计算机操作系统之进程 目录 进程的定义 基本概念 进程实体与进程 PCB的组成 进程的组织 链接方式 索引方式 进程的特征...
第一性原理吸附能计算的基本原理... 第一性原理吸附能计算是一种基于量子力学原理的计算方法,用于预测材料表面或界面上分子吸附...
Spark 的JavaWord... 一、示例代码 public final class JavaWordCount {private s...