(五)嵌入式:设置UART波特率并实现转变字符串大小,实现人机交互

本文介绍了如何在Linux环境下,使用Marvell 88E6218开发板进行UART串口配置,包括波特率设置、数据传输以及实现人机交互。通过设置控制寄存器和波特率因子来调整波特率,通过编程实现了串口输出数据、输出字符串以及转变输入字符串大小写的功能,最后展示了人机交互的实现过程。
摘要由CSDN通过智能技术生成

本次实验使用开发板是美国Marvell公司生产的SOHO级网络通信微处理器芯片88E6218。开发环境是Ubuntu12.04,内核是UCLinux。
在这里插入图片描述
1.使用串口

本次课程主要是了解uart的使用,UART: Universal Asynchronous Receiver/Transmitter ,如图1-1所示:
在这里插入图片描述
图1-1 串口展示
实验是CPU往串口输入一个数据,然后串口会自动把该数据输出到串口终端,然后我们从串口终端输入字符,由串口接收到该字符后,传给CPU,由CPU执行相应的操作后打印出来。
首先,第一个实验是串口的波特率设置。根据数据手册,我们可以知道串口的基地址是0x8000_C840。如图1-2所示:
在这里插入图片描述

图1-2 串口基地址
其余的寄存器的地址也列出来了,在这里我们主要使用的寄存器是
LCR–控制寄存器,
LSR–状态寄存器,
RBR–接收数据寄存器,
THR–传输数据寄存器,
DLL和DLH是设置波特率的寄存器。

时序控制:
1.设置串口的波特率,首先要设置控制寄存器的D7位也就是第八位,如图1-3所示:
在这里插入图片描述

图1-3 设置串口控制寄存器
设置了这个位,就允许了读写DLL和DLH这两个寄存器,然后设置波特率。

计算波特率因子
baud factor=baud rate base/baud rate
baud rate base=8000000/16
由以上公式可以设置波特因子,将波特因子baud factor的第八位写入DLL寄存器,高八位写入DLH寄存器。这样就设置好了串口的波特率。

开始编程:见附录一
在虚拟机上面进入目录/s1/uClinux-dist,然后进入user,创建文件uart,在里面创建两个文件,serial.c 和Makefile,如图1-4所示:

在这里插入图片描述

图1-4 创建文件
然后将刚刚编写好的文件(附录1)复制进去,然后编写Makefile,如图1-5所示:
在这里插入图片描述

图1-5 编写Makefile

接着退到目录/s1/uClinux-dist/user下面,编辑Makefile,如图1-6所示,加入一行可以在编译的时候将这个uart目录页编译。
在这里插入图片描述
图1-6 编辑Makefile,添加代码
然后退出到目录/s1/uClinux-dist,下面执行make的编译命令,然后检查romfs/bin,可以看见下面已经生成了serial的命令。如图1-7所示
在这里插入图片描述
图1-7 检查romfs
接着启动开发板,下载新的zRomfs,进入shell之后运行serial,可以看见跟我们代码写的一样,会提示用法,如图1-8所示:
在这里插入图片描述
图1-8 输入提示
然后正确输入serial baud 38400,可以看见打印出设定的提示字符。如图1-9所示:
在这里插入图片描述
图1-9 输入设置波特率

2.使用串口输出数据

根据数据手册,我们可以知道,CPU从串口输出数据,是要将数据传到数据寄存器–THR,我们重新编写刚刚的设置波特率的程序实现输出一个字符,首先要添加代码,如图2-1所示:
在这里插入图片描述
图2-1 添加代码
判断是使用串口设置波特率还是纯输出数据,然后写好输出数据的函数,见附录2.
然后还是编译,下载到开发板试运行,这时候发现一个问题,提示输出字符的提示信息打印出来了,但是该字符却未打印出来,如图2-2所示,查阅资料,后才发现是printf函数将CPU输到串口的缓存数据给覆盖掉了,才未能打印出来,因此将printf函数全部注释掉,可以看见打印实现。
在这里插入图片描述
图2-2 输出被覆盖掉

输出被覆盖掉后修改代码,注释printf()函数。

在这里插入图片描述
图2-2修改后的代码(注释掉printf函数)
然后重新编译,下载,测试。
在这里插入图片描述
图2-2 修改代码之后的输出

接下来实现输出字符串的代码,输出字符串,只需要将字符串一个一个的输出,然后将字符串首地址加一,就可以实现一个一个的字符打印实现字符串的打印。在原来的代码上面继续添加函数,见附录3,然后还是编译,下载到开发板试运行,如图2-3所示:
在这里插入图片描述
图2-3 添加输出字符串的函数代码
然后编译,下载,测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值