stm8s 串口通讯源码程序(8位数据,奇校验,2个停止位)
2014-12-07 00:19
295 查看
串口初始化第一步,配置波特率,波特率是和时钟相关的,因此首先要配置时钟,时钟的配置参见上一篇博客。stm8s主时钟设置
如果在串口初始化中,如果串口时钟没有打开,请在主时钟配置中打开串口时钟。
配置波特率,stm8s的波特率,时钟,波特率寄存器值的计算相比avr和51又是巨大的进步,stm8s算波特率寄存器值只要Fmaster/波特率就可以了,不需要加加减减。
![](https://img-blog.csdn.net/20141207000741178?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemVyb3VidW50dQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是在写入寄存器时需要注意。
一,先写BBR2,再写BBR1。
二,BBR2写的是高四位和低四位,BBR1是中间八位,例如,Fmaster = 8 mhz,波特率1200,求得BBR寄存器值为8000000/1200 = 0x1A0A,那么写入寄存器的值就是BBR2=1A,BBR1=A0,顺序和数字都不能错。
![](https://img-blog.csdn.net/20141207001044593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemVyb3VidW50dQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
波特率搞定了,下面就是串口数据帧的配置,串口数据的具体协议,这里不再多加描述。
需要注意的是,stm8s的数据位数计算和avr/51的有所区别。
![](https://img-blog.csdn.net/20141207001217081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemVyb3VidW50dQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
看图。假设一个帧定义的是1个开始位---8位数据---1校验位---n停止位。在avr设置中,寄存器配置算他是8位数据配置,51太久不记得了应该也是算8位,但是在stm中,寄存器配置是9位数据(8位数据加1位校验位),需要对寄存器UART_CR1中的M位写1。
这里可知,stm8s的校验位也算数据位!!!stm只支持8位数据加一位校验位或者9位数据不加校验的形式,不支持9为数据加1位校验位的格式。当然这点只是推测。
---------
串口初始化源码
发送数据源码
中断接收更新
其实很简单,不过stvd和iar的中断写法不太一样。这里就不详细说了。需要说的是两点。
第一是stvd的中断处理函数不能写在stm8s_interrupt_vector,c文件中,应该写在其他文件然后全局声明,在stm8s_interrupt_vector,c调用就可以了。如果写到stm8s_interrupt_vector,c中,那么有可能会有一些奇怪的段重合问题,这应该是编译器的限制,具体我会在另一篇文章中写出。同样的其他任何中断处理函数都不建议写到这个文件。只调用不定义。
第二是,不要忘记对UART_SR中的接收标志位清零。同样的在stm8的所有中断,都需要在最后清除标志位,包括但不限于串口,定时等。有个例外是外部中断不需要清除中断标志位(据说stm8l的同样需要,我当前没有该芯片不能实测)
如果在串口初始化中,如果串口时钟没有打开,请在主时钟配置中打开串口时钟。
配置波特率,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的同样需要,我当前没有该芯片不能实测)
相关文章推荐
- 两种方法实现STM32F103向串口一直发送数据(程序源码,已测试)
- 使用SerialPort类设计串口通讯程序
- 使用SerialPort类设计串口通讯程序
- GPS串口数据接收程序实例
- 递归导入access数据winform程序源码
- Delphi:TComPort封装在DLL中,通讯时无法接收串口数据的解决办法
- 如何处理串口通讯数据重合与分批到达的问题
- 使用SerialPort类设计串口通讯程序
- 一个汇编写得GPS串口接收数据程序
- 使用SerialPort类设计串口通讯程序 (VS2005)[转载]
- 使用SerialPort 类设计串口通讯程序
- C#源码读取excel数据到程序中-SQL SERVER-到dataset中
- 如何在串口通讯程序中处理数据包
- 一个显示地图数据,并实现简单浏览查询程序源码(SDK编写)
- VC中基于文档(SDI/MDI)程序中能直接用串口MSComm通讯控件吗?
- C#源码读取excel数据到程序中-SQL SERVER-到dataset中
- 使用Win32 API创建串口通讯程序
- 先写一个串口通讯的程序作开始吧!
- 如何处理串口通讯数据重合与分批到达的问题 2
- 要编写一个程序,控制串口通讯,java里面有...