本帖最后由 q15920078530 于 2015-8-10 12:17 编辑
当我们在学习一款CPU时,最经典的入门实验当属 流水灯 的操作,通过此试验我们可以基本学会对该芯片的 GPIO驱动。学习完 流水灯的驱动,会了GPIO驱动,是可以想学什么就学什么的,但是对于学习的方便来说,先学习串口通信还是很有用的,因为我们可以让开发板与PC等设备来通信调试,更好地反映板子的功能。
S5PV210的UART
在三星官方文档 S5PV210_UM_REV1.1 中有对S5PV210中的UART的详细说明,在 section 08_connectivity / storage 下。
S5PV210中有4个异步收发器,提供4个独立的异步串行输入/输出(I/O)端口。所有端口可以用于中断模式和DMA模式。UART可以产生一个中断和DMA请求来传输数据给CPU或从CPU传向UART。支持高达3Mbps的位速率。每个UART通道都包含了两个FIFOs来接收和发送数据,256 bytes in ch0, 64 bytes in ch1 and 16 bytes in ch2 and ch3。UART包含了可编程的波特率、红外收发器、1~2位的停止位、5~8位的数据位、校验位。
1.png
(64.63 KB)
(下载次数: 0, 2015-8-8 10:35 上传)
Block Diagram of UART。
数据发送:要的帧是可编程。它包含 1位起始, 5~8位数据, 1位可选校验位, 1或 2位停止,这些都通过 ULCONn 寄存器来设置。 在 FIFO模式下发送器将要的数据给Tx FIFO, 在非 FIFO模式下,发送器将要的数据给 Tx 保持寄存器。
数据接收:和数据发送类似。
程序编写
使用UART与PC通信时,应该先用过程序来配置相应寄存器的参数,比如数据位、校验位、停止位、模式等等。
配置操作步骤:
1. 将所涉及的UART通道管脚设置成UART功能。根据OK210板子的原理图和说提供的外设接口,这里配置UART2,即 GPA1_0和GPA1_1 分别作为RXD和TXD。
2. 配置时钟,选择时钟源:这里选择默认时钟 (PCLK=66 MHz),在iROM中的BL0中已经配置,可以不用再进行配置,详细的可以参考S5PV210的启动流程
3. 设置传输格式:配置ULCONn寄存器 -- 数据位、停止位、校验位、模式
4. 设置工作模式:配置UCONn寄存器 -- 数据接收和发送模式、时钟源
5. 配置UFCONn: 设置FIFO的启动或者禁止
6. 配置UMCONn:关闭流控制
7. 配偶子UBRDIVn 和 UDIVSLOTn:计算并设置波特率,datasheet上有详细的计算方法和例子
。UDIVSLOT0部分需要查表:
8. 发送数据: 等待发送器为空,将要发送的8位数据赋给发送缓存寄存器UTXHn
9. 接收数据: 等待接收缓冲区有数据可读,从接收缓存寄存器URXHn中取出数据
首先我们先来编写一个汇编启动程序:- .global _start /* 声明一个全局的标号 */
- _start:
- bl uart_init /* 串口初始化 */
- bl main /* 跳转到C函数去执行 */
- halt:
- b halt
新建文件uart.c来初始化和发送接收数据:- #define GPA1CON *((volatile unsigned int *)0xE0200020)
在uart.c中我们编写了和C语言标准库中同名函数put,getchar,puts等函数,为了避免冲突,我们在在编译过程中试用 -fno-builtin参数,来告诉GCC说不使用内建函数。
要测试程序,需要一个main.c:- #define GPMP0_4CON *((volatile unsigned int *)0xE0200340)
- #define GPMP0_4DAT *((volatile unsigned int *)0xE0200344)
-
- int main(void)
- {
- int c;
-
- GPMP0_4CON &= ~(0XFF << 16);
- GPMP0_4CON |= 0X11 << 16;
- GPMP0_4DAT &= ~(0X3 << 4);
-
- puts("UART Test in S5PV210");
- puts("1. LED1 Toggle");
- puts("2. LED2 Toggle");
- puts("Please select 1 or 2 to toggle the LED");
-
- while (1)
- {
- c = getchar();
- putchar(c);
- putchar('r');
-
- if (c == '1')
- GPMP0_4DAT ^= 1 << 4;
- else if (c == '2')
- GPMP0_4DAT ^= 1 << 5;
- else
- ;
- }
-
- return 0;
- }
最后来编写Makefile:- uart.bin: start.o uart.o main.o
- arm-linux-ld -Ttext 0xD0020010 -o uart.elf $^
- arm-linux-objcopy -O binary uart.elf $@
- arm-linux-objdump -D uart.elf > uart.dis
-
- %.o : %.c
- arm-linux-gcc -c [ DISCUZ_CODE_21 ]lt; -o $@ -fno-builtin
- %.o : %.S
- arm-linux-gcc -c [ DISCUZ_CODE_21 ]lt; -o $@
-
- clean:
- rm *.o *.elf *.bin *.dis
实验现象
将程序中生成的 .bin 文件烧到SD卡中,用SD卡启动,这里我还有还要用到SecureCRT,上电用可看到SecureCRT中显示

。 输入 “2”, 回车后,就可以看到第二个LED熄灭
附上程序:
uart.zip
(1.95 KB)
(下载次数: 2, 2015-8-10 12:16 上传)