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

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