历史上的今天
今天是:2025年01月09日(星期四)
2020年01月09日 | ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED
2020-01-09 来源:eefocus
基本概念:
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
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这样的地址,否则无法使用。
上一篇:移植mysql到arm平台
下一篇:初始化中断按键(2440)
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:31 编辑 本系统的设计电路由实时时钟模块、环境温度检测模块、电网检测模块、人机接口模块、报警模块等部分组成。其中实时时钟采用DS12887,可实现年、月、日、时、分、秒等时间信息的采集和闹钟功能;温度检测 ...… 查看全部问答> |
|
1、对于你们软件中的“Import”、“Open”这两个菜单的命名,我不是很能理解,能说说吗? 答:Open 是指打开我们的软件保存的文件,而Import是指导入其他软件转换的ASCII文件。 2、怎么我找不到网络编辑的菜单啊? 答:我们的网络编辑更加快捷 ...… 查看全部问答> |
|
这个板子有点小问题。 1.xout部分当clk不能用,飞线到pclk,管脚。原因:xout信号太弱。所以,咱这个stm32的xout部分就去掉吧。 2.spck接a3p060 pin91不行,那不是全局管脚,2,4,6 93,94可以,我用的93. 3.12 - 5 v的DC-dc不能用,有 ...… 查看全部问答> |
|
第一次进wince模块,问几个问题 1 把win ce 嵌入到像ARM9平台上,那么wince 这个软件价格怎样?像蛮多做实验板的开发商提供的一些软件包就以用了吗?如果真做成了一个产品,是基于wince OS的,那么这个需要正式向微软件购买使用版权费吗? 2 wince 嵌入 ...… 查看全部问答> |
|
急求汇编程序 要求能实现输入,查找,统计,输出 如:输入一个字符串 查找有没有A(或60)要是有的话统计一共有几个A(或60)然后把结果输出 二进制的数转换成十六进制(或十进制)以ASCII码输出 “进制的数转换成十六进 ...… 查看全部问答> |
|
我使用的是RVDS2.2. 在编译设置选项里设置只要我选择ARMV6系列的芯片,编译连结可以通过,但DEBUG(运行)的时候GO MAIN就会出错,提示有未定义的指令。而只要选择V6以下的芯片,都是好着的。 编译的程序很简单,就是一个MAIN函数。 请高手指点一 ...… 查看全部问答> |




