历史上的今天
返回首页

历史上的今天

今天是:2024年10月18日(星期五)

正在发生

2021年10月18日 | 04 点亮LED 汇编

2021-10-18 来源:eefocus

1 原理图

从原理图看到,3个LED分别由GPF4、GPF5和GPF6控制。

2 寄存器描述

GPF4、GPF5和GPF6可用作输入输出,或中断功能。要点亮LED,需要将IO设置为输出模式,并输出低电平。怎么做?

关于GPIO的寄存器描述如下(主要关注配置CON和数据DCT寄存器):

3个LED对应的CON与DAT寄存器功能,以及寄存器地址描述:

3 2440启动过程

大多数ARM芯片,CPU从0地址启动。


NorFlash启动时,基地址为0,片内内存地址为0x4000 0000。CPU读出Nor上第1个指令(4字节)执行,CPU继续读出其他指令执行。


NAND启动时,片内4K RAM基地址为0,NorFlash不可访问。2440硬件把NAND前4K内容复制到片内RAM,然后CPU从0地址取出指令开始执行。


CPU内部有两类寄存器:R0、R1~R15,这类寄存器可以直接访问;GPFCON、GPFDAT,这类寄存器,以地址访问。


4 ARM常用汇编

ldr指令:ldr r0, [r1]  假设r1的值为x,则读取地址x上的4字节到r0


str指令:str r0, [r1]  假设r1的值为x,则把r0的值写入到地址x


b指令:跳转


mov指令:mov r0, r1 把r1的值赋值给r0


                  mov r0, #0x100  把立即数0x100赋值给r0


ldr指令: ldr r0,=0x12345678  伪指令,最终会被拆分成几条真正的ARM指令


以下是部分ARM指令介绍:

5 点亮LED灯的汇编代码


/*

 * 点亮LED1: GPF4

 */

.text

.global _start

 

_start:

 

/* 配置GPF4为输出引脚 

 * 把0x100写到地址0x56000050(GPFCON)上

 */

ldr r1, =0x56000050

ldr r0, =0x100

str r0, [r1] /* 把r0的值写到r1的地址 */

 

/* 设置GPF4输出高电平 

 * 把0x00写到0x56000054(GPFDAT)上

 */

ldr r1, =0x56000054

ldr r0, =0x0

str r0, [r1] /* 把r0的值写到r1的地址 */

 

/*

 * 死循环

 */

halt:

b halt

使用arm-linux-gcc进行编译,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 *.bin *.o *.elf

上传到ubuntu进行编译,使用oflash烧录bin文件,可以看到点亮led。


5 ARM寄存器和汇编分析

1 修改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

arm-linux-objdump -D led_on.elf > led_on.dis

 

clean:

rm *.bin *.o *.elf

上述代码反汇编文件:


 

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寄存器描述:

几个重要的寄存器:


sp:stack pointer 栈指针


lr:link register  返回地址


pc:program counter  程序计数器 = 当前指令地址 + 8  (流水线架构),当前执行地址A的指令时,已经在对地址A+4的指令进行译码,已经在读取地址A+8的指令。


反汇编分析:

可以看到,这里的GPFCON、GPFDAT,在CPU看来就是内存。只不过,这些内存你写入或读出,能控制管脚。


字节序:低位保存在低地址。

上一篇:04 点亮LED C

下一篇:03 2440烧写程序

推荐阅读

史海拾趣

C&H Technology公司的发展小趣事

为了进一步提升竞争力,C&H Technology积极寻求与其他企业的战略合作。公司与一家知名的手机制造商签订了长期合作协议,共同开发定制化芯片解决方案。同时,C&H Technology还与一家领先的半导体生产企业建立了战略联盟,共同研发新型半导体材料和生产工艺。这些战略合作不仅为公司带来了更多的商业机会,也提升了公司的技术水平和品牌影响力。

Amprobe公司的发展小趣事

为了进一步提升竞争力,C&H Technology积极寻求与其他企业的战略合作。公司与一家知名的手机制造商签订了长期合作协议,共同开发定制化芯片解决方案。同时,C&H Technology还与一家领先的半导体生产企业建立了战略联盟,共同研发新型半导体材料和生产工艺。这些战略合作不仅为公司带来了更多的商业机会,也提升了公司的技术水平和品牌影响力。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

在产品质量得到市场认可后,Elite Enterprises开始积极拓展国内外市场。公司参加了多个国际性的电子展会,展示了其高品质的LED产品,并成功吸引了众多客户的关注。同时,公司还加强了品牌建设,通过广告宣传和口碑传播等方式提高了品牌知名度和美誉度。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

