您的位置:首页 > 其它

stm8s 串口通讯源码程序(8位数据,奇校验,2个停止位)

2014-12-07 00:19 295 查看
串口初始化第一步,配置波特率,波特率是和时钟相关的,因此首先要配置时钟,时钟的配置参见上一篇博客。stm8s主时钟设置

如果在串口初始化中,如果串口时钟没有打开,请在主时钟配置中打开串口时钟。

配置波特率,stm8s的波特率,时钟,波特率寄存器值的计算相比avr和51又是巨大的进步,stm8s算波特率寄存器值只要Fmaster/波特率就可以了,不需要加加减减。



但是在写入寄存器时需要注意。

一,先写BBR2,再写BBR1。

二,BBR2写的是高四位和低四位,BBR1是中间八位,例如,Fmaster = 8 mhz,波特率1200,求得BBR寄存器值为8000000/1200  =  0x1A0A,那么写入寄存器的值就是BBR2=1A,BBR1=A0,顺序和数字都不能错。

 


波特率搞定了,下面就是串口数据帧的配置,串口数据的具体协议,这里不再多加描述。

需要注意的是,stm8s的数据位数计算和avr/51的有所区别。



看图。假设一个帧定义的是1个开始位---8位数据---1校验位---n停止位。在avr设置中,寄存器配置算他是8位数据配置,51太久不记得了应该也是算8位,但是在stm中,寄存器配置是9位数据(8位数据加1位校验位),需要对寄存器UART_CR1中的M位写1。

这里可知,stm8s的校验位也算数据位!!!stm只支持8位数据加一位校验位或者9位数据不加校验的形式,不支持9为数据加1位校验位的格式。当然这点只是推测。

---------

串口初始化源码

void uart_init(void)
{
UART1_CR2 = 0;				//关闭串口
UART1_CR1 |= 0X17;			//9位,奇校验,校验中断开
UART1_CR3 |= 0X20;			//两个停止位
UART1_BRR2 = 0X1c;			//Fmaster / 1200 =1A0c
UART1_BRR1 = 0Xa0;
UART1_CR2 |= 0X2C;			//打开串口

}


发送数据源码

void uart_transmit(unsigned char data)
{
while((UART1_SR & 0x80) == 0x00);
UART1_DR = data;

}

中断接收更新

其实很简单,不过stvd和iar的中断写法不太一样。这里就不详细说了。需要说的是两点。

第一是stvd的中断处理函数不能写在stm8s_interrupt_vector,c文件中,应该写在其他文件然后全局声明,在stm8s_interrupt_vector,c调用就可以了。如果写到stm8s_interrupt_vector,c中,那么有可能会有一些奇怪的段重合问题,这应该是编译器的限制,具体我会在另一篇文章中写出。同样的其他任何中断处理函数都不建议写到这个文件。只调用不定义。

第二是,不要忘记对UART_SR中的接收标志位清零。同样的在stm8的所有中断,都需要在最后清除标志位,包括但不限于串口,定时等。有个例外是外部中断不需要清除中断标志位(据说stm8l的同样需要,我当前没有该芯片不能实测)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm8 单片机