(二)裸机汇编--点亮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 的相关文章

  • 以TM32最小系统核心板(STM32F103C8T6)为主,实现led流水灯

    文章目录 题目要求一 GPIOx端口的各寄存器地址和详细参数二 用C语言 寄存器方式编程实现1 新建文件2 代码写入2 1 启动代码2 1 1 介绍启动代码2 1 2 添加启动代码 2 2 写入代码 三 编译调试1 编译2 调试 总结 题目
  • LED的C语言应用程序

    引言 在本文中 xff0c 用C语言编写一个LED灯的应用程序 xff0c 对文章 基于HDF的LED驱动程序开发 xff08 1 xff09 xff08 2 xff09 中开发的LED灯的驱动程序进行测试 另外 xff0c 在编写LED灯
  • insmod: can't insert 'led.ko': invalid module format详细解释

    insmod can 39 t insert 39 led ko 39 invalid module format 之前在Imx257学习版固件编写的驱动想直接移植imx257核心板的开发板上 以为2个板子的源码的引脚定义一样就没什么问题了
  • LED恒流驱动IC汇总

    这几天在找LED恒流驱动芯片 xff0c 无意间在LED网论坛上发现这个帖子 xff0c 分享给大家 xff01 LED恒流IC芯片大盘点 韩国LDT LD1016 16位最大90mA LED屏幕 护栏灯管恒流驱动IC LD1048 48位
  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • day02 LED

    一 回顾 1 C int char short typedef 起别名 指针 函数 void fun T int x int y 结构体 2 嵌入式 以应用为中心 物联网的框架 xff1a 感知层 网络层 平台层 应用层 3 搭建开发环境
  • Android手机控制ZigBee板上LED

    环境 xff1a Windows 编译器 xff1a IAREW8051 8 1 硬件 xff1a CC2530 协议栈 xff1a ZStack CC2530 2 3 0 1 4 0 手机 xff1a Android4 1 2 又重新开始
  • 点亮LED灯及IAR调试

    点亮LED灯 一开始想先通过简单的点亮一个灯的程序来试一下MCU xff0c 硬件上的原理图如下 xff1a 从这里看出PB4 PB5 PC3 PC4 PC5 PC7都能用 xff0c 还没接外设 xff0c 一开始我选择了 PB5 去外接
  • 【stm32CubeMX】基于STM32F103C8T6的LED闪烁并用Keil的软件仿真逻辑分析仪功能观察

    stm32CubeMX 基于STM32F103C8T6的LED闪烁并用Keil的软件仿真逻辑分析仪功能观察 一 安装STM32CubeMX二 安装HAL库三 新建项目四 keil仿真调试五 实现六 总结七 参考资料 一 安装STM32Cub
  • 通用LED闪烁代码模块(也可实现软件PWM)

    仅提供参考文件 xff1a 1 需要修改gpio引脚 2 需要根据平台实现软件定时器接口 xff0c 启动 xff0c 停止 xff0c 回调 xff0c 三个API 3 根据平台优化相关错误即可 pwm drv c Created on
  • 实现4个按键控制8个LED灯1个数码管程序

    按要求C语言编程 xff0c 实现4个按键控制8个LED灯1个数码管程序 具体要求如下 xff1a 1 按键一 xff0c 清零作用 无论数码管以前显示何内容 xff0c 都归零 xff0c 显示0 xff1b 2 按键二 xff0c 加一
  • STM32以中断的方式点亮LED小灯(标准库)

    STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 文章目录 STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 一 认识中断1 中断优先级 xff1a 2 中断嵌套 xff1a 3 中断执行流程4 中断
  • LCD与LED液晶显示屏的区别

    什么是LCD LCD是液晶显示屏Liquid Crystal Display的全称 xff0c 主要有TFT UFB TFD STN等几种类型的液晶显示屏无法定位程序输入点于动态链接库上 笔记本液晶屏常用的是TFT TFT xff08 Th
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键
  • LED驱动IC TM1616,TM1650,TM1651替代兼容型号(VK,AIP)

    产品型号 xff1a VK1650 产品品牌 xff1a VINKA 永嘉微电 永嘉微 封装形式 xff1a SOP16 概述 VK1650 是一种带键盘扫描电路接口的 LED 驱动控制专用电路 内部集成有 MCU 输入输出控制数字 接口
  • 51单片机——独立按键

    如图是独立按键的原理图 通电后io口都是高电平 当按下K1 k4后 io口接地 变为低电平 说明当P30 P33为0时 代表我们按下了独立按键 例程1 独立按键控制LED亮灭 include
  • 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
  • VHDL——连接开关和LED

    我有 Xilinx Spartan6 和下一个 VHDL 代码 library ieee use ieee std logic 1164 all use ieee numeric std all entity Switches Leds i
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 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