汇编led驱动的代码编写以及ubuntu下的烧录

文章目录

  • 前言
  • 一、实验代码详解
  • 二、编译
    • 1、arm-linux-gnueabihf-gcc 编译文件
    • 2、arm-linux-gnueabihf-ld 链接文件
    • 3、arm-linux-gnueabihf-objcopy 格式转换
    • 4、arm-linux-gnueabihf-objdump 反汇编
    • 5、编写Makefile文件
  • 三、代码烧写
    • 1、将 imxdownload 拷贝到工程根目录下
    • 2、给予 imxdownload 可执行权限
    • 3、向 SD 卡烧写 bin 文件
  • 总结


前言

今天在做汇编led驱动的时候的一些记录总结.


一、实验代码详解

实验流程:

  1. 使能时钟,简单的,我们为了偷懒直接将寄存器CCGR0-CCGR6设置为0xffffffff,也就是说,我们把所有的时钟都使能了
  2. 配置IO口复用为GPIO复用,因为此次实验led0对应GPIO3,于是配置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器为5
    在这里插入图片描述
    在这里插入图片描述
  3. 配置GPIO的电气特性,即 SW_PAD_GPIO1_IO03_BASE 寄存器
  4. 设置GPIO1_IO03为输出模式,即 GPIO1_GDIR 寄存器
  5. 点灯 低电平点亮,即GPIO1_DR 寄存器
    汇编代码如下:
.global _start_start:/* enable all clock  need to write the register CCGR0-CCGR6 to 0xffffffff */
ldr r0, =0x020C4068  /* register CCGR0 */
ldr r1, =0xffffffff 
str r1, [r0]    /* write the oxfffffffff to the CCGR0 */ldr r0, =0x020c406c  /* register CCGR1 */
str r1, [r0]   ldr r0, =0x020c4070  /* register CCGR2 */
str r1, [r0] ldr r0, =0x020c4074  /* register CCGR3 */
str r1, [r0] ldr r0, =0x020c4078  /* register CCGR4 */
str r1, [r0] ldr r0, =0x020c407c  /* register CCGR5 */
str r1, [r0] ldr r0, =0x020c4080  /* register CCGR6 */
str r1, [r0] /* multiplex the IO , make the IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5 */
ldr r0, =0x020e0068 /* address */
ldr r1, =0x05 
str r1, [r0]/* config Properties , config the Rigerster SW_PAD_GPIO1_IO03_BASE */
ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]/* set the GPIO1_IO03 -> OUTPUT mode   Register GPIO1_GDIR */
ldr r0, =0x0209c004
ldr r1, =0x0000008
str r1, [r0]/* open led0 , set the register GPIO1_DR to low */
ldr r0, =0x0209c000 
ldr r1, =0
str r1,[r0]/* loop */
loop:b loop

二、编译

1、arm-linux-gnueabihf-gcc 编译文件

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。
在这里插入图片描述

2、arm-linux-gnueabihf-ld 链接文件

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。请添加图片描述

3、arm-linux-gnueabihf-objcopy 格式转换

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
请添加图片描述

4、arm-linux-gnueabihf-objdump 反汇编

arm-linux-gnueabihf-objdump -D led.elf > led.dis

上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件

请添加图片描述
led.dis 里面是汇编代码,而且还可以看到内存分配情况。
请添加图片描述

5、编写Makefile文件

leds.bin:leds.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:rm -rf *.o led.bin led.elf led.dis

请添加图片描述
用法: make make clean

三、代码烧写

1、将 imxdownload 拷贝到工程根目录下

请添加图片描述

2、给予 imxdownload 可执行权限

chmod 777 imxdownload 

请添加图片描述

3、向 SD 卡烧写 bin 文件

./imxdownload led.bin /dev/sdd 

成功点亮请添加图片描述


总结

简单记录一下,唐怡佳继续加油叭!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幻兽帕鲁服务器多少钱一台?腾讯云新版报价

腾讯云幻兽帕鲁服务器4核16G、8核32G和16核64G配置可选,4核16G14M带宽66元一个月、277元3个月,8核32G22M配置115元1个月、345元3个月,16核64G35M配置580元年1个月、1740元3个月、6960元一年,腾讯云百科txybk.com分享腾讯云幻兽帕鲁…

Linux的常见指令和基本操作演绎【复习篇章一】

文章目录 前言下载安装 XShellXShell 下的复制粘贴热键操作01.ls指令tree 02.cd指令03.touch指令04.mkdir指令(重要):05.rmdir指令 && rm 指令(重要)06.组合07.man指令(重要)&#xff1…

【Linux 内核源码分析】多核调度分析

多核调度 SMP(Symmetric Multiprocessing,对称多处理)是一种常见的多核处理器架构。它将多个处理器集成到一个计算机系统中,并通过共享系统总线和内存子系统来实现处理器之间的通信。 首先,SMP架构将一组处理器集中在…

Unity 光照

光照烘培 光照模式切换为 Baked 或 Mixed,Baked 模式完全使用光照贴图模拟光照,运行时修改光照颜色不生效,Mixed 模式也使用光照贴图,并且进行一些实时运算,运行时修改光照颜色会生效 受光照影响的物体勾选 Contribute…

Cesium渲染白膜数据

async DrawBaiMoFun2() {// tiles 矩阵变换let changePostion = (tileSet, tx, ty, tz, rx, ry, rz, scale, center) => {if (!center) return;const m = Cesium.Transforms.eastNorthUpToFixedFrame(center);const surface =center ||Cesium.Cartesian3.fromRadians(cartog…

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练 是什么让 BERT 与众不同?双向性的优势使用云 TPU 进行训练BERT 结果让 BERT 为您所用 自然语言处理 (NLP) 面临的最大挑战之一是训练数据的短缺。由于 NLP 是一个具有许多…

语音生成、写作增强、论文辅助、英文学习,AI原生应用精彩推荐一箩筐!

崭新的2024年已然降临,飞桨星河社区再次涌现出诸多精彩纷呈的AI原生应用,快来一同探索,发现这些应用带来的无限惊喜与可能吧! 语音生成:10音色自由选择 应用介绍 本应用基于ERNIE SDK和语音合成工具,可以…

C++ 关于“常量”的知识整理:

目录 1 常量对象: 2 常量成员: 2.1常量数据成员: 常数据成员总结: 2.2常量成员函数(使用最多): 常成员函数总结: 3 常量引用: C中常量的值在程序运行中不允许被改…

QT+VS实现Kmeans聚类算法

1、Kmeans的定义 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使…

YOLOv8改进 | Conv篇 | 结合Dual思想利用HetConv创新一种全新轻量化结构CSPHet(参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是我结合Dual的思想利用HetConv提出一种全新的结构CSPHet,我们将其用于替换我们的C2f结构,可以将参数降低越75W,GFLOPs降低至6.6GFLOPs,同时本文结构为我独家创新,全网无第二份,非常适合用于发表论文,该结构非常灵活,利用Dual卷…

09. Springboot集成sse服务端推流

目录 1、前言 2、什么是SSE 2.1、技术原理 2.2、SSE和WebSocket 2.2.1、SSE (Server-Sent Events) 2.2.2、WebSocket 2.2.3、选择 SSE 还是 WebSocket? 3、Springboot快速集成 3.1、添加依赖 3.2、创建SSE控制器 3.2.1、SSEmitter创建实例 3.2.2、SSEmi…

YOLO自制数据集及训练

使用 Make Sense 网站进行标注 https://www.makesense.ai/可以让AI帮你先标一下 一定要点一下 + ,不然不会加进去 导出标签