uboot step-14 串口初始化UART

uboot step-14 串口初始化UART

关于串口

对于嵌入式设备的开发,刚开始好多设备都无法使用,由于无法获得程序的运行状态,调试程序需要花费好多时间和精力,因此串口对于嵌入式程序的调试的作用显而易见,当串口不能用时,可能只能用led的亮灭来略微指示程序的运行状态,有了串口后,就能获得更多的调试信息了。S3C6410的串口使用和其它设备都差不多,初始化配置串口后,就可以收发数据了。首先来看下芯片手册上的串口框图:


uart.png

串口信号线有发送数据信号线TXDn,接受数据信号线RXDn,如上图,这两根信号线分别连到了发送移位寄存器和接收移位寄存器,另外串口模块还包含了两个64Bytes的FIFO用来收发数据。除此外还有一个控制单元和波特率产生模块,相应的部分都被连到了系统的外围总线上面。

串口寄存器

先来看下相关的寄存器:


uart1.png

S3C6410有UART0,1,2,3四个串口,上面只列出了串口0的相关寄存器,其他几个串口的寄存器说明和这个一样,下面来详细的说下:

ULCONx: 串口数据格式设置 数据长度,停止位长度 ,奇偶校验位
ulcon0.png
UCONx: 串口控制寄存器 选择时钟源,发送接收方式
ucon1.png

ucon2.png
UFCONx: FIFO控制寄存器 设置FIFO触发等级 使能
ufcon.png
UTRSTATx: 发送接收状态寄存器
utrstat.png
UERSTATx: 错误状态寄存器 帧错误,奇偶校验错误等
uerstat.png
UFSTATx: FIFO 状态寄存器
ufstat.png
UTXx: 发送数据寄存器 将要发送的数据丢给它
UTX.png
URXx: 接收数据寄存器 从这个寄存器获得收到的数据
URX.png
UBRDIV : 波特率分频值寄存器
UBRDIV.png
UDIVSLOT: 波特率分频值小数部分(我起的名字。。。)
slot.png

串口初始化

串口初始化中需要完成的任务主要有以下几个:

  • 配置相关GPIO引脚功能为从串口功能
  • 设置ULCONx寄存器来设置串口数据格式,数据位长度,停止位长度,奇偶校验位等
  • 设置串口控制寄存器UCONx,选择串口时钟源,收发数据模式:中断,轮询,DMA中断等
  • 设置波特率分频数寄存器和波特率分频值小数部分寄存器
  • 设置FIFO控制寄存器,是否使能FIFO等
波特率设置
baud.png

波特率分频值设置:
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 ULCON0     (*((volatile unsigned long *)0x7F005000))
#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))
#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 */
    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); 
}

此去经年
zhaiyk@sina.cn
August 12, 2016

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • SPI通信实验 SPI简介 串行外设接口(Serial Peripheral Interface Bus,SPI)...
    btskyrmb阅读 9,109评论 1 12
  • 姓名:周崇杰 学号:16040120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 1,406评论 0 6
  • 产品描述 工作频段 **CC1100: **400-464 MHz and 800-928MHzCC1101: 3...
    Alex_Lin阅读 4,366评论 1 0
  • 一切,源于热爱! 晨诵后,研究剧本《德国,一群老鼠的童话》。第二节课,杨宁老师带着孩子们读剧本,选演员。在竞选“莉...
    尹泽媛阅读 128评论 0 1
  • 我觉得 我完全不得不承认 长大到一定岁数 就会没有兴趣去认识新的朋友 21岁之前还未实习的我 从来都不会这么想 那...
    张春美Z阅读 213评论 0 0