嵌入式bootloader开发Tiny6410(5)

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

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

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

嵌入式bootloader开发Tiny6410

这个教训真的比较重,让我花了那么多的时间去寻找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++); 
 }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/552a31ae52b091d572ef6ed781433166.html