1、整个程序流程分析:
程序是第五章icache项目复制过来的有:clock.S 、led.S、start.S(添加bl main调用)、Makefile(依懒里要添加uart.o和main.o)、mkv210_image.c、多添加一个,uart.c再添加一个main.c调用uart.c
(1)、整个串口通信相关程序包含2部分:uart_init负责初始化串口,uart_putc负责发送一个字节。
void main(void)
{
uart_init( );
uart_putc( ' a ' );
}
//串口初始化程序
void uart_init(void)
{
}
//串口发送程序,发送一个字节
void uart_putc(char c)
{
}
//串口接收程序,轮询方式,接收一个字节
char uart_getc(void)
{
}
2、串口控制器初始化关键步骤:
(1)、初始化串口的Tx(发)和(Rx)收,引脚所对应的GPIO(这个引脚是复用的),查原理图可知Rx和Tx分别对应GPA0_0和GPA0_1。
(2)、GPA0CON(0xE0200000),bit[3 : 0] = 0b0010 , bit[4 : 7] = 0b0010其余位不变。
(3)、初始化这几个关键寄存器:UCON0 ULCON0 UMCON0 UFCON0 UBRDIV0 UDIVSLOT0
3、主要的几个寄存器:
(1)、ULCON0 = 0X3 //0校验位、8位数据位、1停止位
(2)、UCON = 0x5 //发送和接收都是polling mode (轮询模式)
(3)、UMCON0 =0x0 //禁止MODEM(在此和流控有关)、afc(流控)
(4)、UFCON0 = 0x0 //禁止FIFO模式
(5)、UBRDIV0 和 UDIVSLOT0和波特率有关,要根据公式去算的。
4、在C源文件中定义访问寄存器的宏:
#define GPA0CON 0xE0200000
#define UCON0 0xE2900004
#define ULCON0 0xE2900000
#define UMCON0 0xE290000c
#define UFCON0 0xE2900008
#define UBRDIV0 0xE2900028
#define UDIVSLOT0 0xE290002c
#define UTRSTAT0 0xE2900010
#define UTXH0 0xE2900020
#define URXH0 0xE2900010
//这里是强制类型转换后访问
#define rGPA0CON (*(volatile unsigned int )GPA0CON)
#define rUCON0 ((volatile unsigned int )UCON0)
#define rULCON0 ((volatile unsigned int )ULCON0 )
#define rUMCON0 ((volatile unsigned int )UMCON0 )
#define rUFCON0 ((volatile unsigned int )UFCON0 )
#define rUBRDIV0 ((volatile unsigned int )UBRDIV0 )
#define rUDIVSLOT0 ((volatile unsigned int )UDIVSLOT0 )
#define rUTRSTAT0 ((volatile unsigned int )UTRSTAT0 )
#define rUTXH0 ((volatile unsigned int )UTXH0 )
#define rURXH0 ((volatile unsigned int *)URXH0 )
原理图:
Tx和Rx引脚对应寄存器设置:
ULCON0: