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

2020-02-18来源: eefocus关键字:stm8s  串口通讯  奇校验

串口初始化第一步,配置波特率,波特率是和时钟相关的,因此首先要配置时钟,时钟的配置参见上一篇博客。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的同样需要,我当前没有该芯片不能实测)

关键字:stm8s  串口通讯  奇校验 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488618.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm8s 串行通信发送正常,无法接收
下一篇:STM8L151系列 单通道ADC数模转换

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。这里说下配置过程:时钟自动切换,开启切换中断在中断里面清除中断标志,使能CSS并开启CSS中断CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率窗口输出配置信息:用手触碰PA1、PA2引脚使外部晶振失效串口输出CSS中断
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
STM8S103之时钟设置
最大时钟(指的是system clock):外部晶振24MHz,内部高速RC16MHz三个时钟源:外部晶振、内部高速RC(上电默认) +内部低速RC几个时钟:master clock(即sytem clock),fcpu,外设时钟、AWU时钟调用库函数中CLK_ClockSwitchConfig,参考库函数clk_clockselection,但是分频还得进一步设置上电默认:内部高速RC,HSIDIV=/8,CPUDIV=/1,外部时钟全使能,查看相关寄存器的Reset value
发表于 2020-03-09
STM8S103之时钟设置
STM8S如何跑24M的HSE晶振
就这么几步,第一步: 检查STM8s.h头文件配置/**  * @brief  In the following line adjust the value of External High Speed oscillator (HSE)   used in your application   Tip: To avoid modifying this file each time you need to use different HSE, you        can define the HSE value in your
发表于 2020-03-08
STM8S开发入门之使用EWSTM8(IAR STM8S)新建工程点亮一个LED
1、预先安装好EWSTM8(IAR STM8)软件,全称为IAR Embedded Workbench for STMicroelectronics STM8 IDE2、下载好STM8S标准库,此处所用标准库为STM8S_StdPeriph_Lib V2.3.13、新建个文件夹(名称自定),作为项目所在文件夹,并在项目文件夹里再新建两个文件夹,此处分别命名为FWLIB和USER。(注:这两个文件夹名字可以按你们自己意思取,无限制,如可以取HWLIB、SYSLIB、MYLIB、MYAPP、MYABC、XZY等)4、将STM8S标准库(STM8S_StdPeriph_Lib V2.3.1)——Project
发表于 2020-03-08
STM8S开发入门之使用EWSTM8(IAR STM8S)新建工程点亮一个LED
STM8L052定时器1配置30S
@[TOC]STM8L TIM1相关配置Tim1基本介绍TIM1由一个由可编程预分频器驱动的16位上下自动重载计数器组成。定时器可用于多种用途,包括:•时基生成•测量输入信号的脉冲长度(输入捕获)•生成输出波形(输出比较,PWM和单脉冲模式)•各种事件的中断功能(捕获,比较,溢出,中断,触发)•捕获,比较,溢出事件的DMA请求功能•与其他定时器或外部信号同步(外部时钟,复位,触发可校准)。该定时器非常适用于各种控制应用,包括那些需要具有互补输出和死区时间插入的中心对齐PWM功能的应用。定时器时钟可以来自内部时钟,也可以来自可通过配置寄存器选择的外部源。配置以下代码 自己配置了一个30S定时器,使用系统内部高速时钟16M,1600
发表于 2020-03-06
STM8S触摸按键固件库详解
由于刚好有小项目需要用到触摸按键,stm8s可以节约一块触摸按键的片子,并且成本比较低。在某些对成本比较敏感的应用还是有价值的。现将自己网上找到的资料与自己学习的心得记下与大家分析。ST的底层库对滚动条也支持,效果还是不错的一、原理分析ST的电容式触摸按键方案通过一个电阻和感应电极的电容CX构成的阻容(RC)网络的充电/放电时间来检测人体触摸所带来的电容变化。如上图所示,当人手按下时相当于感应电极上并联了一个电容Cx,增加了感应电极上的电容,感应电极进行充放电的时间会增加,从而检测到按键的状态。先用开关将 Cs(或 Cs+Cx)上的电放尽,然后断开开关,让 R 给 Cs(或 Cs+Cx)充电,当没有手指触摸的时候, Cs 的充电
发表于 2020-03-05
STM8S触摸按键固件库详解
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved