當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]SECTION 1調(diào)試STM32串口過程中發(fā)現(xiàn)一個奇怪的問題,初始化串口1口,使能串口發(fā)送完成中斷后,立刻就進入了發(fā)送完成中斷。仔細的查閱了STM32手冊中的串口部分的介紹: 以下是字符發(fā)送的配置過程,注意第6點,在設(shè)置

SECTION 1

調(diào)試STM32串口過程中發(fā)現(xiàn)一個奇怪的問題,初始化串口1口,使能串口發(fā)送完成中斷后,立刻就進入了發(fā)送完成中斷。
仔細的查閱了STM32手冊中的串口部分的介紹:

以下是字符發(fā)送的配置過程,注意第6點,在設(shè)置USART_CR1中的TE位時,會發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送,所以即便你執(zhí)行了USART_ClearFlag(USART1, USART_FLAG_TC); (這個函數(shù)肯定在空閑幀數(shù)據(jù)發(fā)送完成前執(zhí)行),所以當(dāng)空閑幀發(fā)送完后,就進入發(fā)送完成中斷。

配置步驟:
1. 通過在USART_CR1寄存器上置位UE位來激活USART
2. 編程USART_CR1的M位來定義字長。
3. 在USART_CR2中編程停止位的位數(shù)。
4. 如果采用多緩沖器通信,配置USART_CR3中的DMA使能位(DMAT)。按多緩沖器通信中
的描述配置DMA寄存器。
5. 利用USART_BRR寄存器選擇要求的波特率。
6. 設(shè)置USART_CR1中的TE位,發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送。
7. 把要發(fā)送的數(shù)據(jù)寫進USART_DR寄存器(此動作清除TXE位)。在只有一個緩沖器的情況
下,對每個待發(fā)送的數(shù)據(jù)重復(fù)步驟7。
8. 在USART_DR寄存器中寫入最后一個數(shù)據(jù)字后,要等待TC=1,它表示最后一個數(shù)據(jù)幀的
傳輸結(jié)束。當(dāng)需要關(guān)閉USART或需要進入停機模式之前,需要確認傳輸結(jié)束,避免破壞
最后一次傳輸。

//解決的辦法:
//方法一
//在執(zhí)行
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
//之前,先延時一段時間,基本上比一個字符發(fā)送的時間長一點就可以了,然后再執(zhí)行
USART_ClearFlag(USART1, USART_FLAG_TC);

//方法二:
//在執(zhí)行
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
{
; //等待空閑幀發(fā)送完成后 再清零發(fā)送標志
}
USART_ClearFlag(USART1,USART_FLAG_TC);
SECTION 2


先說TC。即Transmission Complete。發(fā)送一個字節(jié)后才進入中斷,這里稱為“發(fā)送后中斷”。和原來8051的TI方式一樣,都是發(fā)送后才進中斷,需要在發(fā)送函數(shù)中先發(fā)送一個字節(jié)觸發(fā)中斷。發(fā)送函數(shù)如下


/*******
功能:中斷方式發(fā)送字符串.采用判斷TC的方式.即 判斷 發(fā)送后中斷 位.
輸入:字符串的首地址
輸出:無
*******/
void USART_SendDataString( u8 *pData )
{
pDataByte = pData;

USART_ClearFlag(USART1, USART_FLAG_TC);//清除傳輸完成標志位,否則可能會丟失第1個字節(jié)的數(shù)據(jù).網(wǎng)友提供.

USART_SendData(USART1, *(pDataByte++) ); //必須要++,不然會把第一個字符t發(fā)送兩次
}




中斷處理函數(shù)如下
/********
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*********/
void USART1_IRQHandler(void)
{
if( USART_GetITStatus(USART1, USART_IT_TC) == SET )
{
if( *pDataByte == '