随着市场的竞争加剧,Elite Enterprises意识到只有不断提升产品品质和技术水平,才能在竞争中立于不败之地。因此,公司加大了对研发的投资,不断引进先进的生产设备和检测仪器,并严格把控原材料采购和生产流程。这些努力使公司的LED产品在光效、寿命和稳定性等方面均达到了行业领先水平。

华润华晶公司的发展小趣事

在产品质量得到市场认可后,Elite Enterprises开始积极拓展国内外市场。公司参加了多个国际性的电子展会,展示了其高品质的LED产品,并成功吸引了众多客户的关注。同时,公司还加强了品牌建设,通过广告宣传和口碑传播等方式提高了品牌知名度和美誉度。

Apx-Crystal公司的发展小趣事

Apx-Crystal公司起初是一家专注于研发新型晶体振荡器的小型科技公司。在创始人的领导下,团队通过不懈的努力,成功研发出了一款具有高稳定性和长寿命的晶体振荡器,这一技术突破在行业内引起了广泛关注。随着产品性能的不断提升和成本的有效控制,Apx-Crystal开始赢得越来越多客户的青睐,市场份额逐年攀升。公司逐渐扩大生产规模,并在多个国家和地区设立了销售和服务网络,实现了从初创企业到国际知名电子元件供应商的华丽转身。

问答坊 | AI 解惑

十年(一)

林花谢了春红,太匆匆。 不知不觉中,我与BSS结缘已经十年。   最近经常反问自己,这10年究竟做了些什么?每次想这个问题的时候,要么一片空白,要么心乱如麻,因为我也没有想清楚自己到底做了些什么,似乎做了很多,又似乎什么也没有做 ...…

查看全部问答>

被同一个坑绊倒了两次-俺的100mWZIGBEE节点调试心得

拿到一个新的PAIC,台湾某厂的UP2202,2.4G频段专用,号称增益25db,输出功率能轻而易举的达到20dbm,恰好有个zigbee项目需要增加功率,于是毫不犹豫的上了它,嘿嘿!     按照原理图,俺画了块板子,看起来貌似该ic使用起来很“弱智” ...…

查看全部问答>

招聘网络师傅一名

要求:会DSP原理,能 经常上网!…

查看全部问答>

妨碍你成功的性格特点

知足 只要有吃有穿,腹饱体暖,就感到满足。这种人对生活没有一点欲求,怎么会创造富有与成功呢? 自满 自己的总是最好的,甚至认为自己应该成为别人效仿的标准。这种人不屑于与外界来往,他们根本不知道社会进步到什么程度,怎么可能有更 ...…

查看全部问答>

adoce3.1 对数据库的操作

m_pConn->put_Provider(L\"\\\\DiskOnChip\\\\pda\\\\myce.sdf\");         m_pConn->Open(L\"Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\\\\DiskOnChip\\\\pda\\\\myce.sdf\",TEXT(\"\"),TEXT(\"\"),adOpenUns ...…

查看全部问答>

VxWorks下实现了RPC Server,我在WINDOWS的PC上怎么访问?

我的设备上跑的是VxWorks,上面实现了一个RPC服务器,文档里面说是遵循SUN 的RPC规范(RFC1057),现在我在Windows平台下需要访问这个RPC服务器,这个要怎么做?…

查看全部问答>

求助:ce下如何使用看门狗

三星2440的芯片,想使用看门狗, 我现在写了一个驱动,看门狗做如下初始化: //Prescaler value=254, the clock division factor=128,Enable bit of the interrupt. int nCounts = 30000; v_pWatchRegs->rWTCON &= ~0xffff; v_pWatchRegs->rWT ...…

查看全部问答>

从根本上解决PLC高速计数器的计数误差

在应用高速计数器时往往会碰到,计数器与输入计数脉冲信号的脉冲电平不匹配、旋转编码器、光栅尺数据输出是TTL电平,而PLC高速计数器却要求接受的是0 - 24v传输脉冲信号、有的编码器为了提高编码器的可靠性,提供A+、A-,B+、B-,Z+、Z- 对称反相计 ...…

查看全部问答>

香水,给我个STM8s-discovery的软件包。

在ST扯淡的网站上找了两个小时没找到。 愤怒!!! 我需要ST-link STVP STVD 再次提出强烈抗议!!!…

查看全部问答>

新人报道,多多关照

很高兴加入论坛,希望与大家共同分享,交流,进步…

查看全部问答>