汇编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.s
    arm-linux-gnueabihf-gcc -g -c led.s -o led.o
    arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
    arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
    arm-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.mfbz.cn/a/352728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言刷题系列】交换两个变量的三种方式

文章目录 1.使用临时变量(推荐) 2.相加和相减的方式(值较大时可能丢失数据) 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的…

数仓治理-计算资源治理

注:文章参考: 数据治理实践 | 网易某业务线的计算资源治理从计算资源治理实践出发,带大家清楚认识计算资源治理到底该如何进行,并如何应用到其他项目中https://mp.weixin.qq.com/s/w6d5zhDaaavNhW_DMEkPsQ 目录 一、计算资源治理的背景 二…

代码随想录算法训练营第15天| Leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

目录 Leetcode 104.二叉树的最大深度 Leetcode 559.n叉树的最大深度 Leetcode 111.二叉树的最小深度 Leetcode 222.完全二叉树的节点个数 Leetcode 104.二叉树的最大深度 题目链接:Leetcode 104.二叉树的最大深度 题目描述:给定一个二叉树,…

【驱动系列】C#获取电脑硬件显卡核心代号信息

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《驱动系列》文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点…

Python笔记12-多线程、网络编程、正则表达式

文章目录 多线程网络编程正则表达式 多线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 进程: 就是一个程序,运行在系统之上,那么便称之这个程序为一个运…

Linux进程间通信(IPC)机制之一:管道(Pipes)详解

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:Nonsense—Sabrina Carpenter 0:50━━━━━━️💟──────── 2:43 🔄 ◀️ ⏸ ▶️ …

关于session每次请求都会改变的问题

这几天在部署一个前后端分离的项目,使用docker进行部署,在本地测试没有一点问题没有,前脚刚把后端部署到服务器,后脚测试就出现了问题!查看控制台报错提示跨域错误?但是对于静态资源请求,包括登…

数据结构.线性表

1.静态分配 #include<iostream> using namespace std; const int N 10; typedef struct {int data[N];int length;}SqList; void InitList(SqList &L) {for (int i 0; i < N; i){L.data[i] 0;}L.length 0; }int main() {SqList L;InitList(L);return 0; }2.动…

2024年AI全景预测

欢迎来到 2024 年人工智能和技术的可能性之旅。 在这里&#xff0c;每一个预测都是一个潜在的窗口&#xff0c;通向充满创新、变革、更重要的是类似于 1950 年代工业革命的未来。 20 世纪 50 年代见证了数字计算的兴起&#xff0c;重塑了行业和社会规范。 如今&#xff0c;人工…

运行adprep /forestprep扩展Active Directory架构

运行 adprep /forestprep 是为了扩展Active Directory架构&#xff0c;以便为整个林添加新版本Windows Server所支持的新类、属性和其他目录对象。在升级到更高版本的Windows Server并提升林功能级别之前&#xff0c;通常需要执行此操作。 以下是详细步骤&#xff1a; 确认环境…

flask框架制作前端网页作为GUI

一、语法和原理 &#xff08;一&#xff09;、文件目录结构 需要注意的问题&#xff1a;启动文件命名必须是app.py。 一个典型的Flask应用通常包含以下几个基本文件和文件夹&#xff1a; app.py&#xff1a;应用的入口文件&#xff0c;包含了应用的初始化和配置。 requirem…

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式&#xff1a;2. C11方式&#xff1a; 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中&#xff0…

Nginx与keepalived实现集群

提醒一下&#xff1a;下面实例讲解是在mac虚拟机里的Ubuntu系统演示的&#xff1b; Nginx与keepalived实现集群实现的效果 两台服务器都安装Nginx与keepalived&#xff1a; master服务器的ip(192.168.200.2) backup服务器的ip(192.168.200.4) 将 master服务器Nginx与keepalive…

【Mybatis的一二级缓存】

缓存是什么&#xff1f; 缓存其实就是存储在内存中的临时数据&#xff0c;这里的数据量会比较小&#xff0c;一般来说&#xff0c;服务器的内存也是有限的&#xff0c;不可能将所有的数据都放到服务器的内存里面&#xff0c;所以&#xff0c; 只会把关键数据放到缓存中&#x…

C# 命名管道NamedPipeServerStream使用

NamedPipeServerStream 是 .NET Framework 和 .NET Core 中提供的一个类&#xff0c;用于创建和操作命名管道的服务器端。命名管道是一种在同一台计算机上或不同计算机之间进行进程间通信的机制。 命名管道允许两个或多个进程通过共享的管道进行通信。其中一个进程充当服务器&…

RNN预测下一句文本简单示例

根据句子前半句的内容推理出后半部分的内容&#xff0c;这样的任务可以使用循环的方式来实现。 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种用于处理序列数据的强大神经网络模型。与传统的前馈神经网络不同&#xff0c;RNN能够通过其…

独享http代理安全性是更高的吗?

不同于共享代理&#xff0c;独享代理IP为单一用户提供专用的IP&#xff0c;带来了一系列需要考虑的问题。今天我们就一起来看看独享代理IP的优势&#xff0c;到底在哪里。 我们得先来看看什么是代理IP。简单来说&#xff0c;代理服务器充当客户机和互联网之间的中间人。当你使用…

C/C++ - 面向对象编程

面向对象 面向过程编程&#xff1a; 数据和函数分离&#xff1a;在C语言中&#xff0c;数据和函数是分开定义和操作的。数据是通过全局变量或传递给函数的参数来传递的&#xff0c;函数则独立于数据。函数为主导&#xff1a;C语言以函数为主导&#xff0c;程序的执行流程由函数…

复式记账的概念特点和记账规则

目录 一. 复式记账法二. 借贷记账法三. 借贷记账法的记账规则四. 复试记账法应用举例4.1 三栏式账户举例4.2 T型账户记录举例4.3 记账规则验证举例 \quad 一. 复式记账法 \quad 复式记账法是指对于任何一笔经济业务都要用相等的金额&#xff0c;在两个或两个以上的有关账户中进…

GIT使用,看它就够了

一、目的 Git的熟练使用是一个加分项&#xff0c;本文将对常用的Git命令做一个基本介绍&#xff0c;看了本篇文章&#xff0c;再也不会因为不会使用git而被嘲笑了。 二、设置与配置 在第一次调用Git到日常的微调和参考&#xff0c;用得最多的就是config和help命令。 2.1 gi…