您的位置 首页 动态

stm32的USART_IT_TXE和USART_IT_TC

一般来说,串口的发送中断传输数据,对于我目前的应用来说,应用的要求并不是很高,因此,因此就一直没有对其进行一个比较好的实验与认…

一般来说,串口的发送中止传输数据,关于我现在的运用来说,运用的要求并不是很高,因而,因而就一向没有对其进行一个比较好的试验与知道。可是,在一次串口程序晋级(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、中止流程

2、再次发送数据,操作进程。

综上,一个串口中止发送数据的程序就可以显着展开了。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部