我们通过RS232来做实验。

通过电平转换芯片,

连接至核心板:

即:GPA0_0  GPA0_1     配置引脚为串口专用模式:

然后看

ULCONn  [31:0]       0x3

设置串口一帧传输数据的一帧对应的数据位为8倍,1位停止位,无奇偶校验位

UCONn  [31:0]     0x5

选择串口收发的模式为polling模式

UFCONn  [31:0]  0x0

选择传输的模式为非FIFO模式

UMCONn [31:0] 0x0

禁用硬件流控

UBRDIVn Specifies baud rate divisor
UFRACVALn Specifies divisor fractional value

用于控制波特率

目前采用的时钟源是100Mhz,一会再来验证。

UBRDIVn  =  (100000000 / 115200 / 16 - 1 ) = 53.253472222222222222222222222222   取整数

UFRACVALn = (53.2534722 - 53 )*16 = 4.05555      取整数

即配置为波特率为115200

UTRSTATn
从串口接收一个字节的数据:

读寄存器:

发送一个字节的数据,等待发送缓存寄存器无要发送的数据

写入寄存器:

  1. #ifndef TINY4412_LIB_H_
  2. #define TINY4412_LIB_H_
  3.  
  4. typedef unsigned int u32;
  5. typedef unsigned short u16;
  6. typedef unsigned char u8;
  7.  
  8. extern u32 read32(u32 reg);
  9. extern u16 read16(u32 reg);
  10. extern u8 read8(u32 reg);
  11. extern void write8(u8 val, u32 reg);
  12. extern void write16(u16 val, u32 reg);
  13. extern void write32(u32 val, u32 reg);
  14.  
  15. #define udelay ((void (*)(int))0x43e26480)
  16. #define printf(...) (((int (*)(const char *, ...))0x43e11a2c)(__VA_ARGS__))
  17.  
  18. #endif

lib.h

编写uart.c

  1. #include <uart.h>
  2. #include <stdarg.h>
  3.  
  4. /*串口0的初始化*/
  5. void uart0_init(void)
  6. {
  7. u32 val;
  8.  
  9. /*设置GPA0[0:1]引脚为串口0专用的收发引脚*/
  10. val = read32(GPA0CON);
  11. val &= ~0xff;
  12. val |= 0x22;
  13. write32(val, GPA0CON);
  14.  
  15. /*设置串口传输数据的一帧对应的数据位为
  16. 8位,1位停止位,无奇偶校验位*/
  17. write32(0x3, ULCONn);
  18.  
  19. /*选择串口收发的模式为polling模式*/
  20. write32(0x5, UCONn);
  21.  
  22. /*选择传输的模式为非FIFO模式*/
  23. write32(0x0, UFCONn);
  24.  
  25. /*禁用硬件流控*/
  26. write32(0x0, UMCONn);
  27.  
  28. /*设置波特率为115200, 根据手册1399的公式推出*/
  29. write32(, UBRDIVn);
  30. write32(, UFRACVALn);
  31.  
  32. /*时钟源的选择: MPLL_USER_T, MPLL*/
  33. val = read32(CLK_SRC_PERIL0);
  34. val &= ~0xf;
  35. val |= 0x6;
  36. write32(val, CLK_SRC_PERIL0);
  37.  
  38. /*分频*/
  39. val = read32(CLK_DIV_PERIL0);
  40. val &= ~0xf;
  41. val |= 0x7;
  42. write32(val, CLK_DIV_PERIL0);
  43. }
  44.  
  45. void uputchar(int ch)
  46. {
  47. /*等待发送缓存寄存器无要发送的数据*/
  48. while (!(read32(UTRSTATn) & 0x2)) {
  49. ;
  50. }
  51.  
  52. write8(ch, UTXHn);
  53.  
  54. if (ch == '\n') {
  55. uputchar('\r');
  56. }
  57. }
  58.  
  59. /*从串口接收一个字节的数据*/
  60. int ugetchar(void)
  61. {
  62. int val;
  63.  
  64. /*等待串口控制器接收到有效数据*/
  65. while (!(read32(UTRSTATn) & 0x1)) {
  66. ;
  67. }
  68.  
  69. val = read8(URXHn);
  70. if (val == '\r') {
  71. val = '\n';
  72. }
  73.  
  74. uputchar(val);
  75.  
  76. return val;
  77. }
  78.  
  79. char *ugets(char *buf)
  80. {
  81. int ch;
  82.  
  83. char *tmp = buf;
  84.  
  85. while ((ch = ugetchar()) != '\n') {
  86. *tmp++ = ch;
  87. }
  88.  
  89. *tmp = '\0';
  90.  
  91. return buf;
  92. }
  93.  
  94. void uputs(const char *buf)
  95. {
  96. while (*buf) {
  97. uputchar(*buf);
  98. buf++;
  99. }
  100. }
  101.  
  102. /*93 --> "5d"*/
  103. void xtoa(int n, char *buf)
  104. {
  105. int i;
  106. if (n < ) {
  107. if (n < ) {
  108. buf[] = '' + n;
  109. } else {
  110. buf[] = n - + 'a';
  111. }
  112. buf[] = '\0';
  113.  
  114. return;
  115. }
  116.  
  117. xtoa(n/, buf);
  118.  
  119. for (i = ; buf[i] != '\0'; i++);
  120.  
  121. if ((n%) < ) {
  122. buf[i] = (n%) + '';
  123. } else {
  124. buf[i] = (n%) - + 'a';
  125. }
  126.  
  127. buf[i+] = '\0';
  128. }
  129.  
  130. /*93 --> "93" */
  131. void itoa(int n, char *buf)
  132. {
  133. int i;
  134.  
  135. if (n < ) {
  136. buf[] = n + '';
  137. buf[] = '\0';
  138. return;
  139. }
  140.  
  141. itoa(n/, buf);
  142.  
  143. for (i = ; buf[i] != '\0'; i++) {
  144. ;
  145. }
  146.  
  147. buf[i] = (n%) + '';
  148. buf[i+] = '\0';
  149. }
  150.  
  151. void uprintf(const char *fmt, ...)
  152. {
  153. int val;
  154. va_list va;
  155. char buf[];
  156.  
  157. va_start(va, fmt);
  158.  
  159. while (*fmt) {
  160. if (*fmt == '%') {
  161. fmt++;
  162. switch (*fmt) {
  163. case 'c':
  164. uputchar(va_arg(va, int));
  165. break;
  166. case 'd':
  167. val = va_arg(va, int);
  168. if (val < ) {
  169. uputchar('-');
  170. val = - val;
  171. }
  172. itoa(val, buf);
  173. uputs(buf);
  174. break;
  175. case 'x':
  176. val = va_arg(va, int);
  177. xtoa(val, buf);
  178. uputs(buf);
  179. break;
  180. case 's':
  181. uputs(va_arg(va, char *));
  182. break;
  183. default:
  184. break;
  185. }
  186. } else {
  187. uputchar(*fmt);
  188. }
  189.  
  190. fmt++;
  191. }
  192. }

