學到定時器部分時,想要將調試信息輸出,故先把串口基本功能學了,才能方便後面的調試。
使用某寶上買的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;
}
}