15.uboot study 串口初始化
关于串口
对于嵌入式设备的开发,刚开始好多设备都无法使用,由于无法获得程序的运行状态,调试程序需要花费好多时间和精力,因此串口对于嵌入式程序的调试的作用显而易见,当串口不能用时,可能只能用led的亮灭来略微指示程序的运行状态,有了串口后,就能获得更多的调试信息了。S3C6410的串口使用和其它设备都差不多,初始化配置串口后,就可以收发数据了。首先来看下芯片手册上的串口框图:
串口信号线有发送数据信号线TXDn,接受数据信号线RXDn,如上图,这两根信号线分别连到了发送移位寄存器和接收移位寄存器,另外串口模块还包含了两个64Bytes的FIFO用来收发数据。除此外还有一个控制单元和波特率产生模块,相应的部分都被连到了系统的外围总线上面。
串口寄存器
先来看下相关的寄存器:
S3C6410有UART0,1,2,3四个串口,上面只列出了串口0的相关寄存器,其他几个串口的寄存器说明和这个一样,下面来详细的说下:
###### ULCONx: 串口数据格式设置 数据长度,停止位长度 ,奇偶校验位
UCONx: 串口控制寄存器 选择时钟源,发送接收方式
UFCONx: FIFO控制寄存器 设置FIFO触发等级 使能
UTRSTATx: 发送接收状态寄存器
UERSTATx: 错误状态寄存器 帧错误,奇偶校验错误等
UFSTATx: FIFO 状态寄存器
UTXx: 发送数据寄存器 将要发送的数据丢给它
URXx: 接收数据寄存器 从这个寄存器获得收到的数据
UBRDIV : 波特率分频值寄存器
UDIVSLOT: 波特率分频值小数部分(我起的名字。。。)
串口初始化
串口初始化中需要完成的任务主要有以下几个:
- 配置相关GPIO引脚功能为从串口功能
- 设置ULCONx寄存器来设置串口数据格式,数据位长度,停止位长度,奇偶校验位等
- 设置串口控制寄存器UCONx,选择串口时钟源,收发数据模式:中断,轮询,DMA中断等
- 设置波特率分频数寄存器和波特率分频值小数部分寄存器
- 设置FIFO控制寄存器,是否使能FIFO等
###### 波特率设置
波特率分频值设置:
DIV_VAL=(PCLK/(bps 16 ))-1
eg:
PCLK=66.5M=66500000
bps=115200 波特率
DIV_VAL=(66500000/11520016)-1=35.078
UBRDIVn=35
小数部分为0.078
UDIVSLOTn中1的个数 除以16=0.078
UDIVSLOTn中1的个数 =1.248=1
根据上表,所以UDIVSLOTn的值为0x0080;
代码实现
#define UCON0 (*((volatile unsigned long *)0x7F005004))
#define UFCON0 (*((volatile unsigned long *)0x7F005008))
#define UMCON0 (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0 (*((volatile unsigned long *)0x7F005018))
#define UTXH0 (*((volatile unsigned char *)0x7F005020))
#大专栏 15.uboot study 串口初始化eta-keyword">define URXH0 (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))
#define GPACON (*((volatile unsigned long *)0x7F008000))
#define PCLK 66500000
#define BOUD 115200
void uart_init(void)
{
GPACON &= ~0xff;
GPACON |= 0x22;
ULCON0 = 0x3; /* 数据位:8, 无较验, 停止位: 1, 8n1 */
UCON0 = 0x5; /* 使能UART发送、接收 */
UFCON0 = 0x01; /* FIFO ENABLE */
UMCON0 = 0;
/* 波特率 */
/* DIV_VAL = (PCLK / (bps x 16 ) ) - 1
* bps = 115200
* DIV_VAL = (66000000 / (115200 x 16 ) ) - 1
* = 35.08
*/
UBRDIV0 = (int)(PCLK/(BOUD*16)-1);
/* x/16 = 0.08
* x = 1
*/
UDIVSLOT0 = 0x1;
}
void putc(unsigned char c)
{
while (UFSTAT0 & (1<<14)); /* 如果TX FIFO满,等待 */
UTXH0 = c; /* 写数据 */
}
unsigned char getc(void)
{
unsigned char ret;
while ((UFSTAT0 & 0x7f) == 0); /* 如果RX FIFO空,等待 */
ret = URXH0; /* 取数据 */
if((ret == 0x0d) || (ret == 0x0a))
{
putc(0x0d);
putc(0x0a);
}
else
{
putc(ret);
}
return ret;
}
void uart_send_string(char *str)
{
while(*str)
{
putc(*str++);
}
putc(0x0d);
putc(0x0a);
}
转载本站原创内容请注明作者砦龑堃及出处http://ykzhai.top/2016/08/15/开发/嵌入式/s3c6410/15-uboot-study-串口初始化/
.donate_bar a.btn_donate{
display: inline-block;
width: 82px;
height: 82px;
background: url("http://img.t.sinajs.cn/t5/style/images/apps_PRF/e_media/btn_reward.gif") no-repeat;
_background: url("http://img.t.sinajs.cn/t5/style/images/apps_PRF/e_media/btn_reward.gif") no-repeat;
-webkit-transition: background 0s;
-moz-transition: background 0s;
-o-transition: background 0s;
-ms-transition: background 0s;
transition: background 0s;
}
.donate_bar a.btn_donate:hover{ background-position: 0px -82px;}
.donate_bar .donate_txt {
display: block;
color: #9d9d9d;
font: 14px/2 "Microsoft Yahei";
}
.bold{ font-weight: bold; }
.center{text-align: center}
.hidden{display:none;}
↑
若本文对您有帮助,求打赏~ 谢谢您的鼓励。
15.uboot study 串口初始化的更多相关文章
- u-boot分析(八)----串口初始化
u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1. 2440芯片手 ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
- Main.C中 IO口,中断及串口初始化
void Port_Init(void) { //CAUTION:Follow the configuration order for setting the ports. // 1) setting ...
- 第三章之S5PV210串口初始化
1,在start.S中执行373行b lowlevel_init跳转到/board/samsung/goni/lowlevel.S中,此代码中初始化一样硬件. 找到241行,此行执行URAT初始化,如 ...
- u-boot调试串口输出对应的系统函数
接上Debug串口,启动机器,u-boot哗啦啦地打印一行行的字符.刚接触u-boot的时候,对机器后台做了什么,几乎一无所知. 如果要很有信心地定制出一个简单并且可靠的系统,或者快速完成一项新的任务 ...
- 十二、u-boot 调试--串口修改
uboot 烧写进 norflash 进行调试 12.1 烧写后 串口不使能 内存不能使能 遍历代码,可以发现,在SDRAM 初始化之前,我们并没有设置时钟,但是SDRAM初始化后,我们已经开始用内存 ...
- S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)
一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...
- 第2阶段——编写uboot之硬件初始化和制作链接脚本lds(1)
目标: 1.关看门狗 2.设置时钟 3.初始化SDRAM (初始化寄存器以及清除bss段) 4.重定位 (将nand/nor中代码COPY到链接地址上,需要初始化nandflash,读flash) 5 ...
- uboot环境变量初始化
一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...
随机推荐
- Centos7.6环境中安装zabbix3.4
官网链接:https://www.zabbix.com/documentation/3.4/zh/manual/installation/install_from_packages 部署环境 虚拟机服 ...
- memset为int型数组初始化问题
头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int ...
- 四、NOSQL之Redis持久化缓存服务基础实战第三部
1.NOSQL的理解 NOSQL是不仅仅是SQL,说的就是sql的补充,但是不能替代SQL. nosql库:memcached.memcachedb.redis 2.redis 简介 Redis是一个 ...
- Linux mint OS
Linux mint OS Ctrl+Alt left or right : # Change workspace Goldendict + Goldendict-wordnet # Dict for ...
- [原]livekd使用问题记录
sysinternal suite中的livekd.exe可谓神器.可以用来观察本地内核的一些状态,当然抓内核dump再合适不过了. 在使用livekd的时候遇到了一些问题,现总结如下: 使用live ...
- webservice SOA
------------------认证问题
- Codeforces 1288B - Yet Another Meme Problem
题目大意: 令conc(a,b)函数得出的结果为将ab拼接得到的数字. 例如:conc(12,23)=1223 a和b不会包括前导0! 接下来,你已知A和B,问有多少对的(a,b)满足 1≤a≤A , ...
- Sequence Diagram时序图 - 应该是最简洁有力的业务了
直接看UML吧,一目了然,不用解释.自信男人,无须多言. 这是用ListView显示Post的流程. 这是Uppdate User Profile的流程.自信男人,无须多言.
- 51)PHP,一个数据库操作类的代码
<?php //类名,也习惯上(推荐)使用跟文件名相似的名字 //定义一个mysql连接类,该类可以连接mysql数据库 //并实现其单例模式 //该类的功能还能够完成如下基本mysql操作: ...
- 卸载python3
rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps 卸载pyhton3 whereis python3 |xargs rm -frv 删除 ...