一、Exynos4412 UART 的特性

Exynos4412 中UART,有4 个独立的通道,每个通道都可以工作于中断模式或DMA 模式,即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。

使用系统时钟时,Exynos4412 的 UART 波特率可以达到 4Mbps 。波特率可以通过编程进行 。

Exynos4412 UART 的通道 0有 256 字节的发送 FIFO 和 256 字节的接收FIFO ;通道 1、4有 64 字节的发送 FIFO 和 64 字节的接收FIFO;通道 2、3有 16 字节的发送FIFO 和 16 字节 的接收 FIFO 。发送数据时, CPU 先将数据写入发送FIFO 中,然后 UART 会自动将FIFO 中的数据复制到“发送移位器” (Transmit Shifter )中,发送移位器将数据一位一位地发送到 TxDn 数据线上 (根据设定的格式,插入开始位 、较验和停止)。接收数据时,“移位器” (Receive Shifter )将 RxDn 数据线上的数据一位一位的接收进来,然后复制到FIFO 中, CPU即可从中读取数据。

Exynos4412 UART的每个通道支持停止位有 1位、 2位,数据位有 5、6、7或 8位,支持校验功能,另外还有红外发送 /接收功能。

Exynos4412 UART结构图:

二、uart初始化步骤:

1、将所涉及的UART通道管脚设为UART功能

      比如 UART 通道 0中, GPA0_0 、GPA0_1 分别用作 RXD0 、TXD0,要使用 UART 通道 0时,先设置 GPA0CON 寄存器将 GPA0_0 、GPA0_1 引脚的功能设为 RXD0 、TXD0 。

2、 选择UART的时钟源

Exynos4412 UART的时钟源有八种选择: XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。
选择好时钟源后,还可以通过 DIVUART0 ~4设置分频系数 设置分频系数 ,由 CLK_DIV_PERIL0 寄存器控制。 从分频器得到的时钟被称为SCLK UART 。

SCLK UART 经过上图中的“ UCLK Generator”后,得到UCLK ,它的频率就是UART 的波特率。“ Generator UCLK Generator ”通过这 2个寄存器来设置: UBRDEVn 、UFRACVALn (在下面描述)。


3.、设置波特率:UBRDIVn寄存器(UART BAUD RATE DIVISOR)、UFRACVALn寄存器

根据给定的波特率、所选择时钟源频率,可以通过以下公式计算 UBRDIVn 寄存器 (n 为 0~4,对应 5个 UART 通道 )的值。

UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1

上式计算出来的 UBRDIVn 寄存器值不一定是整数, UBRDIVn 寄存器取其整数部分,小部分由 UFRACVALn 寄存器设置, UFRACVALn 寄存器的引入,使产生波特率更加精确。

例如,当UART clock为100MHz时,要求波特率为115200 bps,则:

100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25

UBRDIVn = 整数部分 = 53

UFRACVALn/16 = 小数部分 = 0.25

UFRACVALn = 4

4. 设置传输格式:ULCONn寄存器(UART LINE CONTROL)

ULCONn 寄存器 (n 为 0~4) 格式如下图所示:

5. 设置UART工作模式:UCONn寄存器(UART CONTROL)


6. UFCONn寄存器(UART FIFO CONTROL)、UFSTATn寄存器(UART FIFO STATUS)

UFCON n寄存器用于设置是否使用FIFO,设置各 FIFO的触发阀值,即发送 FIFO中有多少个数据时产生中断、接收 FIFO 中有多少个数据时产生中断。并可以通过设置UFCON n寄存器来复位各个 FIFO 。

读取 UFSTAT n寄存器可以知道各个 FIFO 是否已经满、其中有多少个数据。

不使用 FIFO 时,可以认为 FIFO 的深度为1,使用 FIFO 时 Exynos4412 的 FIFO 深度最高可达到256 。

7. UMCONn寄存器(UART MODEM CONTROL)、UMSTATn寄存器(UART MODEM STATUS)

这两类寄存器用于流量控制,这里不介绍。

8. UTRSTATn寄存器(UART TX/RX STATUS)

UTRSTAT n寄存器用来表明数据是否已经发送完毕、是否已经接收到数据,格式如下表所示,下面说的“缓冲区”,其实就是下图中的 FIFO ,不使用 FIFO 功能时可以认为其深度为 1。

9. UERSTATn寄存器(UART ERROR STATUS)

