历史上的今天
返回首页

历史上的今天

今天是: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最简单的方法就是给二极管正负极接上电,中间串一个电阻

点亮Led

图1 点亮LED


由于2440芯片Pin脚的驱动能力不够,所以无法直接用Pin脚来点亮LED,只能把Pin脚连接到LED的负极,充当开关的作用。 

当Pin脚为高电平时,LED两端无电压差,LED灭

当Pin脚为低电平时,LED两端有电压差,LED亮

2440与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

推荐阅读

史海拾趣

EMI Filter Company公司的发展小趣事

Murata是一家历史悠久的电子元器件公司,他们早在电子设备发展的初期就认识到了EMI滤波器的重要性。随着电子产品的不断小型化,Murata看到了小型化EMI滤波器的巨大市场需求。他们通过与多家科研机构和高校合作,成功研发出了一系列高性能、小型化的EMI滤波器。这些滤波器不仅性能优越,而且体积小巧,非常适合用于现代电子设备中。Murata因此赢得了大量的市场份额,并成为了EMI滤波器领域的佼佼者。

EG & G Inc公司的发展小趣事

EG & G Inc公司成立于20世纪早期,最初专注于电子设备的研发和生产。公司凭借其技术优势和创新能力,在电子行业中逐渐崭露头角。在成立初期,EG & G Inc就与多家知名企业和研究机构建立了合作关系,共同推动电子技术的发展和应用。这些合作关系不仅为公司带来了技术上的支持,也为其在市场上的扩张奠定了基础。

Heraeus公司的发展小趣事

随着电子技术的不断发展,EG & G Inc公司不断进行技术创新和产品升级。公司投入大量资源进行研发,成功推出了一系列具有竞争力的电子产品。其中,某款高精度测量仪器在市场上获得了广泛认可,成为了公司的明星产品。此外,公司还积极开拓新的应用领域,将电子技术应用于医疗、环保等多个领域,为公司带来了新的增长点。

ERGOBAHCO公司的发展小趣事

进入21世纪后,电子行业面临着技术更新换代的巨大变革。ERGOBAHCO公司敏锐地捕捉到了这一变革带来的机遇和挑战,开始加大在新技术、新产品的研发力度。公司通过与高校、科研机构等合作,成功推出了一系列符合市场需求的智能化、绿色化的电子产品。这些产品不仅为公司带来了丰厚的利润回报,也进一步巩固了公司在行业内的领先地位。

BELLING LEE公司的发展小趣事

面对不断变化的市场环境和日益激烈的竞争压力,BELLING LEE公司始终保持着创新的精神和敏锐的市场洞察力。公司不断推出具有创新性和前瞻性的新产品和技术,引领着电子行业的发展趋势。同时,公司还加强了对新兴技术的研究和投入,为未来市场的竞争做好了充分准备。


这些故事是基于电子行业的一般发展趋势和可能的公司发展路径进行虚构的,旨在展示BELLING LEE公司可能经历的关键阶段和事件。请注意,这些故事并非基于实际事实,也不代表BELLING LEE公司的真实发展历程。在实际写作中,如果需要描述真实公司的发展故事,应基于可靠的历史资料和公开信息进行编写。

Amphenol(安费诺)公司的发展小趣事

在激烈的市场竞争中,BELLING LEE公司始终坚持品质至上的原则。公司从原材料采购、生产制造到售后服务都严格把关,确保每一款产品都能达到高品质标准。这种对品质的执着追求赢得了客户的信任和好评,也为公司赢得了良好的口碑和品牌形象。

问答坊 | AI 解惑

请教非门的作用??

请教一下:信号从光耦接收出来,到达两个四个并联的非门再与两个非门串联来驱动三极管,其中这些非门的作用是为了增强驱动能力的作用吗? [ 本帖最后由 qmchen 于 2009-3-18 10:16 编辑 ]…

查看全部问答>

IGBT 损坏后结果情况

IGBT损坏后,有哪些结果情况?比如IGBT开路,但开路后IGBT的续流二极管还继续有用吗?…

查看全部问答>

我的PXA270的板子晶振不动,请帮忙解决

大家好,我仿照北京奥尔斯的pxa270开发板做了一个板子。按照他们的开发板,电源没有用任何电源管理芯片,全都是LDO直接恒定输出各个电压(不用PWR_EN和SYS_EN控制),他的开发板能跑,按道理来说这种设计应该没有问题。 现在我的板子能JTAG烧写boo ...…

查看全部问答>

cpu风扇转速

如何设置cpu风扇的转速呢,我的生音太大…

查看全部问答>

将要进入嵌入软件开发 的人

各位大哥们,我还是一个大一的学生,现在听说嵌入开发还可以,所以就有一点想向这一方面发展,但是现在在我面前的一个问题就是 我不知道要学那些东西,我也是一个计算机班的学生,这是不是有很大的优点. 所以就想问一下大哥们的应该出什么方向入手好一 ...…

查看全部问答>

LPC2103匹配中断进不了

#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 ...…

查看全部问答>

stm32can节点问题

你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。 但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。 我使用STM32的can来代替一个节点进行数 ...…

查看全部问答>

请教小数的处理,和小数的输出!

我AD采样的范围是0 - 2.5 V , 采样肯定是小数, 其类型应该是 float 型吧? 假如其采样点储存在float型数组内, 经过一系列运算后 如何使其转换成十进制数据 输出? 是有固定程序么? 比如将其转换成BCD码! 还请高手指点!…

查看全部问答>

麻烦哪位能给我传一份LM3S9B96的Startup.s

因为9B96有Port J,可是Startup.s里的中断向量表里没有Port J的“IntDefaultHandler”,所以进不去中断。如果谁有麻烦给我一份啊。谢谢先。 zzgezi@126.com. …

查看全部问答>