STM8s串口2異步基本收發使用說明

學到定時器部分時,想要將調試信息輸出,故先把串口基本功能學了,才能方便後面的調試。
使用某寶上買的STM8S最小系統板,外部晶振爲8MHz的。HSI的誤差對串口波特率影響比較大,這裏使用外部晶振。
開發板芯片是105K4的,只有UART2,這裏把UART2的整體框圖放在下面,藍色矩形框是串口異步基本收發所用到的寄存器,可以看到,所要用到的寄存器很少。
在這裏插入圖片描述在這裏插入圖片描述
這裏先說下如何計算波特率以及誤差多少:
官方手冊已經給出:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
這裏我使用的波特率爲9600bps,然後主時鐘爲8M,這樣分頻因子爲8M/9600約等於833=0x341,計算的波特率爲8M/833=9603.8,誤差爲(9603.8-9600)/9600*100%約等於0.04%。
如何配置串口呢,看官方手冊說明:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
發送與接收幀結構相同,波特率一樣,唯一不同的是一個是發送,一個是接收,這裏我們設置幀格式爲,9位數據,偶校驗(注意:9位數據中校驗位佔了最後一位),1位停止位。波特率爲9600,由上面計算出來爲0x341,所以 UART2_BRR2=0x01,UART2_BRR1=0x34;

下面發一行字符串到串口顯示:

Send_String("Are you ok?");

串口打印輸出
在這裏插入圖片描述
下面從串口調試器發送字符到STM8,stm8將字符加一返回,看下圖:
在這裏插入圖片描述
串口代碼部分:

/* 函數名:Uart2_Init
 * 參數:無
 * 功能:UART2串口波特率初始化
 * 返回:無
 */
void Uart2_Init(void){//串口2初始化
  
  UART2_CR1_M=1;//設置字長爲9個數據位
  UART2_CR3_STOP=0x00;//1個停止位
  UART2_BRR2=0x01;//配置波特率爲9600,誤差0.04%
  UART2_BRR1=0x34;

 
  UART2_CR1_PS=0;//偶校驗
  UART2_CR1_PIEN=1;//奇偶校驗控制使能 
  
  // UART2_CR2_TIEN=1;//發送中斷使能
  UART2_CR2_TEN=1;//發送使能
  
  UART2_CR2_RIEN=1;//接收中斷使能
  UART2_CR2_REN=1;//接收使能
  Send_String("串口2初始化完成\r\n");
    
  
}
/* 函數名:Send_String
 * 參數:*string - 字符串首地址
 * 功能:UART2輸出字符串
 * 返回:無
 */
void Send_String(char * string){//發送字符串
  while(*string!='\0'){

    if(UART2_SR_TXE){//等待數據移到移位寄存器 
      UART2_DR=*string;    
      string++;
    }
       
  }
  
}

/* 函數名:Send_O
 * 參數: hex - 8位數據
 * 功能:輸出3位的十進制數據格式
 * 返回:無
 */
void Send_O(unsigned char hex){//發送8位16進制數據
  unsigned char i=3;
  while(i){
    if(UART2_SR_TXE){
      
      switch (i){ 
        
        case 3:
        
          UART2_DR=(hex/100)+'0';
          i--;
          break;
     
        case 2:
          UART2_DR=(hex%100/10)+'0';
          i--;
          break;
     
        case 1:  
          UART2_DR=(hex%10)+'0'; 
          i--;
          break;
        default : break;
      }
    }

  }
       
}

#pragma vector=22//UART2發送中斷
  __interrupt void UART2_RX_IRQHandler(void){
    

}
#pragma vector=23//UART2接收中斷
  __interrupt void UART2_TX_IRQHandler(void){
    
    if(UART2_SR_RXNE) {
      UART2_DR=UART2_DR+1;
      UART2_SR_RXNE=0;
    }

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