【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.    
  4.    int main(void)
  5.    {
  6.        int c;
  7.    
  8.        GPMP0_4CON &= ~(0XFF << 16);
  9.        GPMP0_4CON |= 0X11 << 16;
  10.       GPMP0_4DAT &= ~(0X3 << 4);
  11.   
  12.       puts("UART Test in S5PV210");
  13.       puts("1. LED1 Toggle");
  14.       puts("2. LED2 Toggle");
  15.       puts("Please select 1 or 2 to toggle the LED");
  16.   
  17.       while (1)
  18.       {
  19.           c = getchar();
  20.           putchar(c);
  21.           putchar('r');
  22.   
  23.           if (c == '1')
  24.             GPMP0_4DAT ^= 1 << 4;
  25.           else if (c == '2')
  26.               GPMP0_4DAT ^= 1 << 5;
  27.           else
  28.               ;
  29.      }
  30.   
  31.       return 0;
  32.   }
复制代码
     最后来编写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.         
  6. %.o : %.c
  7.         arm-linux-gcc -c [        DISCUZ_CODE_21        ]lt; -o $@ -fno-builtin
  8. %.o : %.S
  9.         arm-linux-gcc -c [        DISCUZ_CODE_21        ]lt; -o $@
  10.         
  11. clean:
  12.         rm *.o *.elf *.bin *.dis
复制代码


实验现象

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

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

0个回复

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

本版积分规则


关闭

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

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-9-21 00:34 , Processed in 0.322810 second(s), Total 32, Slave 23 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

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