STM8S103之串口中斷接收

 

本篇博文最後修改時間:2017年07月10日 21:48。

 

一、簡介

本文以STM8S103F3P6編程爲例,介紹STM8S103F3P6串口中斷接收。

 

二、實驗平臺

電腦平臺:Windows7 64位旗艦

編譯軟件:IAR

硬件平臺:STM8S103F3P6

 

三、版權聲明

博主:_懵懂

聲明:此博客僅供參考不做任何商業用途,最終解釋權歸原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

懵懂之MCU交流羣:136384801

 

四、實驗前提

1、在進行本文步驟前,請先安裝IAR  EWSTM8-EV-1311版本;準備好STM8S103F3P6硬件平臺。

         

五、基礎知識

暫無

 

六、源碼地址

暫無

 

七、實驗內容

1.系統時鐘初始化爲內部16M

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //時鐘   初始化時鐘爲1分頻 16M   2分頻8M


2.初始化串口

  UART1_DeInit();
  UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
  
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

  UART1_Cmd(ENABLE);
  enableInterrupts(); 

 

3.編寫主函數

void main(void)
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  Init_UART1();
  enableInterrupts(); 
 /* Infinite loop */
  while (1)
  {
    if(flagpacker)
    {
      flagpacker = 0;
      
      for(unsigned char num = 0; num < length;num++)
        Send(Rxpacker[num]);
    }
  }
}

 

4.編寫中斷服務函數

unsigned char flagpacker;   //全局變量    是否完整接收一個數據包  
unsigned char Rxpacker[255];    //全局變量    完整數據包 
unsigned char length;    //數據長度
 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
 {
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
 unsigned char RxBuf;                                             //臨時接收  
  static unsigned char RxData[255];//接收數據緩存區  
  static unsigned char count;                                     //串口接收數據長度  
  static unsigned char rec;  //  判斷是否正在接收數據
   UART1_ClearITPendingBit(UART1_IT_RXNE);
   RxBuf = UART1_ReceiveData8();
   
  if(RxBuf == (0xcc))  //幀頭
  {  
    rec= 1;  
    count = 0;  
    flagpacker = 0;  
    return ;  
  }  
  if(RxBuf  == (0xcd))  //幀尾
  {  
    rec= 0;  
    //此處可以添加校驗碼  
    length = count;
    for(unsigned char i = 0; i<count;i++)  
    {  
      Rxpacker[i] =RxData[i];  
    }  
    flagpacker = 1;//告訴系統已接收一個完整的數據包   
    return ;  
  }  
  if(rec)                                              //判斷是否處於接收狀態  
  {  
    RxData[count++] = RxBuf;  
  }    
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章