1)編程UART_CR1的M位來定義字長。
2)在UART_CR3中編程停止位的位數。
3)按下列順序編寫波特率寄存器選擇要求的波特率。
a)UART_BRR2
b)UART_BRR1
4)設置UART_CR2中的TEN位來使能發送
5)把要發送的數據寫進UART_DR寄存器
main.c程序如下:
#include "stm8s103k.h"void UART1_Init(void)
{
UART1_CR2=0x00;//使發送禁用TEN=0;
UART1_CR1=0x00;//設置M字長,8位數據位
UART1_CR3=0x00;//1位停止位
UART1_BRR2=0x00;//00-0d:9600(fcpu=fmaster=2MHz)
UART1_BRR1=0x0d;//00-1a:4800; 01-34:2400
UART1_CR2=0x08;
}
main()
{
//fmaster=fcpu=2MHz
CLK_ECKR=0x00;
CLK_ICKR=0x01;
CLK_CMSR=0xe1;
CLK_SWR=0xe1;
CLK_CKDIVR=0x18;
UART1_Init();
while (1)
{
unsigned char i;
while(!(UART1_SR & 0x80));//發送寄存器數據是否轉移完
UART1_CR2=0x00;//a處
UART1_DR=0xB6;//要發送的數據
UART1_CR2=0x08;//b處
while((UART1_SR & 0x40) ==0);//發送是否完成
}
}上面的代碼是我反復實驗過的,如果不加a和b處代碼,則接收的數據不穩定,比如發送5,接收到的數據的串口多次開閉,則接收的數據可能是0xB6,或0x67,或0x3B.
(2)接收數據
1)編程UART_CR1的M位來定義字長。
2)在UART_CR3中編程停止位的位數。
3)按下列順序編寫波特率寄存器選擇要求的波特率。
a)UART_BRR2
b)UART_BRR1
4)設置UART_CR2中的REN位來使能接收
5)讀UART_DR寄存器
a)查詢:查詢SR中標志位RXNE (讀數據寄存器非空)
b)中斷:需使能CR2中的RIEN(接收中斷使能)
標志位查詢方式:
初始化:
void UART1_Init(void)
{
UART1_CR1 = 0x00; //8bit
UART1_CR3 = 0x00;//1 stop bit
UART1_BRR2 = 0x01;
UART1_BRR1 = 0x1A;//4800 baud rate
UART1_CR2 = 0x04;//enable REN
}Main()函數:
while (!(UART1_SR & 0x20));//Loop until the UART1 Receive Data Register is not empty
RxBuffer= UART1_DR; //Store the received byte in RxBuffer
中斷方式:
初始化:
void UART1_Init(void)
{
UART1_CR1 = 0x00; //8bit
UART1_CR3 = 0x00;//1 stop bit
UART1_BRR2 = 0x01;
UART1_BRR1 = 0x1A;//4800 baud rate
UART1_CR2 = 0x24;//enable REN and RIEN
}
UART1接收中斷函數:
@far @interrupt void UART1_RX_IRQHandler (void)
{
RxBuffer = UART1_DR; //Store the received byte in RxBuffer
return;
}
UART1接收中斷向量(設置中斷向量,即將中斷服務程序的入口填寫到中斷向量表中)
struct interrupt_vector const _vectab[] =
{
……
{0x82, UART1_RX_IRQHandler},
……
}(3)特別注意波特率的計算設置方式
波特率通過配置16位除法器UART_DIV來設置