历史上的今天
今天是:2024年09月08日(星期日)
2021年09月08日 | s3c2440学习之路-001 汇编点亮led
2021-09-08 来源:eefocus
1. 原理分析
2. 主要流程
3. 源码
4. dis文件分析
硬件平台: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 主要寄存器
主要使用到的寄存器只有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 18: eafffffe b 18 1c: 56000050 undefined 20: 56000054 undefined 因为ARM是流水线处理,分三步:取指,译码,执行。当执行到某条命令时,PC的数值已经跳到了当前命令地址+8的位置。 下面是对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 地址的数值是56000054 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 地址 数值 汇编指令 18: eafffffe b 18 1c: 56000050 undefined 20: 56000054 undefined
史海拾趣
|
大家好,我仿照北京奥尔斯的pxa270开发板做了一个板子。按照他们的开发板,电源没有用任何电源管理芯片,全都是LDO直接恒定输出各个电压(不用PWR_EN和SYS_EN控制),他的开发板能跑,按道理来说这种设计应该没有问题。 现在我的板子能JTAG烧写boo ...… 查看全部问答> |
|
各位大哥们,我还是一个大一的学生,现在听说嵌入开发还可以,所以就有一点想向这一方面发展,但是现在在我面前的一个问题就是 我不知道要学那些东西,我也是一个计算机班的学生,这是不是有很大的优点. 所以就想问一下大哥们的应该出什么方向入手好一 ...… 查看全部问答> |
|
#include<LPC21xx.h> #define uint8 unsigned char#define uint32 unsigned intvoid Timer0_ISR(void) __attribute__ ((interrupt));uint8 num; void DelayNs(uint32 dly){ uint32 i; for(;dly>0;dly--) &nbs ...… 查看全部问答> |
|
你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。 但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。 我使用STM32的can来代替一个节点进行数 ...… 查看全部问答> |
|
我AD采样的范围是0 - 2.5 V , 采样肯定是小数, 其类型应该是 float 型吧? 假如其采样点储存在float型数组内, 经过一系列运算后 如何使其转换成十进制数据 输出? 是有固定程序么? 比如将其转换成BCD码! 还请高手指点!… 查看全部问答> |
|
因为9B96有Port J,可是Startup.s里的中断向量表里没有Port J的“IntDefaultHandler”,所以进不去中断。如果谁有麻烦给我一份啊。谢谢先。 zzgezi@126.com. … 查看全部问答> |




