最近开始使用 stm8s103k3 单片机了。据说很好,确实不错。前几天已经试过了 GPIO , Timer2 , ADC 的功能, 唯独串口 UART 使用,破费周折,写出来,供大家借鉴。 我使用的是 stm8s 103k3,32 脚单片机,这个使用手册上说了 UART1,UART2,UART3 。但是引脚的功能图上只有 你打开 stm8s103k.h 的头文件,里面也只有 UART1 寄存器的定义说明。所以我认为只有 UART1 。既然有这个功 吧,我以为直接可以连接到电脑的串口( COM1), 就可以使用了,其实不可以。单片机即使写着提供 UART 通讯 接 MAX232 转接芯片,我就在这里耽误了许多时间。 1 、使用 stm8s103 上的串口和计算机 com 口通许的硬件连接: 2 、软件设置 ( 1 )发送数据配置 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 来设置
|