(本节笔记的具体实验代码,在这里:https://github.com/elvinsys/arm_tq2440/tree/master/1_uboot/1-14.serial)
一、 基本概念
1. 作用:作为数据传输的途径,或者作为控制台来提供用户对设备的控制方式
2. 通讯格式的几个概念
2.1 波特率:每秒传输bit的个数,常用的波特率有38400/115200
2.2 常用的参数:
起始位:当线路空闲时,电平为高,一旦检测到一个下降沿,则视为一个起始位
数据位:一帧中实际有效的数据的位数
校验位:用于检测数据传输的正确性
停止位:表示这帧数据的结束
3. 引脚:
RS232——9针引脚串口
2 : RXD : 接收脚
3 : TXD : 发送脚
5 : GND : 接地脚
二、 串口驱动程序设计
1. 串口初始化—— void uart_init()
(先touch uart.c,把uart.o加入到Makefile中)
查看底板原理图和核心板原理图可得知:
TXD0 : TXD0 / GPH2
RXD0: RXD0 / GPH3
1.1 配置引脚功能:GPHCON 0x5600 0070
GPH2 [5:4] 10 : TXD[0]
GPH3 [7:6] 10 : RXD[0]
1.2 设置串口数据格式:ULCON0 0x5000 0000
Word Length | [1:0] | 11 | 设定为8bit |
Number of stop | [2] | 0 | one stop bit 1位停止位 |
Parity Mode | [5:3] | 0XX | No Parity 无校验 |
1.3 设置串口工作模式:UCON0 0x5000 0004
(若在操作系统的支持下,可选择使用中断或DMA模式,但在bootloader中,一般采用轮询的工作模式)
Receive Mode | [3:2] | 01 | polling mode |
Transmit Mode | [1:0] | 01 | polling mode |
公式是:UBRDIVn = (int)(UART clock / (buad rate x 16) -1)
UBRDIV0 R/W 0x5000 0028
UART clock = PCLK = 50MHZ
(#define PCLK 500 0000)
(#define BAUD 115200)
UBRDIV0 = (int)(PCLK / (BAUD X 16)-1);
2. 发送数据——void putc (unsigned char ch)
2.1 检查UTRSTAT0 R 0x5000 0010