STM8教程-第十二章 串口及其应用

2020-04-03 11:50

第十二章 串口及其应用

前面三节介绍了 STM8 的 IO 口以及时钟编程。这一节我们将学习 STM8 的串口。通过本节学习,你将了解到 STM8 串口的基本使用方法。

前面三节介绍了STM8的IO口操作以及时钟编程。这一节我们将学习STM8的串口。作为软件开发重要的调试手段,串口的作用是很大的。在调试的时候可以用来查看和输入相关的信息。在使用的时候,串口也是一个和外设(比如GPS,GPRS模块等)通信的重要渠道。 STM8的串口资源相当丰富的,功能也相当强劲。STM8有波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范

接下来我们将从寄存器层面,告诉您如何设置串口,以达到我们最基本的通信功能。本实例中,我们将实现利用串口1不停的打印一个信息到电脑上,以及例程二的同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。 串口最基本的设置,就是波特率的设置。STM8 的串口使用是很简单的。 配置步骤:

1. 编程 UART_CR1 的 M 位来定义字长。 2. 在 UART_CR3 中编程停止位的位数。

3. 按下列顺序编写波特率寄存器选择要求的波特率

a) UART_BRR2 b) UART_BRR1

4. 设置 UART_CR2 中的 TE 位来使能发送模式

5 把要发送的数据写进 UART_DR 寄存器(此动作清除 TXE 位)。

在只有一个缓冲器的情况下,对每个待发送的数据重复此步骤。

下面,我们就简单介绍下这几个与串口基本配置直接相关的寄存器。

1、 UARTx_CR1 (x 是指对应的 UART,STM8 有多个 UART,详细请见对应数据手册)

R8、T8 是在数据字长定义为 9 位时才使用的,对应的是接收第 8 位和发送第 8位(都是从第 0 位开始算)

UARTD 是 UART 的使能位,0的时候使能 UART,1的时候不可以用 UART,默认 0,M 是定义串口的字长,0为8位字长,1是9位的字长

下面的 PECE,PS,PIEN 分别是奇偶效验,奇偶效验选择,效验中断使能。由于 我们没有定义奇偶效验在此不再详细说明,默认就可以。 2、 UARTx_CR2

控制寄存器 2 主要负责管理中断和发送接收的使能 TIEN、TCIEN、RIEN、ILIEN 分别对应发送中断,发送完成中断,接收中断以及IDLE 中断

TEN 是发送使能,当 TEN = 1 的时候我们就可以通过串口进行发送数据,当然前提是我们已经设置好对应的寄存器

REN 是接收使能,当 REN = 1 的时候我们可以通过串口接收其它设备的数据 RWU 接收唤醒 SBK 发送断开帧

3、 UARTx_CR3

在这个寄存器中我们主要使用了 STOP,也就是设置停止位数 LINEN Lin 模式的使能,这里我们不详细说明 STOP 设置停止位数 00 1 个停止位

01 保留

10 2 个停止位 11 1.5 个停止位

CLKEN 时钟使能,由于我们没有采用 3 根线,只用了 UART_RX 和 UART_TX 所以不需要设置这个寄存器,默认就可以

CPOL、CPHA、LBCL 对应着的是时钟极性,时钟相位以及最后一个时钟脉冲,详细介绍请见寄存器手册 4、 波特率有关寄存器

5、 数据寄存器

发送和接受的数据通过这个寄存器的读写就可以实现

6、 状态寄存器

通过读取这个寄存器可以知道 UART 的工作状态

我们本实验就需要查询这个寄存器的某个位,来清除数据是否发送完毕 TXE 发送数据寄存器空 0 的时候非空, 1 为空 TC 发送完成 0 未完成 1 完成发送

RXNE 读数据寄存器非空 0 数据没有收到 1 数据收到

其它的位分别为检查到 IDLE 总线,过载错误,噪声标志位,帧错误,奇偶效验错误

简单的寄存器就结束到此,除此之外还有其它很多寄存器望读者查阅寄存器手册 有了以上的基础,我们可以开始这一节的软件编写了 在开始软件代码编程之前,先说明一下我们的硬件