uart.c

测试用例就直接调用uprintf可以测试所有功能。

exynos4412—UART裸板复习的更多相关文章

  1. exynos4412—CMU裸板复习

    本章描述了Exynos 4412 SCP的时钟管理单元(CMUs).在Exynos 4412 SCP中,CMUs控制相位锁相环(PLLs),并为CPU.总线和单个ip的功能时钟生成系统时钟.它们还与电 ...

  2. 裸板驱动总结(makefile+lds链接脚本+裸板调试)

    在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...

  3. [转载非常好的文章]JLink+GDBServer调试S3C6410裸板的初始化代码 For OK6410开发板

    要调试裸板,有两种初始化方法,一个是用烧好的uboot初始化,再有就是直接用JLink+GDBServer初始化.代码参考了网上的资料,根据手头的OK6410开发板做了修改.整体代码如下: # Con ...

  4. arm裸板驱动总结(makefile+lds链接脚本+裸板调试)

    在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...

  5. 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式

    1.linux系统中的中断处理  1.0裸板中中断异常是如何处理的?     以s5p6818+按键为例          1)按键中断的触发        中断源级配置            管脚功 ...

  6. S5PV210裸板驱动:启动

    以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...

  7. 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结

    1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...

  8. uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试

    今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...

  9. 关于在arm裸板编程时使用printf问题的解决方法

    在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...

随机推荐

  1. centos系统移植

    今天将一个服务器上面的硬盘拆掉放到安装到另外一个服务器上面,硬盘里已经安装系统为centos6.0. 服务器 为dell的1850,好吧,在今天我还有幸搞这种“屎”前的服务器还是很幸运的! 硬盘换了之 ...

  2. 安装和测试Kafka

    本文主要介绍如何在单节点上安装 Kafka 并测试 broker.producer 和 consumer 功能. 下载 进入下载页面:http://kafka.apache.org/downloads ...

  3. 7za 命令解析

    转载自:blog.chinaunix.net/uid-26330274-id-3055157.html 7za 命令讲的很详细,收藏下来. 命令行压缩解压一 7z   1) 简介 7z,全称7-Zip ...

  4. sql 连表

    左外 右外连接 select * from tb1 left   join tb2 on(tb1.id = tb2.id) select * from tb1 right join tb2 on(tb ...

  5. db2巡检小脚本

    写了下db2巡检的一个小脚本,只能做常规检查,减少日常工作量,脚本内容如下: #!/bash/bin echo "物理CPU个数为:"cat /proc/cpuinfo| grep ...

  6. easyui学习笔记4—panel的实现

    这篇看看easyui是怎么实现panel的,就是类似一个容器,里面可以装具体内容或者其他的easyui控件. 1.这里先看看引用的资源文件 <link rel="stylesheet& ...

  7. datetime.datetime.now()时间格式转化是碰到的问题

    import datetime print datetime.datetime.now() # 2016-03-28 17:16:00.812000 a = ‘2016-03-28 17:16:00. ...

  8. mybatis插入返回主键

     useGeneratedKeys="true" keyProperty="id" <insert id="insertReturnPrimar ...

  9. GitBash初始目录的修改

    GitBash初始目录是定为到用户目录的,例如: 所以,每次打开都要手动调试到仓库所在的目录,可以通过修改目标和起始位置来定位到仓储文件夹下. 再次打开git,完美~~

  10. ASP.NET Web API编程——构建api帮助文档

    1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...