嵌入式bootloader开发之五(Tiny 6410)

概述:

本节主要记录有关UART的配置和数据传输方法。UART其实从原理上讲是不怎么难的,可是不知怎么回事,这次这个实验却花了我很长很长的时间。

 

首先是刚开始的时候看视频,看完视频接着就需要另外一个串口来连接开发板,但是实验室的台式机却只有一个串口,想过再找一个串口插上去,或者直接用USB转串口(这个线我恰好有)于是就自己折腾了一下,可是发现怎么连也没反应,也不知道是USB-转串口线的问题还是自己写的代码有问题,来来回回折腾,在好几台电脑上测试,可还是不知道是怎么回事,于是就想不管怎样先需要确定USB-转串口线是好的,换了一根线测试标准输入/输出端口是否可以读出数据,此时基本确定了USB-转串口线是坏的。。。哎。。折腾了那么久。。

   第二步,连接需测试的串口,修改代码使其能够走通,可是看了好多遍,甚至还翻阅了友善之臂自己提供的裸机源码,可是还是跑不通,uart1一直没有反应,只好一遍又一遍的看源码,同时反复看视频。。。。这个过程持续了很久很久,我都快要放弃了,忽然见发现自己的代码中第一个需要执行的函数竟然不是main函数,而是自己写的初始化uart1的函数,额。。晕死。。。。。。。。。这才是问题所在,因为当代码执行时它是执行完一个函数后不会再主动继续执行了,所以我的代码中每次执行都是初始化uart1,然后就返回,而main函数根本就没有执行,知道这个了后代码修改起来就容易多了,将main函数放作第一个函数,然后编译下载并运行,OK!!出来拉!运行截图如下:


这个教训真的比较重,让我花了那么多的时间去寻找bug,可是bug就在眼皮底下。主要的原因可能就是习惯了听从课堂,跟着老师走,而自己没有主动把每一步运行情况想明白。另外从这次的解决问题的过程中也应该总结下:需要一点点来排除,最终一定会找到这个bug的!

详细代码如下:

//uart1
#define ULCON1 (*(volatile unsigned long *)0x7F005400 )
#define UCON1  (*(volatile unsigned long *)0x7F005404)
#define UFCON1  (*(volatile unsigned long *)0x7F005408) 
#define UMCON1  (*(volatile unsigned long *)0x7F00540C)
#define UTRSTAT1  (*(volatile unsigned char *)0x7F005410 )
#define UTXH1  (*(volatile unsigned char *)0x7F005420 )
#define URXH1  (*(volatile unsigned char *)0x7F005424 )
#define UBRDIV1  (*(volatile unsigned short *)0x7F005428) 
#define UDIVSLOT1  (*(volatile unsigned short *)0x7F00542C )

//gpio uart
#define GPACON (*(volatile unsigned long *)0x7F008000) 
#define GPAPUD (*(volatile unsigned long *)0x7F008008) 
void (*show)(char*,...)=0xc7e13140;

void uart1_init(void);
void delay();
void put_char(char ch);
void put_string(char * s);


int main()
{
	uart1_init();
	put_string("hello,uart.\n");
        return 0;
}

void uart1_init(void)
{
//set the uart control registers
	ULCON1 = (3 << 0) | (0 << 2) | (0 << 3) | (0 << 6);//8bit,1stop,no parity,normal mode 
	UCON1 = (0 << 10) | ( 1 << 9) | ( 1 << 8) | (1 << 2) | (1 << 0)|(0<<6)|(0<<5)|(0<<4);//Interrupt request or polling mode 
	UFCON1 = 0;//disable FIFO
	UMCON1 = 0;//disable AFS and modem interrupt
	UBRDIV1 = 35;
	UDIVSLOT1 = 0x80;
//set the gpio uart1
	GPACON = (GPACON & ~(0xff << 16)) | (0x22 << 16);//txd/rxd/cts/rts
	GPAPUD = (GPAPUD & ~(0xf << 8))| (0x01 << 8);//set the rx's pull-up/down 

}
void delay()
{
	volatile int i = 0;
	for(;i<1000;++i)
		;
}

void put_char(char ch)
{
	while(!(UTRSTAT1 & 0x2))//unempty loops
		;
	delay();//wait for last one transmit over
	UTXH1 = ch;	
}
void put_string(char * s)
{
	while(*s){
		put_char(*s++);	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值