S5PV210的Uart应用

准备分析

         S5PV210的NandFlash应用(一)出现很多bug,所以要先把Uart搞出来了。Uart一般是和clock相关联的,但是IROM中的代码已经提升了PCLK到66.5MHZ,这里就不进行CLOCK的设置了。
         S5PV210的Uart应用_第1张图片

资源工具

        同《  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应用_第2张图片

遗留问题
  
        1.无


你可能感兴趣的:(S5PV210)