新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 分析初始化STM32串口后進入發(fā)送完成中斷的現(xiàn)象

        分析初始化STM32串口后進入發(fā)送完成中斷的現(xiàn)象

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

        以下是字符發(fā)送的配置過程,注意第6點,在設(shè)置USART_CR1中的TE位時,會發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送,所以即便你執(zhí)行了USART_ClearFlag(USART1, USART_FLAG_TC); (這個函數(shù)肯定在空閑幀數(shù)據(jù)發(fā)送完成前執(zhí)行),所以當空閑幀發(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é)束。當需要關(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); 之前,
        USART_ClearFlag(USART1, USART_FLAG_TC);

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

        本文引用地址:http://www.104case.com/article/201611/321357.htm


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 衡阳市| 大埔区| 买车| 区。| 江孜县| 炉霍县| 长岭县| 云林县| 天门市| 屏东市| 垣曲县| 徐闻县| 富民县| 怀仁县| 赣榆县| 隆安县| 北海市| 苍梧县| 梁山县| 廉江市| 上林县| 古田县| 洮南市| 准格尔旗| 五寨县| 贞丰县| 惠水县| 金乡县| 永泰县| 耿马| 平南县| 临汾市| 卓尼县| 尤溪县| 武胜县| 通州区| 南安市| 连平县| 黔西县| 商都县| 建湖县|