S5PV210的Uart应用
2014-11-03 16:37
92 查看
准备分析
S5PV210的NandFlash应用(一)出现很多bug,所以要先把Uart搞出来了。Uart一般是和clock相关联的,但是IROM中的代码已经提升了PCLK到66.5MHZ,这里就不进行CLOCK的设置了。
资源工具
同《 S5PV210的LED应用(一)》
着手写程序
为实现代码最简化,只是在LED程序的基础上进行添加,其它硬件如NandFlash,重定向等等都不涉及。函数设计如下:
(1) void uart_init (void) ,初始化Uart
(2) char getc (void),接收一个字符
(3) void putc (char c) ,发送一个字符
(4) puthex(volatile char a),发送一个16进制数,对调试NandFlash有帮助,可以输出寄存器的值。(参考:这里)
(5) void main (void),测试以上代码。
具体的实现:
// 初始化串口
void uart_init()
{
// 1 配置引脚用于RX/TX功能
GPA0CON = 0x22222222;
GPA1CON = 0x2222;
// 2 设置数据格式等
// 使能fifo
UFCON0 = 0x1;
// 无流控
UMCON0 = 0x0;
// 数据位:8, 无校验, 停止位: 1
ULCON0 = 0x3;
// 时钟:PCLK,禁止中断,使能UART发送、接收
UCON0 = 0x5;
// 3 设置波特率
UBRDIV0 = UART_UBRDIV_VAL;
UDIVSLOT0 = UART_UDIVSLOT_VAL;
}
// 接收一个字符
char getc(void)
{
// 如果RX FIFO空,等待
while (!(UTRSTAT0 & (1<<0)));
// 取数据
return URXH0;
}
// 发送一个字符
void putc(char c)
{
// 如果TX FIFO满,等待
while (!(UTRSTAT0 & (1<<2)));
// 写数据
UTXH0 = c;
}
/*
* 打印16进制数
* 例如:int a = 0x68; puthex(a);输出"68";
*/
int puthex(volatile char a)
{
volatile char cTmp;
//putchar(a);
//方法一printf
//printf("\n%x\n", a);
//方法二,计算
cTmp=a>>4;//右移4位,把高位放到低位
if(cTmp<10)//如果是小于10的数
{
cTmp+='0';//以0-9输出
}
else
{
cTmp+='A'-10; //大于等于10的就是ABCDEF了。
}
putc(cTmp);
cTmp=a&0x0f;
if(cTmp<10)
{
cTmp+='0';
}
else
{
cTmp+='A'-10;
}
putc(cTmp);
return 0;
}
void main() //LED 闪烁
{
char c = 0;
int a = 0x68;
GPJ2CON = 0x00001111; // 配置引脚
GPJ2DAT = 0; // LED on
delay(0x100000);
// 初始化串口
uart_init();
// 开发板发送字符'A'
putc('A');
// 开发板发送"68"
puthex(a);
while (1)
{
// 开发板接收字符
c = getc();
// 开发板发送字符c+1
putc(c+1);
}
}
下载运行
同《 S5PV210的LED应用(一)》
运行调试
测试OK:
S5PV210的NandFlash应用(一)出现很多bug,所以要先把Uart搞出来了。Uart一般是和clock相关联的,但是IROM中的代码已经提升了PCLK到66.5MHZ,这里就不进行CLOCK的设置了。
资源工具
同《 S5PV210的LED应用(一)》
着手写程序
为实现代码最简化,只是在LED程序的基础上进行添加,其它硬件如NandFlash,重定向等等都不涉及。函数设计如下:
(1) void uart_init (void) ,初始化Uart
(2) char getc (void),接收一个字符
(3) void putc (char c) ,发送一个字符
(4) puthex(volatile char a),发送一个16进制数,对调试NandFlash有帮助,可以输出寄存器的值。(参考:这里)
(5) void main (void),测试以上代码。
具体的实现:
// 初始化串口
void uart_init()
{
// 1 配置引脚用于RX/TX功能
GPA0CON = 0x22222222;
GPA1CON = 0x2222;
// 2 设置数据格式等
// 使能fifo
UFCON0 = 0x1;
// 无流控
UMCON0 = 0x0;
// 数据位:8, 无校验, 停止位: 1
ULCON0 = 0x3;
// 时钟:PCLK,禁止中断,使能UART发送、接收
UCON0 = 0x5;
// 3 设置波特率
UBRDIV0 = UART_UBRDIV_VAL;
UDIVSLOT0 = UART_UDIVSLOT_VAL;
}
// 接收一个字符
char getc(void)
{
// 如果RX FIFO空,等待
while (!(UTRSTAT0 & (1<<0)));
// 取数据
return URXH0;
}
// 发送一个字符
void putc(char c)
{
// 如果TX FIFO满,等待
while (!(UTRSTAT0 & (1<<2)));
// 写数据
UTXH0 = c;
}
/*
* 打印16进制数
* 例如:int a = 0x68; puthex(a);输出"68";
*/
int puthex(volatile char a)
{
volatile char cTmp;
//putchar(a);
//方法一printf
//printf("\n%x\n", a);
//方法二,计算
cTmp=a>>4;//右移4位,把高位放到低位
if(cTmp<10)//如果是小于10的数
{
cTmp+='0';//以0-9输出
}
else
{
cTmp+='A'-10; //大于等于10的就是ABCDEF了。
}
putc(cTmp);
cTmp=a&0x0f;
if(cTmp<10)
{
cTmp+='0';
}
else
{
cTmp+='A'-10;
}
putc(cTmp);
return 0;
}
void main() //LED 闪烁
{
char c = 0;
int a = 0x68;
GPJ2CON = 0x00001111; // 配置引脚
GPJ2DAT = 0; // LED on
delay(0x100000);
// 初始化串口
uart_init();
// 开发板发送字符'A'
putc('A');
// 开发板发送"68"
puthex(a);
while (1)
{
// 开发板接收字符
c = getc();
// 开发板发送字符c+1
putc(c+1);
}
}
下载运行
同《 S5PV210的LED应用(一)》
运行调试
测试OK:
相关文章推荐
- S5PV210的Uart应用
- linux下uart应用编程
- S5PV210的NandFlash应用(三)
- 关于UART的学习与应用
- 单片机UART中断应用中TXE和TC的顺序
- S5PV210的NandFlash应用(四)
- [1]ARM-Linux S5PV210 UART驱动
- 学习DSP外设之UART的配置和应用
- S5PV210的NandFlash应用(四)
- S5PV210的LED应用(一)
- S5PV210的NandFlash应用(三)
- STM8S 串口应用 UART2 STM8S105
- s5pv210 UART 自发自收正常 但个别板子通讯死活不正常
- s5pv210 uart完善更新
- SPI、I2C、UART三种串行总线的原理、区别及应用
- [3]ARM-Linux S5PV210 UART驱动----串口核心层、关键结构体、接口关系
- ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
- SPI、I2C、UART三种串行总线的原理、区别及应用
- ARM-Linux S5PV210 UART驱动(转)
- S5PV210之UART介绍