stm32的USART_IT_TXE和USART_IT_TC
首先,串口发送数据,可以使用的方式有:
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、中断流程
stm32USART_IT_TXEUSART_IT_T 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)