1. 确定硬件连接
打开ok6410底板电路图,找到led,可以发现nledx为0时led点亮。
找到led的控制引脚,发现led控制引脚通过连接器连到了核心板:
打开核心板电路图,找到对应的连接器中相同位置下的引脚,发现核心板上的命名与底板相同。
注意:设计者为了方便会将核心板与底板连接处的端口命名为相同的名字,但判断两者的连接位置与端口名其实是没有关系的。从底板上可以看出4个led所在的连接器引脚编号分别为47,49,46和39,因此在核心板上应该找连接器上这几个编号的引脚,核心板连接器上47,49,46和39号引脚才是与底板led相连的引脚,只不过设计者为了方便,将核心板上这几个引脚也命名为nled1~4。
继续在核心板上寻找,能找到nledx控制的引脚为gpm0~3
2. 确定gpm相关寄存器的地址和要写入的值
打开6410的芯片手册,找到gpm相关寄存器
可以发现有3个寄存器与gpm相关,三个寄存器的地址分别为0x7f008820、0x7f008824、0x7f008828,其中gpmcon用于配置引脚功能
我们要控制led需要把gpm0~3都配置成输出模式,因此gpmcon的位[15:0]应为0x1111。gpmdat用于控制引脚输出电平
如果要控制led全亮,则gpmdat位[3:0]应为0x0,全灭则为0xf。gpmpud用于使能引脚的上下拉,一般会将led控制引脚配置为上拉模式(注意区分信号的输入输出和电流的流入流出,gpmcon配置输出指的是信号从6410输出到外部,当输出信号为0的时候电流会流入6410芯片)。因此gpmpud的位[7:0]应为0xaa。
3. 编写汇编代码
编写led.s
1 .section .text
2 .global _start
3 _start:
4 ldr r0, =0x7f008820 @gpmcon,也可以认为是gpm寄存器基地值
5
6 ldr r1, [r0] @取出gpmcon的值
7 ldr r2, =0xffff
8 bic r1, r1, r2
9 ldr r2, =0x1111
10 orr r1, r1, r2
11 str r1, [r0] @配置gpm0~3为输出模式
12
13 ldr r1, [r0, #4] @取出gpmdat的值
14 orr r1, r1, #0xf
15 str r1, [r0, #4] @gpmdat低4位置1,所有led关闭
16
17 ldr r1, [r0, #8] @取出gpmpud的值
18 bic r1, r1, #0xff
19 orr r1, r1, #0xaa
20 str r1, [r0, #8] @gpm0~3使能上拉
21 loop:
22 ldr r1, [r0, #4]
23 bic r1, r1, #0xf
24 orr r1, r1, #0xe
25 str r1, [r0, #4] @点亮第一个led
26 bl delay
27
28 ldr r1, [r0, #4]
29 bic r1, r1, #0xf
30 orr r1, r1, #0xd
31 str r1, [r0, #4] @点亮第二个led
32 bl delay
33
34 ldr r1, [r0, #4]
35 bic r1, r1, #0xf
36 orr r1, r1, #0xb
37 str r1, [r0, #4] @点亮第三个led
38 bl delay
39
40 ldr r1, [r0, #4]
41 bic r1, r1, #0xf
42 orr r1, r1, #0x7
43 str r1, [r0, #4] @点亮第四个led
44 bl delay
45 b loop
46 delay:
47 ldr r2, =0x1000000
48 delay_loop:
49 sub r2, r2, #1
50 cmp r2, #0
51 bne delay_loop
52 mov pc, lr
53
54 .end
输入命令:
arm-none-linux-gnueabi-gcc -c led.s -o led.o
arm-none-linux-gnueabi-ld -ttext 0 led.o -o led.elf
arm-none-linux-gnueabi-objcopy -o binary led.elf led.bin
此时生成了可执行文件led.bin
4. 下载文件
连接minicom,重启后进入u-boot,输入dnw 50008000
在虚拟机中输入:sudo dnw led.bin
下载成功后在开发板中输入:go 50008000
此时可以看到4个led呈流水灯效果。
注意:我是利用u-boot下载程序,此时u-boot已经运行起来了,而u-boot已经做了很多初始化工作了,如设置堆栈指针、关闭看门狗、指定外设基地址等,如果想要将程序烧写进nandflash的0地址,则这些初始化工作必须自己做。
iPhone8什么时候上市?苹果秋季或发布iPhone7S, iPhone8或年底才有!
半定制快速芯片ASIC可实现高达9GHz的射频功能
若可获得正确的网络安全解决方案,中小企业愿成为IT服务提供商
SYS5000系列交直流充电桩测试系统检测标准
AMD升级EPYC 3000系列处理器,新增EPYC 3255型号处理器
LED裸机驱动电路图设计及编写汇编代码
YDJ-5KVA/50KV油浸式轻型高压试验变压器
开关柜内部元器件介绍
骏晔科技重磅发布CC2340蓝牙模块
LED显示屏常见故障及排除
iPVD的产品介绍
电压继电器在电路中起什么作用?
美国国际贸易委员会裁决称诺基亚和中兴没有侵害InterDigital的专利
Rogers CLTE-MW™层压板介绍
AS3992与R2000对比 详解AS3992与R2000性能差异
基于音频功放IC STK-1050的50W功放电路图
firefly AIO-3399ProC六核高性能人工智能主板简介
北斗系列:从一号到三号如何传承并升级?
国产GPU全面开花!服务器GPU、全功能GPU、高性能GPGPU…加速追赶国际巨头
英飞凌安全凌捷掩膜控制器被Visa选中用于拉美及加勒比地区的支付卡