用来表示各种错误是否发生,位 [0] 至位 [3] 为 1时分别表示溢出错误、校验错误、帧错误、检测到“ break ”信号。读取这个寄存器时,它会自动清 0。

需要注意的是,接收数据时如果使用 FIFO ,则 UART 内部会使用一个“错误 FIFO ”来表明接收 FIFO 中哪个数据在接收过程发生了错误。 CPU 只有在读出这个错误的数据时,才会觉察到发生了错误 。要想清除“FIFO ”,则必须读出错误的数据,并读出UERSTATn 寄存器。


10. UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)

CPU 将数据写入这个寄存器, UART即会将它保存到缓冲区中,并自动发送出去。

11. URXHn寄存器(UART RECEIVE BUFFER REGISTER)

当 UART 接收到数据时,读取这个寄存器,即可获得数据。

三、示例程序编写

         下面是一个小demo,实现在终端上的回显功能,并通过在终端上输入“beep_on”、"beep_off"实现蜂鸣器的开启和停止:

头文件定义:

[cpp] view plaincopy
  1. /*****************************************    UART  * *************************************/
  2. /* UART0*/
  3. typedef struct {
  4. unsigned int ULCON0;
  5. unsigned int UCON0;
  6. unsigned int UFCON0;
  7. unsigned int UMCON0;
  8. unsigned int UTRSTAT0;
  9. unsigned int UERSTAT0;
  10. unsigned int UFSTAT0;
  11. unsigned int UMSTAT0;
  12. unsigned int UTXH0;
  13. unsigned int URXH0;
  14. unsigned int UBRDIV0;
  15. unsigned int UFRACVAL0;
  16. unsigned int UINTP0;
  17. unsigned int UINTSP0;
  18. unsigned int UINTM0;
  19. }uart0;
  20. #define UART0 ( * (volatile uart0 *)0x13800000 )

UART.c

[cpp] view plaincopy
  1. #include "exynos_4412.h"
  2. #include "pwm.h"
  3. void mydelay_ms(int time)
  4. {
  5. int i, j;
  6. while(time--)
  7. {
  8. for (i = 0; i < 5; i++)
  9. for (j = 0; j < 514; j++);
  10. }
  11. }
  12. int strcmp(const char *src, const char *des)
  13. {
  14. while(*src || *des)
  15. {
  16. if(*src > *des)
  17. return 1;
  18. else if(*src < *des)
  19. return -1;
  20. else
  21. {
  22. src++;
  23. des++;
  24. }
  25. }
  26. return 0;
  27. }
  28. void uart0_init()
  29. {
  30. /*UART0 initialize*/
  31. GPA0.CON = (GPA0.CON & ~0xFF ) | (0x22); //GPA1_0:RX;GPA1_1:TX
  32. UART0.ULCON0 = 0x3; //Normal mode, No parity,One stop bit,8 data bits
  33. UART0.UCON0 = 0x5;  //Interrupt request or polling mode
  34. //Baud-rate : src_clock:100Mhz
  35. UART0.UBRDIV0 = 53;
  36. UART0.UFRACVAL0 = 0x4;
  37. }
  38. void putc0(const char data)
  39. {
  40. while(!(UART0.UTRSTAT0 & 0X2));
  41. UART0.UTXH0 = data;
  42. if (data == '\n')
  43. putc0('\r');
  44. }
  45. char getc0(void)
  46. {
  47. char data;
  48. while(!(UART0.UTRSTAT0 & 0x1));
  49. data = UART0.URXH0;
  50. if ((data == '\n') || (data == '\r'))
  51. {
  52. putc0('\n');
  53. putc0('\r');
  54. }
  55. else
  56. putc0(data);
  57. return data;
  58. }
  59. void puts0(const  char  *pstr)
  60. {
  61. while(*pstr != '\0')
  62. putc0(*pstr++);
  63. }
  64. void gets0(char *p)
  65. {
  66. char data;
  67. while((data = getc0())!= '\r')
  68. *p++ = data;
  69. if(data == '\r')
  70. *p++ = '\r';
  71. *p = '\0';
  72. }
  73. /*
  74. *  裸机代码,不同于LINUX 应用层, 一定加循环控制
  75. */
  76. int main (void)
  77. {
  78. char ch[20];
  79. pwm_init();
  80. uart0_init();
  81. char *q = "hello UART!";
  82. puts0(q);
  83. while(1)
  84. {
  85. gets0(ch);
  86. puts0(ch);
  87. if(!strcmp(ch, "beep_on\n"))
  88. beep_on();
  89. if(!strcmp(ch, "beep_off\n"))
  90. beep_off();
  91. //  putc0(getc0());
  92. }
  93. return 0;
  94. }

