<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > stm32的USART_IT_TXE和USART_IT_TC

stm32的USART_IT_TXE和USART_IT_TC

作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò ) 收藏
一般來(lái)說(shuō),串口的發(fā)送中斷傳輸數據,對于我目前的應用來(lái)說(shuō),應用的要求并不是很高,因此,因此就一直沒(méi)有對其進(jìn)行一個(gè)比較好的實(shí)驗與認識。然而,在一次串口程序升級(IAP)升級實(shí)驗中,發(fā)現有人使用了這個(gè)發(fā)送中斷方式進(jìn)行的,所以特別的進(jìn)行了一個(gè)個(gè)步驟的實(shí)驗來(lái)進(jìn)一步知道其運行機理。

首先,串口發(fā)送數據,可以使用的方式有:

本文引用地址:http://dyxdggzs.com/article/201612/325196.htm

1、發(fā)送一個(gè)數據,然后讀取USART_IT_TXE或者USART_IT_TC寄存器的狀態(tài)。

2、使用串口發(fā)送中斷

3、使用dma發(fā)送完成中斷

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

網(wǎng)上關(guān)于USART_IT_TXE和USART_IT_TC是怎么個(gè)用法,各家有各家的言論,在我這里只通過(guò)實(shí)驗來(lái)了解,因為網(wǎng)上的很多人的講解是有一些歧義的。

本人用的芯片為stm32f103vet6,利用串口1進(jìn)行實(shí)驗,先貼上串口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);

}

然后是中斷部分的實(shí)驗代碼:

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的功能后,明顯的是,串口就開(kāi)始進(jìn)入發(fā)送寄存器空狀態(tài),也就是說(shuō)if(SET == USART_GetITStatus(USART1, USART_IT_TXE))是成立的,如果沒(méi)有if判斷語(yǔ)句的話(huà),也就是沒(méi)有if{}else{},那么就會(huì )一直在if(SET == USART_GetITStatus(USART1, USART_IT_TXE))中斷中,因此對于if(有數據)就需要在if(有數據){

USART_SendData(USART1,數據);}了,一直等到?jīng)]有數據了,就進(jìn)入關(guān)閉USART_GetITStatus(USART1, USART_IT_TC) != RESET與之同時(shí),需要開(kāi)啟USART_ITConfig(USART1, USART_IT_TC, ENABLE);讓其進(jìn)入傳輸完成中斷。有人說(shuō),這個(gè)中斷是發(fā)送一個(gè)字節完成后中斷,這種理解十分的讓人有歧義,應該說(shuō),發(fā)送一個(gè)字節數據之后,如果后續還有數據,這個(gè)中斷是不會(huì )進(jìn)去的,這個(gè)USART_GetITStatus(USART1, USART_IT_TC) != RESET;串口空閑相關(guān)。應該稍微準確的說(shuō)法是,發(fā)送一個(gè)字節數據完成后,串口處于空閑狀態(tài)了,這個(gè)時(shí)候,會(huì )進(jìn)入這個(gè)中斷。

好了,如果把串口初始化完成了,這個(gè)時(shí)候,串口發(fā)送中斷都被禁止了,怎么去發(fā)送數據呢?

發(fā)送數據,直接把USART_ITConfig(USART1, USART_IT_TXE, ENABLE);顯然是不夠的,需要通過(guò)USART_SendData(USART1,數據);然后開(kāi)啟中斷??梢詴呵铱醋魇羌せ畲?,但是過(guò)程應該是數據到達寄存器后,很快為空,進(jìn)而產(chǎn)生if(SET == USART_GetITStatus(USART1, USART_IT_TXE))為真的條件,從而一切仍然能夠正常運行了。

注意點(diǎn):

1、中斷流程

2、再次發(fā)送數據,操作步驟。

綜上,一個(gè)串口中斷發(fā)送數據的程序就可以明顯展開(kāi)了。



關(guān)鍵詞: stm32USART_IT_TXEUSART_IT_T

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>