【OK210试用体验】裸机篇 -- 串口通信 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】裸机篇 -- 串口通信

本帖最后由 q15920078530 于 2015-8-10 12:17 编辑

【OK210试用体验】裸机篇 -- 串口通信


当我们在学习一款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) 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中取出数据


首先我们先来编写一个汇编启动程序:
  1. .global _start /* 声明一个全局的标号 */
  2. _start:
  3. bl uart_init /* 串口初始化 */
  4. bl main /* 跳转到C函数去执行 */
  5. halt:
  6. b halt
复制代码




新建文件uart.c来初始化和发送接收数据:
  1. #define GPA1CON *((volatile unsigned int *)0xE0200020)
复制代码

在uart.c中我们编写了和C语言标准库中同名函数put,getchar,puts等函数,为了避免冲突,我们在在编译过程中试用 -fno-builtin参数,来告诉GCC说不使用内建函数。



要测试程序,需要一个main.c:
  1. #define GPMP0_4CON *((volatile unsigned int *)0xE0200340)
  2. #define GPMP0_4DAT *((volatile unsigned int *)0xE0200344)

  3. int main(void)
  4. {
  5. int c;

  6. GPMP0_4CON &= ~(0XFF << 16);
  7. GPMP0_4CON |= 0X11 << 16;
  8. GPMP0_4DAT &= ~(0X3 << 4);

  9. puts("UART Test in S5PV210");
  10. puts("1. LED1 Toggle");
  11. puts("2. LED2 Toggle");
  12. puts("Please select 1 or 2 to toggle the LED");

  13. while (1)
  14. {
  15. c = getchar();
  16. putchar(c);
  17. putchar('r');

  18. if (c == '1')
  19. GPMP0_4DAT ^= 1 << 4;
  20. else if (c == '2')
  21. GPMP0_4DAT ^= 1 << 5;
  22. else
  23. ;
  24. }

  25. return 0;
  26. }
复制代码
最后来编写Makefile:
  1. uart.bin: start.o uart.o main.o
  2. arm-linux-ld -Ttext 0xD0020010 -o uart.elf $^
  3. arm-linux-objcopy -O binary uart.elf $@
  4. arm-linux-objdump -D uart.elf > uart.dis

  5. %.o : %.c
  6. arm-linux-gcc -c [ DISCUZ_CODE_21 ]lt; -o $@ -fno-builtin
  7. %.o : %.S
  8. arm-linux-gcc -c [ DISCUZ_CODE_21 ]lt; -o $@

  9. clean:
  10. rm *.o *.elf *.bin *.dis
复制代码


实验现象

将程序中生成的 .bin 文件烧到SD卡中,用SD卡启动,这里我还有还要用到SecureCRT,上电用可看到SecureCRT中显示 。 输入 “2”, 回车后,就可以看到第二个LED熄灭

附上程序: uart.zip(1.95 KB, 下载次数: 2)

0个回复

您需要登录后才可以回帖 登录| 注册

本版积分规则


关闭

站长推荐上一条/6下一条

小黑屋|手机版|Archiver|德赢Vwin官网(湘ICP备2023018690号)

GMT+8, 2024-8-29 01:42, Processed in 0.833346 second(s), Total 65, Slave 45 queries .

Powered by德赢Vwin官网 网

© 2015bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表