您的位置 首页 报告

剖析初始化STM32串口后进入发送完结中止的现象

最近在调试STM32串口过程中发现一个奇怪的问题,初始化串口1口,使能串口发送完成中断后,立刻就进入了发送完成中断,21ic论坛上也有同样的

最近在调试STM32串口进程中发现一个古怪的问题,初始化串口1口,使能串口发送完结中止后,马上就进入了发送完结中止,21ic论坛上也有相同的问题评论,而香水版主并没有解说原因。为了完全的搞理解发生这一现象的原因:我细心的看了STM32手册中的串口部分的介绍:

以下是字符发送的装备进程,留意第6点,在设置USART_CR1中的TE位时,会发送一个闲暇帧作为第一次数据发送,所以即使你履行了USART_ClearFlag(USART1, USART_FLAG_TC); (这个函数肯定在闲暇帧数据发送完结前履行),所以当闲暇帧发送完后,就进入发送完结中止。

装备过程:
1.经过在USART_CR1寄存器上置位UE位来激活USART
2.编程USART_CR1的M位来界说字长。
3.在USART_CR2中编程中止位的位数。
4.假如选用多缓冲器通讯,装备USART_CR3中的DMA使能位(DMAT)。按多缓冲器通讯中
的描绘装备DMA寄存器。
5.使用USART_BRR寄存器挑选要求的波特率。
6.设置USART_CR1中的TE位,发送一个闲暇帧作为第一次数据发送。
7.把要发送的数据写进USART_DR寄存器(此动作铲除TXE位)。在只要一个缓冲器的状况
下,对每个待发送的数据重复过程7。
8.在USART_DR寄存器中写入最终一个数据字后,要等候TC=1,它表明最终一个数据帧的
传输完毕。当需求封闭USART或需求进入停机形式之前,需求承认传输完毕,防止损坏
最终一次传输。

处理的办法:
办法一
在履行USART_ITConfig(USART1, USART_IT_TC, ENABLE); 之前,
先延时一段时间,基本上比一个字符发送的时间长一点就可以了,然后再履行
USART_ClearFlag(USART1, USART_FLAG_TC);

办法二:
在履行USART_ITConfig(USART1, USART_IT_TC, ENABLE); 之前,
USART_ClearFlag(USART1, USART_FLAG_TC);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
{
; //等候闲暇帧发送完结后再清零发送标志
}
USART_ClearFlag(USART1,USART_FLAG_TC);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/259270.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部