微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > OK641的串口初始化程序

OK641的串口初始化程序

时间:11-21 来源:互联网 点击:
这里用串口来实现从电脑键盘读取数据,显示在中断上面

首先对串口进行初始化

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))

{

putc(0x0d);

putc(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 *((volatile unsigned long*)0x7F005004)

#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))

{

putc(0x0d);

putc(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();

}

}


上一篇:C51_LCD1602显示
下一篇:ARM体系结构学习1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top