OK641的串口初始化程序
首先对串口进行初始化
1.引脚设置(初始化对应的GPIO口为TX或RX)
2.数据格式设置(ULCON0,串口线控制器0)
3.工作模式设置(UCON0,串口控制器)
4.波特率设置(UBRdiv0用来存用公式计算出来的整数部分,UdivSLOT0用来存放公式计算出来的小数部分超标得到的数据)
公式如下
UBRdiv0=(int)(PCLK/(BAUD*16)-1)
#define PCLK 66000000 //PCLk是用来供串口用的时钟
#define BAUD 115200
void uart_init()
{
GPACON|=0x22;
ULCON0=0x3;
UCON0=0x5;
UBRdiv0=(int)(PCLK/(BAUD*16)-1);
UdivSLOT0=0x0D5D5;
}
进行发送数据的操作
先判断串口是否在发送数据(即忙检测,UTRSTAT0),如果不是忙,就往UTXH0里写入要发送的数据
void putc(unsigned char ch)
{
while(!(UTRSTAT0&(0b1<2)));
UTXH0=ch;
}
进行读数据的操作
与发送类似,先判断忙,若不忙,则从URXH0里面读出数据就可以了
unsigned char getc()
{
unsigned char dat;
while(!(UTRSTAT0&(0b1<0)));
dat=URXH0;
return dat;
}
如果我们要在中断控制台想看到当键盘输入一个字符,屏幕就显示这个字符,可以加上如下代码
unsigned char getc()
{
unsigned char dat;
while(!(UTRSTAT0&(0b1<0)));
dat=URXH0;
if ((dat==0x0d)||(dat==0x0a))
{
}
else
putc(dat);
return dat;
}
在这里特别强调,在宏定义里面的千万注意是long,short,还是char,一旦定义出错,检查起来很难会去注意这个地方;
还有就是在判断不等于0时,千万注意括号的位置,不要多,不要少,我在写这段代码时,就因为while(!(UTRSTAT0&(0b1<0)))这一句没有把UTRSTAT0&(0b1<0)这一句括起来,就出现键盘输入一个字符,屏幕出来一大堆的情况,检查了半天也检查不出问题所在吗,最好还是一句一句代码对应厂家给的代码才注意到
最后附上全部代码
和main函数代码
#define GPACON *((volatile unsigned short*)0x7F008000)
#define ULCON0 *((volatile unsigned long*)0x7F005000)
#define UCON0
#define UBRdiv0 *((volatile unsigned short*)0x7F005028)
#define UdivSLOT0 *((volatile unsigned short*)0x7F00502C)
#define UTRSTAT0 *((volatile unsigned long*)0x7F005010)
#define UTXH0 *((volatile unsigned char*)0x7F005020)
#define URXH0 *((volatile unsigned char*)0x7F005024)
#define PCLK 66000000
#define BAUD 115200
void uart_init()
{
GPACON|=0x22;
ULCON0=0x3;
UCON0=0x5;
UBRdiv0=(int)(PCLK/(BAUD*16)-1);
UdivSLOT0=0x0D5D5;
}
void putc(unsigned char ch)
{
while(!(UTRSTAT0&(0b1<2)));
UTXH0=ch;
}
unsigned char getc()
{
unsigned char dat;
while(!(UTRSTAT0&(0b1<0)));
dat=URXH0;
if ((dat==0x0d)||(dat==0x0a))
{
}
else
putc(dat);
return dat;
}
**************************************************************************************************************
unsigned char p[13]="I am iron man";
void gboot_main()
{
int i;
unsigned char temp[4*1024];
#ifdef MMU_ON
mmu_init();
#endif
led_off();
button_init();
irq_init();
uart_init();
putc(0x0a);
for(i=0;i<13;i++)
putc(p[i]);
while(1)
{
getc();
}
}
OK641串口初始 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)