硬件平台:jz2440 软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5
1.原理分析
点亮LED最简单的方法是连接二极管的正负极,并在中间串一个电阻
图1 点亮LED
由于2440
芯片Pin脚的驱动能力不够,不能直接使用Pin脚来点亮LED,只能把Pin脚连接到LED负极,作为开关。 当Pin脚为高电平时,LED两端无电压差,LED灭 当Pin脚是低电平时,LED两端有电压差,LED亮
图2 2440连接LED
2.主要流程
2.1原理图介绍
这里只介绍LED1, LED1负极与2440的GPF4连接,中间串联1K电阻, LED1正极接3.3V,
图3 LED1对应的Pin脚
图4 LED1的接法
2.2 主要寄存器
主要使用的寄存器只有两个 GPFCON,地址为0x56000050 GPFDAT,数据寄存器, 地址为0x56000054
图5 主要寄存器
2.3 软件流程
主要流程简单: 1)将GPF4配置输出模式 2)将GPF4输出低电平并点亮LED1
3源码
3.1汇编源代码,文件名称 led_on.s
.text .global _start _start: /* 1, set output mode * GPFCON [9:8] 01 * 0x56000050 */ ldr r1, =0x56000050 ldr r0, =0x100 str r0, [r1] /* 2, set value to 0 * GPFDAT [4] 0 * 0x56000054 */ ldr r1, =0x56000054 ldr r0, =0 str r0, [r1] loop: b loop
3.2 Makefile
all: arm-linux-gcc -c -o led_on.o led_on.s arm-linux-ld -Ttext 0 led_on.o -o led_on.elf arm-linux-objcopy -O binary -S led_on.elf led_on.bin clean: rm *.elf *.o *.bin -rf
4dis文件分析
执行Makefile后,会生产led_on.elf文件。再通过 arm-linux-objdump -D led_on.elf > led_on.dis 生成dis文件
产生的dis文件内容如下
led_on.elf: file format elf32-littlearm Disassembly of section .text: 00000000 <_start>: 0: e59f1014 ldr r1, [pc, #20] ; 1c <.text 0x1c> 4: e3a00c01 mov r0, #256 ; 0x100 8: e5810000 str r0, [r1] c: e59f100c ldr r1, [pc, #12] ; 20 <.text 0x20> 10: e3a00000 mov r0, #0 ; 0x0 14: e5810000 str r0, [r1] 00000018 <loop>: 18: eafffffe b 18 <loop> 1c: 56000050 undefined 20: 56000054 undefined
因为ARM流水线处理分为三个步骤:取指、译码、执行。当执行到某一命令时,。 下面是对dis文件的分析
分析反汇编代码 led_on.elf: file format elf32-littlearm Disassembly of section .text: 地址 机器码 汇编指令 00000000 <_start>: 这里是pc 20的值, pc = 当前地址 8 = 0 8 [pc, #20] = [0 8 20] = 28 = 0x1c 0x1c 地址值为 56000050 r1 = 56000050 0: e59f1014 ldr r1, [pc, #20] ; 1c <.text 0x1c> r0 = 0x100 4: e3a00c01 mov r0, #256 ; 0x100 56000050 地址的值 = 0x100 8: e5810000 str r0, [r1] [pc, #12] = [ 0xc 8 12] = 32 = 0x20 0x20 56000600054 r1 = 56000054 c: e59f100c ldr r1, [pc, #12] ; 20 <.text 0x20> r0 = 0 10: e3a00000 mov r0, #0 ; 0x0 56000064地址的值=0 14: e5810000 str r0, [r1] 00000018 <loop>: 地址 数值 汇编指令 18: eafffffe b 18 <loop> 1c: 56000050 undefined 20: 56000054 undefined