我们的实验板是共用一根 USB 线实现多功能操作,分别是下载程序功能,供电功能以及串口功能,传统的串口需要串口接口,考虑到方便我们自己通过 PL2303把串口转成可以通过 USB 进行通信,下面开始我们的例程一,简单的发送数据给 终端

例程一、简单数据发送 #include \ void delay_ms(int value); int main( void ) {

unsigned char temp = 0;

CLK_CKDIVR = 0x00; //主频为16M

UART1_CR1 = 0x00; //关闭UART,设置数据位8位,禁止奇偶效验,禁止中断 UART1_CR3 = 0x00; //一位停止位,默认值 UART1_BRR2 = 0x0b; //设置波特率为115200 UART1_BRR1 = 0x08;

UART1_CR2_TEN = 1; //使能发送 while(1) {

while(!UART1_SR_TC); //等待一帧发送完毕,再传送下一帧 UART1_DR = temp;

temp++;

if(temp>=255) temp = 0;

delay_ms(100); } } /*

********************************************

简单延时程序

******************************************** */

void delay_ms(int value) {

int i,j;

if(value < 1) value = 1;

for(i=0;i!=value;++i) for(j=0;j!=5000;++j); }

编译下载后,打开串口调试助手,复位单片机就可以看到对应的数据输出,如下图:

可以看出是从 0 递进的数,因为我们的串口设置是 115200 波特率,所以串口调试助手也对应这个波特率

例程二、串口接收及发送

我们实现的功能是通过串口接收电脑的数据,并把对应的数据发送给电脑。这里我们采用了中断的方式来接受。中断这个字眼是第一次出现在我们的实验中,所以略为简要说一下中断。简单来说中断的产生会让 CPU 停止当前的工作而转到特定的地方运行预先设定好的程序。我们的例程就是在接到到串口的数据后,由单片机硬件置位而产生一次接收数据的中断,本身中断向量号是 18,但是 IAR 的规定要加上 2,所以这个中断号是 20,转为 16 进制是 0x14 因此我们可以在这个中断的服务函数中把刚接受到数据发回给电脑,软件代码如下:

#include \ void delay_ms(int value); int main( void ) {

CLK_CKDIVR = 0x00; //主频为16M

UART1_CR1 = 0x00; //关闭UART,设置数据位8位, //禁止奇偶效验,禁止中断

UART1_CR3 = 0x00; //一位停止位,默认值 UART1_BRR2 = 0x0b; //设置波特率为115200 UART1_BRR1 = 0x08;

UART1_CR2_TEN = 1; //使能发送

UART1_CR2_RIEN= 1; //接收中断使能 UART1_CR2_REN = 1; //使能接收 PD_DDR_DDR0 = 1; PD_CR1_C10 = 1; PD_ODR_ODR0 = 1;

asm(\开全局中断 while(1) {

delay_ms(100); } } /*

******************************************** 简单延时程序

******************************************** */

void delay_ms(int value) {

int i,j;

if(value < 1) value = 1;

for(i=0;i!=value;++i)

for(j=0;j!=5000;++j); }

#pragma vector=0x14

__interrupt void UART1_RX_IRQHandler(void) {

unsigned char temp; temp = UART1_DR;

PD_ODR_ODR0 = ~PD_ODR_ODR0; //指示灯

while(!UART1_SR_TC); //等待一帧发送完毕,再传送下一帧 UART1_DR = temp; }

串口调试助手的截图,而且我们在中断服务函数中做了一个指示灯

串口在调试中是占很重要的一部分,我们所有开发的例子都是在串口调试或者LCD 显示中排错的,在没有仿真器的前提下,通过可以利用的有限资源来调试可以锻炼调试水平。因为在系统调试中有没有仿真器效果一样,更多的是通过printf 函数来调试系统

STM8S207 的 UART 是很强大的一个外设,我们只是编写了其中最简单的串口,剩 下留给读者自己研究


STM8教程-第十二章 串口及其应用.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:产科重点专科(学科)科室发展规划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: