(二)裸机汇编--点亮LED

2023-05-16

目标:点亮LED

1、查数据手册

硬件图中,找到LED灯对应的GPIO
在这里插入图片描述
在这里插入图片描述
从二极管方向看出,端口输出低电平时,电流经过,LED点亮。

再到数据手册查找对应的寄存器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GPBCON:模式选择,GPIO配置可以有3中模式,输入、输出、DAC
GPBDAT:数据位
GPBUP:上拉禁能标志

2、纯汇编程序

LED1对应的是GPB5
(1)配置GPB5为输出引脚,给GPBCON寄存器写入(1 << 10)
(2)设置GPB5输出低电平,给GPBDAT寄存器写入(1 << 5)
(3)GPBUP保持默认

/*
 * LED.S
 * LED1:GPB5
 */

.text
.global _start

_start:

/* 配置GPF4为输出引脚
 * 把0x400写到地址0x56000010
 */
	ldr r1, =0x56000010	/* 0x56000010比较大,使用伪指令ldr,将0x56000010写入r1 */
	ldr r0, =0x400		/* mov r0, #0x400  带#表示立即数 */
	str r0, [r1]		/* r1作为地址,将r0的数据存放到r1地址对应位置 */


/* 设置GPB5输出低电平 
 * 把0写到地址0x56000014
 */
	ldr r1, =0x56000014
	ldr r0, =0	/* mov r0, #0 */
	str r0, [r1]

	/* 死循环 */
halt:
	b halt

3、编译程序

编译常用的命令在gcc/ld/objcopy/objdump命令中整理。
在终端中输入命令:

jw@pc:~/w/02-led$ arm-linux-gcc -c -o led_on.o LED.S 
jw@pc:~/w/02-led$ arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
jw@pc:~/w/02-led$ arm-linux-objcopy -O binary -S led_on.elf led_on.bin
jw@pc:~/w/02-led$ ls -l
总用量 20
-rwxrwxr-x 1 jw jw    36 5月  18 22:06 led_on.bin
-rwxrwxr-x 1 jw jw 33502 5月  18 22:05 led_on.elf
-rw-rw-r-- 1 jw jw   671 5月  18 22:05 led_on.o
-rwxrw-rw- 1 jw jw   522 5月  18 22:00 LED.S

也可以使用makefile:

all:
	arm-linux-gcc -c -o led_on.o LED.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

4、烧写程序

使用JLink往开发板的NOR FLASH中烧写这个程序
烧写过程与上一篇文章(一)MINI2440–恢复出厂相同。
烧写成功后,重启,led1被点亮了。

5、常用的汇编指令小结

ARM是RISC结构,在ARM架构下, 数据从内存到CPU之间的移动只能通过LDR/STR指令来完成. 而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位

比如想把数据从RAM中某处读取到CPU寄存器中,只能使用ldr

ldr(load)

ldr r0,=label 用于加载立即数或一个地址值到指定寄存器中

  • 如果label是立即数: ldr r0,=0X123 ;将0X123存入r0中

  • 如果name是个标识符: ldr r0,=label_1 ;将label_1所指向的地址值存入r0中

ldr r0,[r1] ;将R1地址中的值存到r0中

