关于串口

对于嵌入式设备的开发,刚开始好多设备都无法使用,由于无法获得程序的运行状态,调试程序需要花费好多时间和精力,因此串口对于嵌入式程序的调试的作用显而易见,当串口不能用时,可能只能用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/115200
16)-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 串口初始化的更多相关文章

  1. u-boot分析(八)----串口初始化

    u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手 ...

  2. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  3. Main.C中 IO口,中断及串口初始化

    void Port_Init(void) { //CAUTION:Follow the configuration order for setting the ports. // 1) setting ...

  4. 第三章之S5PV210串口初始化

    1,在start.S中执行373行b lowlevel_init跳转到/board/samsung/goni/lowlevel.S中,此代码中初始化一样硬件. 找到241行,此行执行URAT初始化,如 ...

  5. u-boot调试串口输出对应的系统函数

    接上Debug串口,启动机器,u-boot哗啦啦地打印一行行的字符.刚接触u-boot的时候,对机器后台做了什么,几乎一无所知. 如果要很有信心地定制出一个简单并且可靠的系统,或者快速完成一项新的任务 ...

  6. 十二、u-boot 调试--串口修改

    uboot 烧写进 norflash 进行调试 12.1 烧写后 串口不使能 内存不能使能 遍历代码,可以发现,在SDRAM 初始化之前,我们并没有设置时钟,但是SDRAM初始化后,我们已经开始用内存 ...

  7. S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)

    一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...

  8. 第2阶段——编写uboot之硬件初始化和制作链接脚本lds(1)

    目标: 1.关看门狗 2.设置时钟 3.初始化SDRAM (初始化寄存器以及清除bss段) 4.重定位 (将nand/nor中代码COPY到链接地址上,需要初始化nandflash,读flash) 5 ...

  9. uboot环境变量初始化

    一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...

随机推荐

  1. document.write的时机

    document.write第一次加载进入页面的时候会紧跟文档,写入内容.但是如果在文档已经加载完毕之后,再通过点击的方式调用函数的话会直接把整个文档覆盖掉.

  2. PHPCMS 第一节 新增菜单

    一.如何新增菜单 对于新手来说,一开始都有很多疑问,今天我们来开始慢慢分析,就先从这个菜单开始,如何新新增一个我下图框出来的这些呢? 操作如下图 接着就按打开的那个新增页面的提示信息填资料 模块名:就 ...

  3. modCount到底是干什么的呢

    在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影,modCount字面意思就是修改次数,但为什么要记录modCount的修改次数呢 ...

  4. numpy 加速 以及 ipython

    先安装openblas, 然后用pip 安装numpy sudo ln -s /usr/lib64/libopenblas-r0.2.14.so /usr/lib64/libopenblas.so 为 ...

  5. 小白安装Android Studio

    原文 Android Studio 安装 步骤1 - 系统要求 可以在以下的操作系统开始 Android 应用程序开发: Microsoft® Windows® 8/7/Vista/2003 (32 ...

  6. 吴裕雄--天生自然 PYTHON3开发学习:面向对象

    class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello wor ...

  7. ZZJ_淘淘商城项目:day03(淘淘商城02 - 后台系统功能实现)

    1.   今日大纲 1.  学习Nginx的使用 2.  实现商品的管理 a)       新增商品 b)       查询商品列表 c)       编辑商品 d)       删除商品 e)    ...

  8. A brief introduction to complex analysis

    \(\underline{Def:}\)A func \(U(\subset \mathbb{C}) \stackrel{f}\longrightarrow \mathbb{C}\)is (compl ...

  9. 新年在家学java之基础篇--循环&数组

    因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...

  10. text-overflow属性

    text-overflow属性有两个值, 默认值是clip:当对象内文本溢出时不显示裁切掉. 另一个就是:ellipsis:对象内文本溢出时显示省略标记(...). 使用text-overflow:e ...