Exynos4412裸机开发 —— UART相关推荐

  1. Exynos4412 裸机开发—— 流水灯

    这里我们使用的开发板是4412,开发板4412上有4个LED灯,我们这里可以利用其来做流水灯实验.下面是4个LED的原理图: 查看原理图,4412开发板的LED由CPX2_7 CPX1_0 GPF3_ ...

  2. Exynos4412裸机开发——中断处理

    以KEY2控制LED3亮灭为例: 一.轮询方式 [0]检测按键k2,按键k2按下一次,灯LED2闪一次. [1]查看原理图,连接引脚和控制逻辑 (1)按键k2 连接在GPX1_1引脚 (2)控制逻辑 ...

  3. Exynos4412裸机开发 —— A/D转换器

    一.Exynos4412 A/D转换器概述 1.简述 10位或12位CMOS再循环式模拟数字转换器,它具有10通道输入,并可将模拟量转换至10位或12位二进制数.5Mhz A/D 转换时钟时,最大1M ...

  4. Exynos4412 裸机开发 —— IIC总线

    前言: I2C(Inter-Integrated Circuit)总线(也称 IIC 或 I2C) 是有PHILIPS公司开发的两线式串行总线,用于连接微控制器及外围设备,是微电子通信控制领域广泛采用 ...

  5. Exynos4412裸机开发综合练习

    下面是一个案例需求: 1.编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警; 2.其具体要求如下; a) 程序下载20s后,进入电压采 ...

  6. Linux裸机开发|UART串口通信

    UART串口通信 不管是单片机开发还是嵌入式Linux开发,串口都是最常用到的外设.可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序.还有很多模块,比如蓝牙.GPS.GPRS等都 ...

  7. Exynos4412裸机开发 —— RTC 实时时钟单元

    RTC(Real-Time Clock) 实时时钟.RTC是集成电路,通常称为时钟芯片.在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能 ...

  8. 利用汇编和C语言实现Exynos4412裸机开发系列之实现LED跑马灯(含源码)

    一.前言 本篇使用华清远见的FS4412开发板,对开发板的LED进行操作,来实现流水灯的效果,知识包含GPIO寄存器介绍.与ubuntu下linux操作系统通过进行交叉编译生成开发板可执行代码,通过本 ...

  9. Exynos4412裸机开发 —— 看门狗定时器

    http://blog.csdn.net/zqixiao_09/article/details/50755286 转载于:https://www.cnblogs.com/tureno/articles ...

最新文章

  1. 迁移学习NLP:BERT、ELMo等直观图解
  2. 次世代手游美术资源优化干货分享
  3. PX4的workqueue
  4. Android 系统(191)---ODM 开发用户常见需求文档(九)
  5. java api 8 中文_java8 JDK1.8 API 中文 翻译版 java帮助文档
  6. 影视解说短视频制作教程,从找素材到配音,上手很简单
  7. kubernetes证书配置相关
  8. 网络:简述计算机网络的性能指标和非性能特征
  9. 论文发表如何选择正确的期刊杂志?
  10. SGX初始化中ELF文件解析
  11. 我xp电脑桌面没有计算机图标不见了,XP电脑开机后桌面图标打开方式全部不见的恢复方法...
  12. 计算机各领域的伟人,了解一下
  13. java通过poi读取excel中的日期类型
  14. 8人Python-----day02
  15. Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例
  16. php实现手机归属地的查询、,PHP实现查询手机归属地的方法详解
  17. 显卡html5性能测试工具,电脑显卡性能测试软件
  18. 易恢复15版EasyRecovery电脑数据恢复软件
  19. JavaWeb新闻发布及管理系统(含源码+论文+答辩PPT等)
  20. 单个总体的均值向量的检验(R语言)

热门文章

  1. linux包之iproute之ip命令
  2. linux中的memory management和page mapping
  3. 自言自语(2011.8.1)
  4. 数据科学生命周期_数据科学项目生命周期第1部分
  5. 事件映射 消息映射_映射幻影收费站
  6. leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
  7. 强化学习应用于组合优化问题_如何将强化学习应用于现实生活中的计划问题
  8. .net10个必备工具
  9. mysql 内置功能 存储过程 目录
  10. 牛客网 牛客小白月赛1 H.写真がとどいています