ldr r1,[r2,#16] ;将(r2+16)地址中的内容存到r1中

ldr r1,[r2],#4 ;将r2地址中的内容存到r1中,同时r2=r2+4

str(store)

str r1,[r2] ; 将r1中的值存到r2所指定的地址中

str r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中

str r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4

6、汇编+C

如果要使用C语言,则需要为C程序搭建环境,主要是配置堆栈,然后调用main函数。

而堆栈的栈顶位置随着Nand启动、非Nand启动而有所不同,对于MINI2440的内存空间,可以参考:

s3c2440启动过程分析

s3c2440启动过程详解 (主要讲启动时nand nor的地址映射)

  • 为什栈顶是4096而不是4095?
    可用栈空间大小是4096字节,sp始终指向最后一个进入堆栈的信息所在的单元。
    那么,入栈时,SP先减,再拷贝数据入栈;出栈时,先拷贝数据出栈,SP再加。栈空时,有SP=Stack.size;栈满时,有SP=0。
  • 为什么栈顶是4096而不是0?
    因为栈是从高地址向低地址生长

汇编程序,主要为C程序搭建运行环境和调用C:

/* Start.S */
.text
.global _start

_start:
	/* 关闭看门狗 */
	ldr r0, =0x53000000
	ldr r1, =0
	str r1, [r0]

	/* 设置内存: sp 栈 */
	/* 分辨是nor/nand启动
	 * 写0到0地址, 再读出来
	 * 如果得到0, 表示0地址上的内容被修改了
	 * 说明0地址对应片内sram,因为片内sram不用经过我们配置就可以被读写, 这就是nand启动模式
	 * 否则就是nor启动
	 */
	mov r1, #0
	ldr r0, [r1] /* 读出原来的值备份 */
	str r1, [r1] /* 0->[0] */ 
	ldr r2, [r1] /* r2=[0] */
	cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */
	ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
	moveq sp, #4096  /* nand启动 */
	streq r0, [r1]   /* 恢复原来的值 */


	/* 调用main */
	bl main

halt:
	b halt

C程序操作寄存器:

/* led.c */
int main()
{
	unsigned int *pGPBCON = (unsigned int *)0x56000010;
	unsigned int *pGPBDAT = (unsigned int *)0x56000014;

	/* 配置GPB5为输出引脚 */
	*pGPFCON = 0x400;
	
	/* 设置GPB5输出0 */
	*pGPFDAT = 0;

	return 0;
}

Makefile

all:
	arm-linux-gcc -c -o led.o led.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o led.o -o led.elf
	arm-linux-objcopy -O binary -S led.elf led.bin
	arm-linux-objdump -D led.elf > led.dis
clean:
	rm *.bin *.o *.elf *.dis
	

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

(二)裸机汇编--点亮LED 的相关文章

  • 这是什么问题main.c(40): error C267: 'led_blink_off': requires ANSI-style prototype

    这是一个编译错误 它表示在 main c 文件的第 40 行发现了一个函数 34 led blink off 34 xff0c 但是这个函数缺少 ANSI 风格的原型 prototype ANSI 风格的原型是一种函数声明的格式 xff0c
  • 串灯控制盒去掉怎么接_我家的LED串灯的线路出问题了,每隔一个都不亮

    我家的LED串灯的线路出问题了 每隔一个都不亮 串灯分成两组 xff0c 其中一组坏了 xff0c 看看坏的那组的第一个灯泡是不是坏了 2020 08 30 大厅的吸顶LED灯时亮时不亮怎么办是不是震流器出问题了 可能是驱动器坏了 xff0
  • 无线gprs控制卡服务器,无线LED控制卡/GPRS无线控制卡

    名称 xff1a gprs无线控制卡 型号 xff1a lztd02 控制范围 xff1a 1024 64 xff0c 1024 48 xff0c 1024 32 xff0c 2048 16 xff0c 双色减半 接口类型 xff1a 4个
  • 基于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 加上拉电阻就是为了保护输入引脚的电平 为了避免引脚悬空
  • STM32使用寄存器工程模板点亮一个LED灯

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

    STM32寄存器和库函数点灯 一 寄存器操作1 新建工程 xff0c 新建一个目录存放以后所有的工程stmproject xff0c 在这个目录下新建文件夹寄存器点灯 xff0c 文件名为LED 2 新建文件main c并双击source
  • 51 汇编语言编程:8个按键控制8个LED

    89C51汇编语言写8个按键控制8个LED 按键接P2口 xff0c LED接P1口 有6按键 xff0c 按下对应LED长亮 xff0c 重复按下 xff0c LED灭 xff1b 有两个特殊按键 xff0c 按下 xff0c 对应LED
  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • LED点阵-第1季第8部分-朱有鹏-专题视频课程

    LED点阵 第1季第8部分 1818人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第8个课程 xff0c 讲解了16 16LED点阵的驱动方式和文字显示 本课程的学习目标是理解点阵式LED屏幕的驱动方式 74HC59
  • 通用LED闪烁代码模块(也可实现软件PWM)

    仅提供参考文件 xff1a 1 需要修改gpio引脚 2 需要根据平台实现软件定时器接口 xff0c 启动 xff0c 停止 xff0c 回调 xff0c 三个API 3 根据平台优化相关错误即可 pwm drv c Created on
  • 【OK6410裸机程序】点亮LED

    globl start start 硬件相关的设置 Peri port setup ldr r0 61 0x70000000 orr r0 r0 0x13 mcr p15 0 r0 c15 c2 4 64 256M 0x70000000 0
  • LCD与LED液晶显示屏的区别

    什么是LCD LCD是液晶显示屏Liquid Crystal Display的全称 xff0c 主要有TFT UFB TFD STN等几种类型的液晶显示屏无法定位程序输入点于动态链接库上 笔记本液晶屏常用的是TFT TFT xff08 Th
  • 51单片机——LED灯

    如下图所示是51单片机的开发板原理图 我们想要让二极管D1亮 只需要把p20口置低电平即可 只需要把P2寄存器第0位置0 LED原理解释 CPU配置寄存器的值来控制硬件电路达到我们预期效果 例程1 点亮第一个LED include
  • 51单片机——LED点阵屏

    51单片机 LED点阵屏 LED点阵屏 LED点阵屏原理 74HC595串转并芯片 源代码 例程一 静态笑脸 效果展示 例程二 笑脸 gt 平脸 gt 哭脸 效果展示 LED点阵屏 c51的LED点阵屏其实就是一个8 8像素的屏幕 一共有6
  • 我可以更改 Android 设备的 LED 强度吗?

    有没有办法设置我想要的 LED 强度 我知道要打开 LED 我使用 p setFlashMode Camera Parameters FLASH MODE TORCH mycam setParameters p 但这段代码只是打开 LED
  • 查找到 LED 的距离

    想象一下 您有一个圣诞树风格的 LED 灯 距相机的距离为 D 了解了 LED 灯 例如形状和强度 和相机 例如焦距 的属性 是否可以使用快照计算从相机到 LED 灯的距离 如果是 测量的准确度如何 明亮的光源本身对此不利因为明亮的光线通常
  • Netbeans 中的 Arduino(处理)库和控制

    我正在尝试控制 4 个 LED 并从 4 个触点获取模拟输入 该程序是用java编写的 因此要访问arduino的功能 例如AnalogRead 和将LED设置为高或低 导入处理库可以让程序使用这些功能吗 我还想知道 如果程序会自行传输到a
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

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

    我正在尝试编写一个需要 LED 闪光灯进入手电筒模式的应用程序 问题是 Android 2 1不支持这种模式 因此我还不能支持该平台 这不是问题 但我正在为我的未婚夫编写它 而她的 Epic 4G 目前只有 2 1 我发现一些代码示例使用了

随机推荐

  • 【已解决】Microsoft Visual C++ Redistributable is not installed

    Error 导入torch xff0c 提示报错 xff1a Microsoft Visual C 43 43 Redistributable is not installed this may lead to the DLL load f
  • 设置让Windows每天在指定时间自动关机

    其实我们的电脑是可以设置每天在指定的时间点自动关机的 xff0c 具体操作方法 xff1a 1 开打电脑 xff0c 点击电脑系统左下角windows图标 xff0c 选择 控制面板 并进入 xff1b 如图 2 在控制面板界面找到 管理工
  • 在 AlmaLinux 9安装Docker Compose

    首先先安装Docker 如何在 AlmaLinux 8 上安装和使用 Docker 检查Docker版本 docker version 安装Docker Compose sudo curl L 34 https github com doc
  • 使用python搭建一个简单的FTP服务器

    从配置文件获取访问FTP服务器目录的用户名 密码 span class token keyword from span pyftpdlib span class token punctuation span authorizers span
  • 更改win10系统C:\Users\中文用户名为英文用户名

    文章目录 前言一 打开注册表二 查找路径三 重启电脑四 将用中文名与英文名进行链接五 测试是否成功 前言 注意 xff1a 做之前请先浏览一遍 xff0c 做任何操作之前都建议不要直接就做 xff0c 先看一看文档中有哪些操作点是需要小心的
  • Cityscapes数据集的深度完整解析

    cityscapes数据集是分割模型训练时比较常用的一个数据集 xff0c 他还可以用来训练GAN网络生成街景图片 数据集下载和文件夹组成 xff1a 整个数据集包含50个欧洲城市 xff0c 5000张精细标注图像 标注位于gtFine文
  • 使用分支——处理Git merge 冲突

    使用分支 处理Git merge 冲突 版本控制系统就是负责管理来自于多个提交者 xff08 通常是开发者 xff09 之间的提交的 有时候多个开发者可能会编辑同一部分内容 一旦开发者A编辑了开发者B正在编辑的内容 xff0c 冲突就会产生
  • 纯手工解密几大在线js加密网站(1)

    0x0 开头 最近闲来无事 xff0c 来看一下目前网络上哪家加密工具的强度最高的 本人技术有限 xff0c 最终结果不能代表什么 xff0c 大家有遇到什么其他的js加密技术破解难题的 xff0c 也可以一起互相讨论 xff0c 也可以问
  • 纯手工解密几大在线js加密网站(3)

    0x0 开头 续接上章 xff0c 心血来潮想挨个破解一下各大js加密的网站 xff0c 了解一下现有的js加密的逻辑 0x1 介绍 Sojson支持js的不可逆混淆加密 xff0c 和很多高级的加密配置 xff0c 还增加了小白专用的一键
  • 如何在局域网内设置多个网段

    连接状态中的 属性 按钮 xff0c 选择 TCP IPv4 协议 xff0c 点击下面的 属性 按钮 xff0c 点击 高级 按钮 在高级TCP IP设置里面点击 添加 按钮 输入新网段的ip地址 xff08 以192网段为例 xff09
  • B-猫猫向前冲(拓扑排序

    题意 xff1a input 输入有若干组 xff0c 每组中的第一行为二个数N xff08 1 lt 61 N lt 61 500 xff09 xff0c M xff1b 其中N表示猫猫的个数 xff0c M表示接着有M行的输入数据 接下
  • 配置wsl2的图形界面

    1 更新源 span class token function sudo span span class token function apt get span update span class token function sudo s
  • 关于yyyyMMdd的正则表达式的使用

    String pattern 61 34 0 9 3 1 9 0 9 2 1 9 0 9 1 0 9 1 1 9 0 9 2 1 9 0 9 3 34 43 34 0 13578 1 02 0 1 9 12 0 9 3 01 0 469 1
  • qt下使用opencascade源代码

    c 43 43 基础太弱 xff0c 纠正一下 xff0c 在PRO中使用包含目录就可以使用 lt gt xff0c 将下载的opencascade文件通过make编译和安装 xff0c 添加引用就可以了 如果你依然对以下没用的操作感兴趣
  • Linux系统下CPU频率的调整

    省电 or 流畅 root 64 android sys devices system cpu cpu0 cpufreq cat scaling available governors hotplug conservative ondema
  • 禁止显示Apache目录列表-Indexes FollowSymLinks

    第一种方法 禁止显示Apache目录列表 Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表 缺省情况下如果你在浏览器输入地址 xff1a http localhost 8080 如果你的文件
  • 第十一章、远程联机服务器SSH / XDMCP / VNC / RDP

    维护网络服务器最简单的方式不是跑去实体服务器前面登入 xff0c 而是透过远程联机服务器联机功能来登入主机 xff0c 然后再来进行其他有的没的维护就是了 Linux 主机几乎都会提供 sshd 这个联机服务 xff0c 而且这个服务还是主
  • 如何查看电脑jdk/jre版本以及安装路径

    一 按快捷键win 43 r打开运行窗口 二 输入cmd 回车 xff0c 打开命令框 三 输入 java version 查看jdk版本 注意 xff1a java后面需要有空格 xff0c 不然会报错 java span class t
  • AndroidID、IMEI、OAID获取

    前言 因为项目中经常会遇到要上传一系列设备信息的功能 xff0c 为了方便使用 xff0c 所以就拆分成以下系列文章来单独介绍如何获取各类设备信息 手机运营商获取 AndroidID IMEI OAID获取 地理位置信息经纬度获取 公网IP
  • (二)裸机汇编--点亮LED

    目标 xff1a 点亮LED 1 查数据手册 硬件图中 xff0c 找到LED灯对应的GPIO 从二极管方向看出 xff0c 端口输出低电平时 xff0c 电流经过 xff0c LED点亮 再到数据手册查找对应的寄存器 GPBCON xff