硬件还是tiny6410 , s3c6410, 手册上得知这款芯片有4个UART端口,可以通过中断或者DMA进行传输,速率可达3Mbps,每个UART通道有2个64字节的FIFO分别用于接受和发送。
这是它的结构图:
UART的使用挺简单的,和cortex-M的32差不多,先配置引脚复用为串口模式,然后设置UART的数据位,格式等,最后设置波特率。
这里配置串口0 吧,先看电路图:
串口0 是接到了GPA0 和GPA1 上面,那就直接把GPA0和GPA1配置为TXD和RXD就可以了。
GPACON &= 0x00; //将A0和A1的寄存器位置 清0
GPACOM |= 0x22; //配置他们为串口模式
这是串口0 相关的寄存器:
ULCON用来设置数据的格式,这里配置为8位,无校验,无停止位。
UCON用来配置串口的时钟选择和使用模式选择,是中断还是DMA。这里配为PCLK ,发送接受用轮询。
UFCON0 设置FIFO,UMCON0 设置自动流控制的。
UBRDIV0 和UDIVSLOT0 两个配合设置波特率,他们的关系有这么一个公式:
UBRDIV + UDIVSLOT/16 = (PCLK / (波特率 x 16)) - 1。 我们的时钟配置PCLK = 66.5Mhz ,波特率 115200,代入算得UDIVSLOT0 = 0x01,UBRDIV0 = 35;
ULCON0 = 0x03; ///8位寄存器,写入全部控制字了,所以不用担心影响其他位而进行& 和 | 什么的操作。
UCON0 = 0x05;
UFCON0 = 0x01;
UMCON0 = 0x00;
//配置波特率
UBRDIV0 = 35;
UDIVSLOT0 = 0x01;
剩下几个寄存器就是实际操作UART用到的了, UFSTAT 用来判断接受缓存和发送缓存的状态,方便去读或继续发。
URXH 和UTXH 就是接受和发送寄存器。所以串口发送和接受的函数是:
char getchar(void)
{
while((UFSTAT0 & 0x7F) ==0);
return URXH0;
}
void putchar(char c)
{
while(UFSTAT0 & (1<<14));
UTXH0 = c;
}