最近开始运用stm8s103k3单片机了。听说很好,的确不错。前几天现已试过了GPIO,TImer2,ADC的功用,都比较简单,唯一串口UART运用,花费曲折,写出来,供我们学习。
我运用的是stm8s103k3,32脚单片机,这个运用手册上说了UART1,UART2,UART3。可是引脚的功用图上只要UART1,而且你翻开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来设置