久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 分析初始化STM32串口后進入發送完成中斷的現象

分析初始化STM32串口后進入發送完成中斷的現象

作者: 時間:2016-11-25 來源:網絡 收藏
最近在調試STM32串口過程中發現一個奇怪的問題,初始化串口1口,使能串口發送完成中斷后,立刻就進入了發送完成中斷,21ic論壇上也有同樣的問題討論,而香水版主并沒有解釋原因。為了徹底的搞明白產生這一現象的原因:我仔細的看了STM32手冊中的串口部分的介紹:

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

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

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

方法二:
在執行USART_ITConfig(USART1, USART_IT_TC, ENABLE); 之前,
USART_ClearFlag(USART1, USART_FLAG_TC);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
{
; //等待空閑幀發送完成后再清零發送標志
}
USART_ClearFlag(USART1,USART_FLAG_TC);

本文引用地址:http://cqxgywz.com/article/201611/321357.htm


評論


技術專區

關閉