×
嵌入式 > 技术百科 > 详情

学习笔记--stm8之二 uart 串口

发布时间:2024-05-19 发布时间:
|

ST

3合一开发板stm8学习之 uart

作者:萧星

程序功能:

接受超级终端输入的值 并显示出来


还得说点上次的 时钟的问题,因为后面可能很少看到配置时钟的部分 所以有必要澄清一下初始化时的状态------1.内部高速rc振荡器提供时钟源

16m


2.时钟分频为8


3.供cpu的时钟是his/8


Ok,现在大家对芯片默认状态有了一点了解,下面开始串口的研究。



Stm8的串口:主要功能:


1:支持异步传输所以成为UART

2


2:lin模式 主从


3 红外编码模式


4 智能卡模拟功能

以上功能并不是所有串口都支持,stm8最多的是3个串口

也不多说 串口应该是大家很熟悉的一种接口,怎么配置 要配置什么 也都很清楚 我就简单说一下配置的地方:


1 数据位


2停止位


3波特率


4使能发送或者接受模块(要中断功能的使能中断|)

这样uart就配置好了 可以发送和接收数据了

说几个主要标志位:

发送端:TXE

硬件置一 说明数据从寄存器移到了 移位寄存器 传输开始了,下一个数据可以写入寄存器了,此时如果使能相应中断 中断将会产生


TC


数据传输完成置位 在停止位i从移位寄存器发送完后tc置位


TXE和TC有什么区别?后面我说了一下自己的想法


接受部分:RXNE置一 接收端移位寄存器的值放到了寄存器中,接收完成可以读取接受的数据。相应中断标志位置位时产生中断。RXNE必须在下一个数据接收完成前清零,读接受寄存器和软件直接写0都可以清除该位。

其他扩展功能 请参考stm8 手册



Ok 现在通过程序 我们来看一下串口的通信配置过程:


配置串口


LINUART_CR1 = 0x00;CR1配置了很多的东西,数据位 校验位 校验中断等 这里配置为8为数据位 无校验 无校验中断


LINUART_CR3 = 0x00; 配置了 停止位 数据相位和极性(同步模式下,用来同步的)但是此处禁止了同步功能 配置为一个停止位


LINUART_BRR2 = 0x0B;


LINUART_BRR1 = 0x08; 这两个寄存器是配置串口波特率 总共是16位 :BRR1是16位中的中间8位,BBR2低4位是16位中的低四位,高4位是16位的高四位


这里我们配置为115200 即 16m/115200==139==0x008B


LINUART_CR2 = 0x0C; CR2用来配置接受使能和中断使能的寄存器,这里配置为接受发送使能




Ok 到此配置完成




发送接受程序:


while(1)


{



printf("nLINUART Example lease press 1 key from keyboar


下面 会给出内部程序




for (i=0;i<10000;i++);//一段延时


while (!(LINUART_SR & 0x20));//等到接受寄存器 不为空 SR中的RXEN位





RxBuffer = LINUART_DR; //读取接受的值 同时清除RXEN位


printf("Key Pressed = %c.n",RxBuffer);//打印输入的值


}




Ok 看一下 printf的 函数:


char putchar (char c)


{


if (c == 'n')


{



while (!(LINUART_SR & 0x40)); 等到发送完成再发送


LINUART_DR = ('r');


/* Wait transmission is completed */


while (!(LINUART_SR & 0x40));


}





while (!(LINUART_SR & 0x80)); 等到数据移到移位寄存器


LINUART_DR = (c);


/* Wait transmission is completed */


while (!(LINUART_SR & 0x80));




return (c);


}


关于 TC和RXEN感觉使用上没什么区别。唯一的区别就是每个字符的发送间隔不一样了。不知道理解对不对 这个向高手请教。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器