微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32的USART_IT_TXE和USART_IT_TC

stm32的USART_IT_TXE和USART_IT_TC

时间:12-03 来源:互联网 点击:
一般来说,串口的发送中断传输数据,对于我目前的应用来说,应用的要求并不是很高,因此,因此就一直没有对其进行一个比较好的实验与认识。然而,在一次串口程序升级(IAP)升级实验中,发现有人使用了这个发送中断方式进行的,所以特别的进行了一个个步骤的实验来进一步知道其运行机理。

首先,串口发送数据,可以使用的方式有:

1、发送一个数据,然后读取USART_IT_TXE或者USART_IT_TC寄存器的状态。

2、使用串口发送中断

3、使用dma发送完成中断

在效率上,肯定是3比较好。其次是2。

网上关于USART_IT_TXE和USART_IT_TC是怎么个用法,各家有各家的言论,在我这里只通过实验来了解,因为网上的很多人的讲解是有一些歧义的。

本人用的芯片为stm32f103vet6,利用串口1进行实验,先贴上串口1的配置部分:

void USART1_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init( &NVIC_InitStructure );

USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

USART_ITConfig(USART1, USART_IT_TC, ENABLE);

}

然后是中断部分的实验代码:

void USART1_IRQHandler(void)

{

if(SET == USART_GetITStatus(USART1, USART_IT_TXE))

{

USART_ClearITPendingBit(USART1, USART_IT_TXE);

if(有数据)

{

}

else

{

USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

USART_ITConfig(USART1, USART_IT_TC, ENABLE);

}

}

else if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)

{

USART_ClearITPendingBit(USART1, USART_IT_TC);

USART_ITConfig(USART1, USART_IT_TC, DISABLE);

}

}

现在分析,在使能了串口1的功能后,明显的是,串口就开始进入发送寄存器空状态,也就是说if(SET == USART_GetITStatus(USART1, USART_IT_TXE))是成立的,如果没有if判断语句的话,也就是没有if{}else{},那么就会一直在if(SET == USART_GetITStatus(USART1, USART_IT_TXE))中断中,因此对于if(有数据)就需要在if(有数据){

USART_SendData(USART1,数据);}了,一直等到没有数据了,就进入关闭USART_GetITStatus(USART1, USART_IT_TC) != RESET与之同时,需要开启USART_ITConfig(USART1, USART_IT_TC, ENABLE);让其进入传输完成中断。有人说,这个中断是发送一个字节完成后中断,这种理解十分的让人有歧义,应该说,发送一个字节数据之后,如果后续还有数据,这个中断是不会进去的,这个USART_GetITStatus(USART1, USART_IT_TC) != RESET;串口空闲相关。应该稍微准确的说法是,发送一个字节数据完成后,串口处于空闲状态了,这个时候,会进入这个中断。

好了,如果把串口初始化完成了,这个时候,串口发送中断都被禁止了,怎么去发送数据呢?

发送数据,直接把USART_ITConfig(USART1, USART_IT_TXE, ENABLE);显然是不够的,需要通过USART_SendData(USART1,数据);然后开启中断。可以暂且看作是激活串口,但是过程应该是数据到达寄存器后,很快为空,进而产生if(SET == USART_GetITStatus(USART1, USART_IT_TXE))为真的条件,从而一切仍然能够正常运行了。

注意点:

1、中断流程

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top