最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

STM32串口使用IDLE中斷接收不定長數(shù)據(jù)原理與源程序

出處:eefocus 發(fā)布于:2018-11-29 13:25:32

  今天說一下STM32單片機的接收不定長度字節(jié)數(shù)據(jù)的方法。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以接收不定長字節(jié)的數(shù)據(jù),由于STM32屬于ARM單片機,所以這篇文章的方法也適合其他的ARM單片機。

  IDLE中斷什么時候發(fā)生?

  IDLE就是串口收到一幀數(shù)據(jù)后,發(fā)生的中斷。什么是一幀數(shù)據(jù)呢?比如說給單片機發(fā)來1個字節(jié),或者發(fā)來8個字節(jié),這些發(fā)來的數(shù)據(jù),就稱為一幀數(shù)據(jù),也可以叫做一包數(shù)據(jù)。

  如何判斷一幀數(shù)據(jù)結(jié)束,就是我們今天討論的問題。因為很多項目中都要用到這個,因為只有接收到一幀數(shù)據(jù)以后,你才可以判斷這次收了幾個字節(jié)和每個字節(jié)的內(nèi)容是否符合協(xié)議要求。

  看了前面IDLE中斷的定義,你就會明白了,一幀數(shù)據(jù)結(jié)束后,就會產(chǎn)生IDLE中斷。這個中斷真是太TMD有用了。省去了好多判斷的麻煩。

  如何配置好IDLE中斷?

  下面我們就配置好串口IDLE中斷吧。

 

  這是串口CR1寄存器,其中,對bit4寫1開啟IDLE中斷,對bit5寫1開啟接收數(shù)據(jù)中斷。(注意:不同系列的STM32,對應的寄存器位可能不同)(RXNE中斷和IDLE中斷的區(qū)別?

  當接收到1個字節(jié),就會產(chǎn)生RXNE中斷,當接收到一幀數(shù)據(jù),就會產(chǎn)生IDLE中斷。比如給單片機性發(fā)送了8個字節(jié),就會產(chǎn)生8次RXNE中斷,1次IDLE中斷。)

 

  這是狀態(tài)寄存器,當串口接收到數(shù)據(jù)時,bit5就會自動變成1,當接收完一幀數(shù)據(jù)后,bit4就會變成1.

  需要注意的是,在中斷函數(shù)里面,需要把對應的位清0,否則會影響下數(shù)據(jù)的接收。比如RXNE接收數(shù)據(jù)中斷,只要把接收到的一個字節(jié)讀出來,就會清除這個中斷。IDLE中斷,如何是F0系列的單片機,需要用ICR寄存器來清除,如果是F1系列的單片機,清除方法是“先讀SR寄存器,再讀DR寄存器”。(我怎么知道?手冊上寫的)下面以STM32F103為例給出源程序。

  我們先來看程序中的主要部分。

  串口初始化函數(shù)片段

 
 

  如果你原來的串口初始化函數(shù)具有打開串口接收中斷的話,實際上就是在初始化函數(shù)中多了一條打開空閑中斷的語句。

  串口中斷函數(shù)

 

  串口中斷函數(shù)里面,重要的兩條語句,就是上圖中圈出來的兩條語句。條語句用來判斷是否接收到1個字節(jié),第二條語句用來判斷是否接收到1幀數(shù)據(jù)。(是不是感覺超級方便?媽媽再也不用擔心我如何判斷是否接收完1幀數(shù)據(jù)了。)主函數(shù)

 

  我寫的這個主函數(shù),是用來驗證接收的正確性的。RxCounter表示的是這一幀數(shù)據(jù)有幾個字節(jié),接收完一幀數(shù)據(jù),會在中斷函數(shù)里面把ReceiveState置1,然后,通過串口把接收到的數(shù)據(jù)發(fā)送回串口。這樣,既驗證了接收了多少字節(jié)的正確性,又驗證了接收到的數(shù)據(jù)是否正確。

 

  上圖是結(jié)果驗證。

  /**

  ******************************************************************************* @file    串口接收不定長字節(jié)數(shù)據(jù)

  * @author  瑞生

  * @version V1.0

  * @date    2015.10.23

  * @brief   Main program body

  *************************************************************************************************************************************************************/

  /* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"

  #include "uart.h"

  volatile uint8_t aRxBuffer[100]={0x00};

  volatile uint8_t RxCounter=0;

  volatile uint8_t ReceiveState=0;

  /**

  * @brief  Main program.

  * @param  None

  * @retval None

  */

  int main(void)

  {

  uint8_t i=0;

  USART1_Init();

  while (1)

  {

  if(ReceiveState==1)//如果接收到1幀數(shù)據(jù)

  {

  ReceiveState=0;

  i=0;

  while(RxCounter--)// 把接收到數(shù)據(jù)發(fā)送回串口{

  USART_SendData(USART1, aRxBuffer[i++]);

  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}

  RxCounter=0;

  }

  }

  }

關(guān)鍵詞:STM32,串口,IDLE,中斷接收,不定長數(shù)據(jù),

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!