exynos4412—UART裸板复习
我们通过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
从串口接收一个字节的数据:
读寄存器:

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

写入寄存器:
#ifndef TINY4412_LIB_H_
#define TINY4412_LIB_H_ typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8; extern u32 read32(u32 reg);
extern u16 read16(u32 reg);
extern u8 read8(u32 reg);
extern void write8(u8 val, u32 reg);
extern void write16(u16 val, u32 reg);
extern void write32(u32 val, u32 reg); #define udelay ((void (*)(int))0x43e26480)
#define printf(...) (((int (*)(const char *, ...))0x43e11a2c)(__VA_ARGS__)) #endif
lib.h
编写uart.c
#include <uart.h>
#include <stdarg.h> /*串口0的初始化*/
void uart0_init(void)
{
u32 val; /*设置GPA0[0:1]引脚为串口0专用的收发引脚*/
val = read32(GPA0CON);
val &= ~0xff;
val |= 0x22;
write32(val, GPA0CON); /*设置串口传输数据的一帧对应的数据位为
8位,1位停止位,无奇偶校验位*/
write32(0x3, ULCONn); /*选择串口收发的模式为polling模式*/
write32(0x5, UCONn); /*选择传输的模式为非FIFO模式*/
write32(0x0, UFCONn); /*禁用硬件流控*/
write32(0x0, UMCONn); /*设置波特率为115200, 根据手册1399的公式推出*/
write32(, UBRDIVn);
write32(, UFRACVALn); /*时钟源的选择: MPLL_USER_T, MPLL*/
val = read32(CLK_SRC_PERIL0);
val &= ~0xf;
val |= 0x6;
write32(val, CLK_SRC_PERIL0); /*分频*/
val = read32(CLK_DIV_PERIL0);
val &= ~0xf;
val |= 0x7;
write32(val, CLK_DIV_PERIL0);
} void uputchar(int ch)
{
/*等待发送缓存寄存器无要发送的数据*/
while (!(read32(UTRSTATn) & 0x2)) {
;
} write8(ch, UTXHn); if (ch == '\n') {
uputchar('\r');
}
} /*从串口接收一个字节的数据*/
int ugetchar(void)
{
int val; /*等待串口控制器接收到有效数据*/
while (!(read32(UTRSTATn) & 0x1)) {
;
} val = read8(URXHn);
if (val == '\r') {
val = '\n';
} uputchar(val); return val;
} char *ugets(char *buf)
{
int ch; char *tmp = buf; while ((ch = ugetchar()) != '\n') {
*tmp++ = ch;
} *tmp = '\0'; return buf;
} void uputs(const char *buf)
{
while (*buf) {
uputchar(*buf);
buf++;
}
} /*93 --> "5d"*/
void xtoa(int n, char *buf)
{
int i;
if (n < ) {
if (n < ) {
buf[] = '' + n;
} else {
buf[] = n - + 'a';
}
buf[] = '\0'; return;
} xtoa(n/, buf); for (i = ; buf[i] != '\0'; i++); if ((n%) < ) {
buf[i] = (n%) + '';
} else {
buf[i] = (n%) - + 'a';
} buf[i+] = '\0';
} /*93 --> "93" */
void itoa(int n, char *buf)
{
int i; if (n < ) {
buf[] = n + '';
buf[] = '\0';
return;
} itoa(n/, buf); for (i = ; buf[i] != '\0'; i++) {
;
} buf[i] = (n%) + '';
buf[i+] = '\0';
} void uprintf(const char *fmt, ...)
{
int val;
va_list va;
char buf[]; va_start(va, fmt); while (*fmt) {
if (*fmt == '%') {
fmt++;
switch (*fmt) {
case 'c':
uputchar(va_arg(va, int));
break;
case 'd':
val = va_arg(va, int);
if (val < ) {
uputchar('-');
val = - val;
}
itoa(val, buf);
uputs(buf);
break;
case 'x':
val = va_arg(va, int);
xtoa(val, buf);
uputs(buf);
break;
case 's':
uputs(va_arg(va, char *));
break;
default:
break;
}
} else {
uputchar(*fmt);
} fmt++;
}
}
uart.c
测试用例就直接调用uprintf可以测试所有功能。
exynos4412—UART裸板复习的更多相关文章
- exynos4412—CMU裸板复习
本章描述了Exynos 4412 SCP的时钟管理单元(CMUs).在Exynos 4412 SCP中,CMUs控制相位锁相环(PLLs),并为CPU.总线和单个ip的功能时钟生成系统时钟.它们还与电 ...
- 裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- [转载非常好的文章]JLink+GDBServer调试S3C6410裸板的初始化代码 For OK6410开发板
要调试裸板,有两种初始化方法,一个是用烧好的uboot初始化,再有就是直接用JLink+GDBServer初始化.代码参考了网上的资料,根据手头的OK6410开发板做了修改.整体代码如下: # Con ...
- arm裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...
- S5PV210裸板驱动:启动
以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...
- 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...
- 关于在arm裸板编程时使用printf问题的解决方法
在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...
随机推荐
- 放弃setInterval-说说定时器
上述事件循环机制的核心是:JS引擎线程和事件触发线程 但事件上,里面还有一些隐藏细节,譬如调用setTimeout后,是如何等待特定时间后才添加到事件队列中的? 是JS引擎检测的么?当然不是了.它是由 ...
- Angular2 备忘
ng serve --port 80 --disable-host-check 启动80端口,禁用host检查 要在 component 内绑定全局事件的话,可以使用 @HostListener, ...
- PowerDesigner表设计转化为excel或者markdown
本文目的:知道有这种能够写脚本的方式减少工作量 写VBS脚本 导出
- 32位 64位 获得进程peb的方法
基于上一篇文章,大概了解了peb的获取方法,但是那个方法只能获得当前进程的PEB,不能获得其他的进程的PEB.根据那个思想,获得其他进程PEB则需要注入,得到进程信息,然后进程间通信,将信息返回来,经 ...
- 用jq给link和script标签加随机的版本号(兼容IE5)
$("link,script").each(function(){ var t=Math.random().toFixed(4); /*var $tag=$(this).prop( ...
- Hadoop-2.2.0中文文档—— Common - 超级用户模拟别的用户
简单介绍 此文档描写叙述了一个超级用户怎样在安全的方式下以还有一用户的名义提交作业或訪问hdfs. Use Case 下一部分描写叙述的的代码演示样例对此用户用例是可用的. 一个username为's ...
- h5做的app和原生app的区别
之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...
- 在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上
可直接参考文档:http://danqingdani.blog.163.com/blog/static/18609419520141201215750 需要使用到的github脚本:https://g ...
- AWS backup
shadowsocks ssserver -c /etc/shadowsocks/config.json start/stop/reset
- c++中如 <类名 类名::对象> 是什么意思
CComplex CComplex::add(CComplex &x) (这一句 不懂为何 类名 类名::对象) { CComplex y(real+x.real,image+x.image) ...