初始化串口
1.配置引脚功能
在原理图上找到串口引脚,配置成RXD和TXD功能
2.设置数据格式
ULCON(0x50000000)用来设置数据格式
3.设置工作模式
在操作系统中,串口一般工作在中断模式或DMA模式,但是在引导中串口一般工作在轮询模式,UCON(0x50000004)用来设置工作模式
4.设置波特率
UBRDIV(0x50000028)用来设置波特率,串口使用的时钟是PCLK。
UBRDIV = (int)(PCLK/BAUD*16)-1
发送数据
1.判断发送缓冲是否为空
UTRSTAT(0x50000010)的第2位用来判断发送FIFO是否为空
2.发送数据
UTXH(0x50000020)用来发送数据
接收数据
1.判断接收缓冲是否不为空
UTRSTAT(0x50000010)的第1位用来判断接收FIFO是否不为空
2.接收数据
URXH(0x50000024)用来接收数据
/********************************************************************
*名称:uart
*作者:D
*时间:2015.11.08
*功能:串口驱动
********************************************************************//********************************************************************
* 宏定义
********************************************************************/
#define GPHCON ( (*(volatile unsigned long *)0x56000070) ) //GPH组控制寄存器
#define ULCON0 ( (*(volatile unsigned long *)0x50000000) ) //UART0线控制寄存器
#define UCON0 ( (*(volatile unsigned long *)0x50000004) ) //UART0控制寄存器
#define UBRDIV0 ( (*(volatile unsigned long *)0x50000028) ) //UART0波特率分频寄存器
#define UTRSTAT0 ( (*(volatile unsigned long *)0x50000010) ) //UART0发送接收状态寄存器
#define UTXH0 ( (*(volatile unsigned long *)0x50000020) ) //UART0发送接缓冲寄存器
#define URXH0 ( (*(volatile unsigned long *)0x50000024) ) //UART0接收接缓冲寄存器#define PCLK 50000000 //PCLK=1/8*FCLK=50MHz
#define BUAD 115200 //波特率/********************************************************************
* 函数原型声明
********************************************************************//********************************************************************
*名称:init_uart
*功能:初始化串口
*********************************************************************/
void init_uart(){//配置串口引脚GPHCON &= ~(0xF<<4); //清零GPH[3-2]:0000GPHCON |= 0xA<<4; //设置GPH2:10 TXD[0],GPH3:10 RXD[0]//设置数据格式ULCON0 = 0x00000003; //设置word length[1-0]:11 8bit, number of stop bit:0 0bit, parity mode:000 no//设置工作模式UCON0 = 0x00000005; //设置recevi mode:01, transmit mode:01 polling mode, clock selection:00 PCLK//设置波特率UBRDIV0 = (int)(PCLK/(BUAD*16))-1;
}/********************************************************************
*名称:putc_uart
*参数:ch 发送字符
*返回:none
*功能:发送数据
*********************************************************************/
void putc_uart(unsigned char ch){//等待发送缓冲为空while( !(UTRSTAT0&(1<<2)) ); //等待发送缓冲和移位寄存器都为空//发送数据UTXH0 = ch;
}/********************************************************************
*名称:getc_uart
*参数:none
*返回:ch 接收字符
*功能:接收数据
*********************************************************************/
unsigned char getc_uart(){unsigned char ch;//等待接收缓冲不为空while( !(UTRSTAT0&(1<<0)) );//接收数据ch = URXH0;return ch;
}
while(1){ch = getc_uart();if(ch == 0x0D || ch == 0x0A){ //如果输入的是回车或换货,那么输出回车和换行putc_uart(0x0D);putc_uart(0x0A);}else{putc_uart(ch);}}