04 点亮LED 汇编

2023-05-16

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 <halt>:
  18:	eafffffe 	b	18 <halt>
  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看来就是内存。只不过,这些内存你写入或读出,能控制管脚。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

04 点亮LED 汇编 的相关文章

  • STM32之点亮LED

    学习一个新的处理器 xff0c 第一个程序肯定就是点亮LED xff0c 它可以让我们较快的 较清晰的了解到一个处理器的程序结构 xff0c 学习32也不例外 xff0c 首先第一个程序我们就来点亮LED xff0c 点亮LED程序有很多种
  • 阿尔法点亮LED灯(一)汇编语言

    文章目录 前言一 GPIO介绍1 MX6U IO 复用2 MX6U IO 配置3 GPIO 配置4 GPIO 时钟使能5 61 61 GPIO的使用步骤 61 61 二 程序编写1 使能 GPIO1 时钟2 设置 GPIO1 IO03 的复
  • 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现

    觉得此编文章很详实 xff0c 故转载之 xff0c 来自http www amobbs com thread 5281512 1 1 html 开发板也差不多买了半年了 以前照着教程用的是软件是ADS 在win7下老是崩溃 后来才知道AD
  • 基于STM32F103入门1——点亮LED灯

    今天学习了STM32固件库点灯程序 点灯也可以玩过很多好玩的东西 xff0c 在这里做一下总结 STM32点灯程序合集 1 xff1a 新建固件库工程文件1 1找到一个固件库模板1 2 xff1a 打开KEIL5新建工程1 3 xff1a
  • STM32 创建LED工程,点亮LED

    容忍5V电压 FT 61 FIve Tolerate 允许5V 寄存器就是特殊的存储器 上拉输入和下拉输入 如果输入啥都不接 xff0c IO口输入电平极容易受外部电平干扰 xff0c 加上拉电阻就是为了保护输入引脚的电平 为了避免引脚悬空
  • 04 点亮LED 汇编

    1 原理图 从原理图看到 xff0c 3个LED分别由GPF4 GPF5和GPF6控制 2 寄存器描述 GPF4 GPF5和GPF6可用作输入输出 xff0c 或中断功能 要点亮LED xff0c 需要将IO设置为输出模式 xff0c 并输
  • STM32使用寄存器工程模板点亮一个LED灯

    1 环境说明 xff08 1 xff09 使用的是普中STM32F103开发板 xff08 2 xff09 keil 5软件 2 目的 点亮开发板上的LED1灯 3 步骤 xff08 1 xff09 定义一系列寄存器的宏 span clas
  • 仿真软件proteus点亮led实验

    在这个实验之前 xff0c 确保系统已经正确安装了proteus和keil工具 proteus是用来设计电路图的 xff0c keil是用来编写c语言代码并编译成芯片可用的hex程序的 前面安装keil的时候 xff0c 最后提到 xff0
  • STM32按键外部中断控制LED流水灯-HAL库

    续上一篇 基于HAL库的32流水灯 http t csdn cn 30QT4 一 硬件选用上 xff0c 我们增加一个四角按键 二 原理图设计 xff0c 上也增加一个开关 LED0 LED2 gt PA0 PA2引脚 KEY1 gt PA
  • LED高效恒流驱动电源的设计指导书

    参考链接 LED高效恒流驱动电源的设计指导书 LED灯驱动电源设计 LED恒流驱动电路 精 LED恒流驱动电路 led灯驱动电源电路图 led灯的驱动原理电路图方案详解 KIA MOS管 一 LED驱动电源原理 1 由于LED的光特性通常都
  • LED驱动IC厂家

    厂家芯片类别 世微半导体 英飞凌Infineon 壹芯半导体科技 xff08 深圳 xff09 有限公司 欧司朗OSRAM xff1a 汽车照明 深圳天微电子有限公司 中铭电子 深圳市华芯光电有限公司 宁波欧特电子科技有限公司 芯片介绍 l
  • LED测试方案及光谱图

  • 驱动框架入门之LED-linux驱动开发第4部分-朱有鹏-专题视频课程

    驱动框架入门之LED linux驱动开发第4部分 5199人已学习 课程介绍 本课程是linux驱动开发的第4个课程 xff0c 主要内容是驱动框架的引入 通过led驱动框架和gpiolib的这两个框架的详细解释 xff0c 让大家学习内核
  • RK3308 按键Key与LED灯

    硬件原理图 LED指示灯 麦克风阵列子板上使用12颗RGB灯作为效果指示灯 用户可以通过I2C总线配置LED灯驱动IC来是实现不同场景下的灯效 按键Key 麦克风阵列子板上集成五个控制按键 xff0c 分别为 xff1a 控制音量增减的VO
  • 实现4个按键控制8个LED灯1个数码管程序

    按要求C语言编程 xff0c 实现4个按键控制8个LED灯1个数码管程序 具体要求如下 xff1a 1 按键一 xff0c 清零作用 无论数码管以前显示何内容 xff0c 都归零 xff0c 显示0 xff1b 2 按键二 xff0c 加一
  • 51单片机——定时器

    51单片机 定时器 为什么使用定时器 定时器原理 定时器设置 中断配置 源代码 为什么使用定时器 之前我们的led灯每隔1s循环左移点亮的时候 使用的定时方法是在c程序执行若干次空循环 这样会耗费很多cpu资源 因为空轮询 本篇博客将使用5
  • LCD和LED屏幕的工作原理总结

    1 点阵取模原理之横向取模与纵向取模 1 1 针式打印机 针式打印机16针是纵向排列 每次打印垂直的16bit 然后右移一bit 继续下列打印 字节的MSB表示最上面的点 字节LSB表示最下面的点 由于汉字字模的点阵是横向排列的 而提供给打
  • 查找到 LED 的距离

    想象一下 您有一个圣诞树风格的 LED 灯 距相机的距离为 D 了解了 LED 灯 例如形状和强度 和相机 例如焦距 的属性 是否可以使用快照计算从相机到 LED 灯的距离 如果是 测量的准确度如何 明亮的光源本身对此不利因为明亮的光线通常
  • 如何在没有微控制器的情况下用 C++ 连接 LED 灯?

    我想在没有微控制器的情况下点亮 关闭 LED 我希望通过编写 C 程序来控制 LED 但我遇到的问题是把它们连接起来有没有免费的方法 如果相关的话 我正在使用 Windows XP 我有 LED 但没有微控制器 好吧 我找到了一些函数 但它
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

    背景 我有一个带有通知的应用程序 我想支持 LED 通知 并且它运行良好 在我的偏好中 我允许用户自定义 LED 通知 问题 如果设备不支持 LED 自定义选项 我不想显示这些选项 因为这可能会让用户感到困惑 如果您拥有的只是廉价的 And

