• ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED


    基本概念:

    1.GPIO--通用IO口,通过芯片针脚来控制或读取外设的数据。

    2.GPIO口的使用原理,通过设置GPXXCON, GPXXDAT, GPXXPUL等寄存器来设置GPIO口的状态。

    原理图:

    跟硬件相关的部分,一定要阅读原理图,然后通过查找SoC的用户手册来查找相应的寄存器设置即可。

    底板电路图:

    核心板电路图:

    可知在OK6410上4个LED灯是通过GPM这一组的GPIO口控制的,分别是GPM0-GPM3四组。

    然后打开S3C6410X User's Manual,查找GPM相关的寄存器:

    通过上面内容找到:

    GPMCON 地址 0x7F008820

    GPMDAT 地址 0x7F008824

    由于LED连接着GPM0-GPM3,所以通过上面的内容可以知道,GPMCON设置的值应该为0x00001111,意思是将GPM0-GPM3设置为输出,这样通过设置GPMDAT[5:0]来控制响应针脚的高低电平,使LED亮或灭。

    代码:(以下代码参考了友善之臂Tiny6410的汇编代码,并非原创)

    汇编代码:

     1 .global _start
     2 
     3 _start:
     4         // 把外设的基地址告诉CPU
     5         ldr r0, =0x70000000//对于6410来说,内存(0x000000000x60000000),外设(0x70000000-0x7fffffff)
     6         orr r0, r0, #0x13                      //外设大小:256M
     7         mcr p15,0,r0,c15,c2,4               //把r0的值(包括了外设基地址+外设大小)告诉cpu
     8     
     9         // 关看门狗
    10         ldr r0, =0x7E004000
    11         mov r1, #0
    12         str r1, [r0] 
    13 
    14         // 设置GPMCON0                                                                                   
    15         ldr r1, =0x7F008820                                                                                   
    16         ldr r0, =0x00001111                                                                                         
    17         str r0, [r1]
    18 
    19         mov r2, #0x1000
    20 led_blink:
    21         // 设置GPMDAT,使GPM_0/1/2/3引脚输出低电平,LED亮
    22         ldr r1, =0x7F008824 
    23         mov r0, #0
    24         str r0, [r1]
    25 
    26         // 延时
    27         bl delay
    28 
    29         // 设置GPMDAT,使GPM_0/1/2/3引脚输出高电平,LED灭
    30         ldr r1, =0x7F008824 
    31         mov r0, #0x0f
    32         str r0, [r1]
    33 
    34         // 延时
    35         bl delay
    36 
    37         sub r2, r2, #1
    38         cmp r2,#0
    39         bne led_blink
    40 
    41 halt:
    42         b halt
    43 
    44 
    45 delay:
    46         mov r0, #0x1000000
    47 delay_loop:
    48         cmp r0, #0
    49         sub r0, r0, #1
    50         bne delay_loop
    51         mov pc, lr
    start.S

    Makefile:

     1 led.bin: start.o
     2         arm-linux-ld -Ttext 0x50008000 -o led.elf $^
     3         arm-linux-objcopy -O binary led.elf led.bin
     4         arm-linux-objdump -D led.elf > led_elf.dis
     5 %.o : %.S
     6         arm-linux-gcc -o $@ $< -c
     7 
     8 %.o : %.c
     9         arm-linux-gcc -o $@ $< -c 
    10 
    11 clean:
    12         rm *.o *.elf *.bin *.dis  -rf

    然后make,可以得到led.bin,通过tftp下载到开发板中:

    然后就可以看到OK6410板上的四个LED灯开始一起闪烁。

    总结:

    1.GPIO口的使用其实是SoC外设控制中最简单的,只要抓住GPIO的几个寄存器,将他们的值设置正确,就可以完成相应的控制功能。

    2.一定要学会查看SoC的User's Manual的方法,这样当SoC换成其他品牌时,可以以不变应万变。

    3.使用ld来链接.o文件时,一般会指定-Ttext选项,表示该代码会在内存的哪个地址加载,通过查看User's Manual,你可以决定这个地址的范围,如下图,0x50000000-0x6FFFFFFF地址区间映射到DRAM上,所以绝大部分的资料中,S3C6410中的内存地址都是0x5xxxxxxx类似的地址。也有一些0xcxxxxxxx类似的地址,这是打开SoC中的MMU后进行物理地址和虚拟地址映射后的结果,如果打开了MMU,就可以使用0xcxxxxxxx这样的地址,否则无法使用。

     

  • 相关阅读:
    TextView autoLink不识别大写url问题
    用ImageLoader取拍摄的照片到imageView里面 图片的方向不对问题
    android使用qrcode_swetake.jar生成二维码
    jenkins + Git 搭建持续集成环境
    win10+jenkins+git+自动发布(搭建+构建)
    springMvc项目配置步骤
    linux系统下安装Jenkins
    解决java compiler level does not match the version of the installed java project facet
    Java通过FTP服务器上传下载文件的方法
    Nexus 安装(Linux 环境)
  • 原文地址:https://www.cnblogs.com/wenix/p/3544527.html
Copyright © 2020-2023  润新知