您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > STM8教程-第十二章串口及其应用
第十二章串口及其应用前面三节介绍了STM8的IO口以及时钟编程。这一节我们将学习STM8的串口。通过本节学习,你将了解到STM8串口的基本使用方法。前面三节介绍了STM8的IO口操作以及时钟编程。这一节我们将学习STM8的串口。作为软件开发重要的调试手段,串口的作用是很大的。在调试的时候可以用来查看和输入相关的信息。在使用的时候,串口也是一个和外设(比如GPS,GPRS模块等)通信的重要渠道。STM8的串口资源相当丰富的,功能也相当强劲。STM8有波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范接下来我们将从寄存器层面,告诉您如何设置串口,以达到我们最基本的通信功能。本实例中,我们将实现利用串口1不停的打印一个信息到电脑上,以及例程二的同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。串口最基本的设置,就是波特率的设置。STM8的串口使用是很简单的。配置步骤:1.编程UART_CR1的M位来定义字长。2.在UART_CR3中编程停止位的位数。3.按下列顺序编写波特率寄存器选择要求的波特率a)UART_BRR2b)UART_BRR14.设置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,也就是设置停止位数LINENLin模式的使能,这里我们不详细说明STOP设置停止位数001个停止位01保留102个停止位111.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进行通信,下面开始我们的例程一,简单的发送数据给终端例程一、简单数据发送#includeiostm8s207rb.hvoiddelay_ms(intvalue);intmain(void){unsignedchartemp=0;CLK_CKDIVR=0x00;//主频为16MUART1_CR1=0x00;//关闭UART,设置数据位8位,禁止奇偶效验,禁止中断UART1_CR3=0x00;//一位停止位,默认值UART1_BRR2=0x0b;//设置波特率为115200UART1_BRR1=0x08;UART1_CR2_TEN=1;//使能发送while(1){while(!UART1_SR_TC);//等待一帧发送完毕,再传送下一帧UART1_DR=temp;temp++;if(temp=255)temp=0;delay_ms(100);}}/*********************************************简单延时程序*********************************************/voiddelay_ms(intvalue){inti,j;if(value1)value=1;for(i=0;i!=value;++i)for(j=0;j!=5000;++j);}编译下载后,打开串口调试助手,复位单片机就可以看到对应的数据输出,如下图:可以看出是从0递进的数,因为我们的串口设置是115200波特率,所以串口调试助手也对应这个波特率例程二、串口接收及发送我们实现的功能是通过串口接收电脑的数据,并把对应的数据发送给电脑。这里我们采用了中断的方式来接受。中断这个字眼是第一次出现在我们的实验中,所以略为简要说一下中断。简单来说中断的产生会让CPU停止当前的工作而转到特定的地方运行预先设定好的程序。我们的例程就是在接到到串口的数据后,由单片机硬件置位而产生一次接收数据的中断,本身中断向量号是18,但是IAR的规定要加上2,所以这个中断号是20,转为16进制是0x14因此我们可以在这个中断的服务函数中把刚接受到数据发回给电脑,软件代码如下:#includeiostm8s207rb.hvoiddelay_ms(intvalue);intmain(void){CLK_CKDIVR=0x00;//主频为16MUART1_CR1=0x00;//关闭UART,设置数据位8位,//禁止奇偶效验,禁止中断UART1_CR3=0x00;//一位停止位,默认值UART1_BRR2=0x0b;//设置波特率为115200UART1_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);}}/*********************************************简单延时程序*********************************************/voiddelay_ms(intvalue){inti,j;if(value1)value=1;for(i=0;i!=value;++i)for(j=0;j!=5000;++j);}#pragmavector=0x14__interruptvoidUART1_RX_IRQHandler(void){unsignedchartemp;temp=UART1_DR;PD_ODR_ODR0=~PD_ODR_ODR0;//指示灯while(!UART1_SR_TC);//等待一帧发送完毕,再传送下一帧UART1_DR=temp;}串口调试助手的截图,而且我们在中断服务函数中做了一个指示灯串口在调试中是占很重要的一部分,我们所有开发的例子都是在串口调试或者LCD显示中排错的,在没有仿真器的前提下,通过可以利用的有限资源来调试可以锻炼调试水平。因为在系统调试中有没有仿真器效果一样,更多的是通过printf函数来调试系统STM8S207的UART是很强大的一个外设,我们只是编写了其中最简单的串口,剩下留给读者自己研究
本文标题:STM8教程-第十二章串口及其应用
链接地址:https://www.777doc.com/doc-2860999 .html