随机推荐

  • 位运算的操作(加减乘除、负数、乘方、1的个数)

    一 位运算相关规律 43 口诀 c 43 43 中的位运算相关规律总结和口诀 二 加减乘除 int add int num1 int num2 int temp do temp 61 num1 num2 不进位相加 xff1a 异或 num
  • PgSQL upsert批量查询插入或更新(insert select/on conflict do update踩坑记录)

    PGSQL数据库中根据唯一索引判断存在不存在 xff0c 存在则更新 xff0c 不存在就新增 xff0c 可以参考下的sql xff0c 注意其中的item type item type id item group item group
  • 程序员必备的11个Github优质项目

    GitHub 不仅仅是一个版本控制服务 xff0c 它还是一个了不起的内容资源 xff0c 从免费的电子书和教程 xff0c 到面试准备材料和 34 了不起 34 的文章 xff0c 应有尽有 如果你是经常访问GitHub的开发者 xff0
  • spring为什么要使用三级缓存来解决循环依赖?

    不用三级缓存 xff0c 用二级缓存能不能解决循环依赖 这里我先说一下前面没提到的细节 xff0c 那就是通过ObjectFactory获取的Bean可能是两种类型 xff0c 第一种就是实例化阶段创建出来的对象 xff0c 还是一种就是实
  • nginx事件模块

    1 模块依赖 2 基础数据结构 2 1 ngx event t struct ngx event s void data unsigned write 1 unsigned accept 1 used to detect the stale
  • Object.create(null)与let o = {}区别

    在阅读 vue 源码中 xff0c 会看到使用Object create null 来创建不带有属性的对象 为什么不使用let o 61 呢 xff1f 因为使用let o 61 xff0c 对象o还是继承Object xff0c 会继承O
  • javascript之字符串

    replace replace pattern replacement 字段说明pattern字符串或者具有Symbol replace方法的对象replacement可以是字符串或者函数 字符串时 xff0c 会替换pattern匹配的子
  • win10重装遇到的问题

    今天在重装win10系统时遇到几个问题 xff0c 折腾了一整天 win10计算机意外地重新启动或遇到错误 解决方法 1 在出现错误提示的界面中我们按 Shift 43 F10 打开命令提示符 2 在命令提示符中输入 cd oobe xff
  • Arduino IDE搭建ESP8266开发环境,开发包下载过慢解决方法

    Arduino IDE搭建ESP8266开发环境 xff0c 开发板管理器中下载过慢解决方法 方法一 xff1a 1 首选项 附加开发板管理器网址 xff1a http arduino esp8266 com stable package
  • CheckBox的使用(一):onCheckedChanged事件

    重写接口 public void onCheckedChanged CompoundButton buttonView boolean isChecked package com example androidtest import and
  • 指针与引用的关系

    c xff0b xff0b 中的引用与指针的区别 相同点 xff1a 1 都是地址的概念 xff1b 指针指向一块内存 xff0c 它的内容是所指内存的地址 xff1b 引用是某块内存的别名 区别 xff1a 1 指针是一个实体 xff0c
  • C&C++图形图像处理开源库

    Google三维APIO3D O3D 是一个开源的 WebAPI 用来在浏览器上创建界面丰富的交互式的 3D 应用程序 这是一种基于网页的可控3D标准 此格式期望真正的基于浏览器 xff0c 独立于操作系统之外 xff0c 并且支持主流的3
  • protobuf的ParseFromArray 解析失败的问题

    前段时间 xff0c 在解析定义的Message时 xff0c 总是提示解析失败 xff0c 刚开始以为是消息号与消息没有对应上 xff0c 检查后发现消息号与消息是对应的 后来发现消息的一个字段定义为required 但是没有赋值 xff
  • Incorrect number of FETCH variables

    在写存储过程 xff0c 运行后提示 Incorrect number of FETCH variables 原来是用游标select的字段数需要与fetch into的变量数一致 修改后的如下 xff1a DROP PROCEDURE I
  • phpStorm 2016.1 最新版激活方法

    新版激活方法 1 在线激活 最新 http 123 206 193 241 1017 http www 0 php com 1017 xff08 可用 xff0c 更新于 20170621 xff09 http idea singee77
  • Android EditText最大字数限制并提示

    public class MaxTextLengthFilter implements InputFilter private int mMaxLength 构造方法中传入最多能输入的字数 public MaxTextLengthFilte
  • Android调用系统, 任意比例裁剪图片

    废话不多说 直接上代码 核心代码 span class hljs javadoc 跳转到系统裁剪图片页面 span class hljs javadoctag 64 param span imagePath 需要裁剪的图片路径 span s
  • Kotlin教程学习-字符串拼接,数组,List

    摘要 Kotlin是一种优雅的语言 是JetBrains公司开发的JVM语言 与Java有着极密切的联系 Kotlin有着怎样的魅力呢 首先看到的就是import语句 这个很好理解 既然Kotlin有包的概念 自然就可以使用import语句
  • Android app启动白屏优化

    可以看到启动的时候会有一个白屏 如果手机较慢的话 这个白屏就会持续一段时间 不太友好 那么还有没有什么办法优化呢 给我们的应用窗口弄一个PlaceHolder Android最新的Material Design有这么个建议的 建议我们使用一
  • 04 点亮LED 汇编

    1 原理图 从原理图看到 xff0c 3个LED分别由GPF4 GPF5和GPF6控制 2 寄存器描述 GPF4 GPF5和GPF6可用作输入输出 xff0c 或中断功能 要点亮LED xff0c 需要将IO设置为输出模式 xff0c 并输