新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 USART 普通串口應用,調試總結

        STM32 USART 普通串口應用,調試總結

        作者: 時間:2016-11-09 來源:網絡 收藏
        配置STM32L151CBT6,在普通串口模式。當初沒有好好看數據手冊,只是看著別人的例子寫出來一個程序,雖然效果出來了,但不明白其中一些問題的道理,帶著這些問題,問了同事,得到的答案,確實最低級的錯誤。這說明看數據手冊的重要性??闯绦蚝蛦栴}如下

        程序剛初始化時,

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

        //設置為發送使能,接收使能

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        //值開啟接收中斷。

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

        在接收到數據后,把手冊拷貝到發送緩沖區,然后開啟發送

        void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)
        {
        USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
        psCommBuf->pu8Tx_ptr = psCommBuf->au8TxBuf;
        USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
        g_sUsart1Buf.u16TxLen--;
        }

        中斷中發送處理函數如下

        void USART1_IRQHandler(void)
        {

        if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
        {
        //USART_ClearITPendingBit(USART1, USART_IT_TXE);
        //g_sUsart1Buf.u16TxLen--;
        //g_sUsart1Buf.pu8Tx_ptr++;
        if((g_sUsart1Buf.u16TxLen != 0) && (g_sUsart1Buf.pu8Tx_ptr < &g_sUsart1Buf.au8TxBuf[TX1_BUFFLEN-1]))
        {
        USART_SendData(USART1, *g_sUsart1Buf.pu8Tx_ptr++);
        g_sUsart1Buf.u16TxLen--;
        }
        else
        {
        USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //關閉發送中斷
        }
        }
        }

        目前應用的目的,是設備接收到什么串口數據,就返回什么數據,就這種模式得到的情況是,每次發送數據都會少最后一個字節

        TX:68 AA AA AA AA AA AA 68 13 00 DF 16 (09:59:55:759)
        RX00:68 AA AA AA AA AA AA 68 13 00 DF (09:59:55:917)

        后來解決了這個問題。需要注意幾個關鍵點,就能避免這個問題。

        1.開啟USART_ITConfig(USART1,USART_IT_TXE, ENABLE);時,就會立刻進入發送數據寄存器為空中斷。所以void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)中的USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
        g_sUsart1Buf.u16TxLen--;可以去掉,直接在中斷里面處理。否則會打亂中斷處理數據的順序。

        2.開啟中斷前一定要先清除響應的中斷標志位,否則可能出現一些不想要的數據,對于多次運行時,可能性比較大。

        3.中斷里面不要按照發送完成中斷才傳輸數據,因為這樣會造成進入中斷的時間變長,因為它要等到移位寄存器中的數據發送完成后才進行中斷。可以按照USART_IT_TXE進入中斷發送數據,等到最后一個數據時關閉USART_IT_TXE中斷,然后打開USART_IT_TC中斷。這樣既能保證進入中斷的時間短,也能保證最后一個數據即使在關掉串口時能真正傳送出去。



        關鍵詞: STM32USART普通串

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 靖州| 拜泉县| 加查县| 天等县| 浦城县| 城市| 佛冈县| 洛浦县| 石城县| 淳安县| 永安市| 江永县| 江源县| 漳州市| 武鸣县| 鄂托克旗| 苍溪县| 旺苍县| 晴隆县| 陆良县| 武胜县| 北流市| 犍为县| 荣昌县| 平湖市| 庄河市| 安塞县| 惠州市| 抚顺县| 连平县| 曲沃县| 左贡县| 郎溪县| 巴塘县| 五大连池市| 屏山县| 定州市| 伊春市| 新龙县| 镇远县| 盐池县|