STM8教程-第十二章-串口及其应用.docx_第1页
STM8教程-第十二章-串口及其应用.docx_第2页
STM8教程-第十二章-串口及其应用.docx_第3页
STM8教程-第十二章-串口及其应用.docx_第4页
STM8教程-第十二章-串口及其应用.docx_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十二章 串口及其应用前面三节介绍了 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 iostm8s207rb.h 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 iostm8s207rb.h 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(rim); / 开全局中断 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; 串口调试助手的截图,而且我们在中断服务函数中做

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论