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