1.串口的初始化(仅使用基本功能)
1.首先设置复用引脚,以串口0为例,RXD代表接受数据的引脚,TXD代表发送数据的引脚,这两个是复用引脚,需要在GPHCON寄存器中设置引脚复用
2.设置GPH的上拉
3.设置UCON0寄存器,简单的串口功能需要设置:
- 第10,11位,选择时钟源,这里可以设置00或者01来选择PCLK;
- 第0,1位,选择接收模式,这里设置成01,也就是中断或查询模式
- 第2,3位,选择发送模式,这里设置成01,也就是中断或查询模式
4.设置波特率,通过设置UBRDIV0寄存器来设置,设置的值的计算公式为:
UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) –1
这里的 UART设置我们前面设置为PCLK,波特率使用115200
5.设置数据格式,通过ULCON0寄存器来设置,这里设置成8N1,也就是8位数据位,没有校验位,一个停止位
代码示例:
/*UART registers*/
#define ULCON0 (volatile unsigned long *)0x50000000
#define UCON0 (volatile unsigned long *)0x50000004
#define UBRDIV0 (volatile unsigned long *)0x50000028
#define UART_CLK PCLK
#define UART_BAUD_RATE 115200
#define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
void uart_init()
{
//IO ¸´ÓÃ
(*GPHCON) |= ((0x2<<(2*2)) | (0x2<<(3*2))); //GPH2 GPH3 复用
(*GPHUP) = 0xc; //1100 设置GPH2,GPH3引脚下拉
(*ULCON0) = 0x03; // 8N1 数据格式
(*UCON0) = 0x05; // PCLK,中断或者查询模式
(*UBRDIV0) = UART_BRD; //115200
}
2.其他寄存器说明
1.UTRSTAT0: TX/RX的状态寄存器,第1位如果是1,代表发送缓冲空,可以发送数据,0则代表有数据需要等待;第0位如果是1,代表接收缓冲器接收到有效数据,0代表未接收到
2.UTXH0:检测发送状态寄存器如果为空,则直接写入数据就会自动发送
3.URXH0:可以将改寄存器的值赋给变量实现读取接受到的数据
3.串口的输入输出函数的编写
输出字符到PC端:
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
void printf_c(unsigned char c)
{
while (!(UTRSTAT0 & 2));
UTXH0 = c;
}
void printf_s(unsigned char *s)
{
int i=0;
while(s[i++]!='\0')
putc_fun(s[i-1]);
}
void get_s(unsigned char* s)
{
int i=0;
unsigned char a;
while(1)
{
a=getc_fun();
if(!(a==0x0a || a==0x0d)) //换行,回车除外
s[i++]=a;
else
{
s[i]='\0';
break;
}
}
}
unsigned char get_c(void)
{
while (!(UTRSTAT0 & RXD0READY));
return URXH0;
}