<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 USART 普通串口應用,調(diào)試總結(jié)

          STM32 USART 普通串口應用,調(diào)試總結(jié)

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

          程序剛初始化時,

          本文引用地址:http://www.ex-cimer.com/article/201611/318059.htm

          //設置為發(fā)送使能,接收使能

          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

          //值開啟接收中斷。

          USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

          在接收到數(shù)據(jù)后,把手冊拷貝到發(fā)送緩沖區(qū),然后開啟發(fā)送

          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--;
          }

          中斷中發(fā)送處理函數(shù)如下

          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); //關(guān)閉發(fā)送中斷
          }
          }
          }

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

          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)

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

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

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

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



          關(guān)鍵詞: STM32USART普通串

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();