嵌入式Linux驱动开发——汇编点灯

嵌入式Linux驱动开发——汇编点灯

本文章开始记录学习嵌入式Linux的过程,使用的开发板是正点原子的阿尔法,以及左老师的书籍和视频。然后这个系列不会介绍基础知识(书上都有),主要是记录思考过程以及需要注意的点。

代码编写

使能时钟

🚀🚀这个地方的代码还是很简单的,主要就是去哪找CCM的地址,不过也不算难找,比如CCGR0,就是0x020c4068。

🚀🚀然后找到GPIO1的时钟由CCM_CCGR1 的 bit27 和 bit26 这两个位控制,将这两个位都设置位 11 即可

在这里插入图片描述

.global _start  /* 全局标号 */
/** 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、*		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。*/
_start:/* 1、使能GPIO1时钟 */ldr r1, =0xFFFFFFFF 	ldr r0, =0X020C406C  	/* CCGR1 */str r1, [r0]
  1. .global _start: 这是一个全局标签,标记了程序的起始位置。
  2. _start: 这是程序的入口点,程序将从这里开始执行。
  3. ldr r1, =0xFFFFFFFF: 这一行使能CCGR1。
  4. ldr r0, =0X020C406C: 这一行将立即数 0X020C406C 加载到寄存器 r0 中,这个值是GPIO1的时钟寄存器的地址。
  5. str r1, [r0]: 这一行将寄存器 r1 中的值写入到地址为 r0 的内存位置,即将生成的掩码写入到GPIO1的时钟寄存器,从而启用GPIO1时钟。

设置复用

  1. ldr r0, =0X020E0068: 这一行将立即数 0X020E0068 加载到寄存器 r0 中,这个值是SW_MUX_GPIO1_IO03_BASE寄存器的地址,也是像上面那样找。这个寄存器用于控制GPIO1_IO03引脚的复用功能。
  2. ldr r1, =0X5: 这一行将立即数 0X5 加载到寄存器 r1 中。在i.MX系列处理器中,设置为5的MUX_MODE表示该引脚被设置为GPIO模式,即将该引脚设置为普通GPIO引脚功能。
  3. str r1, [r0]: 这一行将寄存器 r1 中的值写入到地址为 r0 的内存位置,即将MUX_MODE设置为5,从而将GPIO1_IO03引脚的复用功能设置为GPIO1_IO03。
	/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */ldr r0, =0X020E0068	/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */ldr r1, =0X5		/* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */str r1,[r0]

在这里插入图片描述

设置IO

在这里插入图片描述

/* 3、配置GPIO1_IO03的IO属性	*bit 16:0 HYS关闭*bit [15:14]: 00 默认下拉*bit [13]: 0 kepper功能*bit [12]: 1 pull/keeper使能,开启上下拉*bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度100Mhz*bit [5:3]: 110 R0/6驱动能力*bit [0]: 0 低转换率*/ldr r0, =0X020E02F4	/*寄存器SW_PAD_GPIO1_IO03_BASE */ldr r1, =0X10B0str r1,[r0]

设置GPIO

🚀🚀这个的地址有一点点不一样,在GPIO Memory Map/Register Definition里面。

在这里插入图片描述

/* 4、设置GPIO1_IO03为输出 */ldr r0, =0X0209C004	/*寄存器GPIO1_GDIR */ldr r1, =0X0000008		str r1,[r0]/* 5、打开LED0
* 设置GPIO1_IO03输出低电平
*/ldr r0, =0X0209C000	/*寄存器GPIO1_DR */ldr r1, =0		str r1,[r0]/** 描述:	loop死循环*/
loop:b loop 			

编译

🚀🚀这四条命令用于将汇编代码编译、链接、转换为二进制文件,并生成反汇编文件,具体作用如下:

  1. arm-linux-gnueabihf-gcc -g -c led.s -o led.o
    • arm-linux-gnueabihf-gcc:使用arm-linux-gnueabihf工具链中的gcc编译器。
    • -g:生成带有调试信息的目标文件。
    • -c:表示只编译,不链接。
    • led.s:源文件名,这里是汇编代码文件。
    • -o led.o:指定输出的目标文件名为led.o,这里是编译后的目标文件。
  2. arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
    • arm-linux-gnueabihf-ld:使用arm-linux-gnueabihf工具链中的ld链接器。
    • -Ttext 0X87800000:指定链接地址,这里设置程序的起始地址为0X87800000。
    • led.o:输入的目标文件名,即刚刚生成的目标文件。
    • -o led.elf:指定输出的可执行文件名为led.elf,这里是链接后的可执行文件。
  3. arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
    • arm-linux-gnueabihf-objcopy:使用arm-linux-gnueabihf工具链中的objcopy工具。
    • -O binary:指定目标文件的格式为二进制。
    • -S:去除调试符号和调试信息。
    • -g:保留全局符号信息。
    • led.elf:输入的可执行文件名,即刚刚生成的可执行文件。
    • led.bin:指定输出的二进制文件名为led.bin,这里是转换后的二进制文件。
  4. arm-linux-gnueabihf-objdump -D led.elf > led.dis
    • arm-linux-gnueabihf-objdump:使用arm-linux-gnueabihf工具链中的objdump工具。
    • -D:显示反汇编代码。
    • led.elf:输入的可执行文件名,即刚刚生成的可执行文件。
    • > led.dis:将反汇编的结果输出到led.dis文件中,这里是生成的反汇编文件。
kali@ubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-gcc -g -c led.s -o led.o
kali@ubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
kali@ubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
kali@ubuntu:~/linux/driver/01_leds$ arm-linux-gnueabihf-objdump -D led.elf > led.dis

makefile

led.bin:led.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

🚀🚀这个Makefile文件用于管理编译、链接、转换和清理操作,具体作用如下:

  • led.bin: led.s:定义了一个目标文件led.bin,它依赖于led.s文件。也就是说,当led.s文件被修改时,会触发后续的编译、链接、转换操作。

  • arm-linux-gnueabihf-gcc -g -c led.s -o led.o:编译led.s文件为目标文件led.o,这里使用了arm-linux-gnueabihf工具链中的gcc编译器,并且指定生成带有调试信息的目标文件。

  • arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf:链接led.o文件为可执行文件led.elf,这里使用了arm-linux-gnueabihf工具链中的ld链接器,并且指定了链接地址为0X87800000。

  • arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin:将led.elf文件转换为二进制文件led.bin,这里使用了arm-linux-gnueabihf工具链中的objcopy工具,并且指定了输出的文件格式为二进制。

  • arm-linux-gnueabihf-objdump -D led.elf > led.dis:生成反汇编文件led.dis,这里使用了arm-linux-gnueabihf工具链中的objdump工具,并且指定了显示反汇编代码。

  • clean::定义了一个伪目标clean,用于清理生成的目标文件和中间文件。

  • rm -rf *.o led.bin led.elf led.dis:删除所有的目标文件和生成的二进制文件,以及反汇编文件。

代码烧录

🚀🚀这个就是使用imxdownload,比较简单

kali@ubuntu:~/linux/driver/01_leds$ ./imxdownload led.bin /dev/sdb
I.MX6ULL bin download software
Edit by:zuozhongkai
Date:2019/6/10
Version:V1.1
log:V1.0 initial version,just support 512MB DDR3V1.1 and support 256MB DDR3
file led.bin size = 88Bytes
Board DDR SIZE: 512MB
Delete Old load.imx
Create New load.imx
Download load.imx to /dev/sdb  ......
6+1 records in
6+1 records out
3160 bytes (3.2 kB, 3.1 KiB) copied, 0.0569602 s, 55.5 kB/s

结果

在这里插入图片描述

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

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

相关文章

Ceph学习 -3.存储简介

文章目录 1.存储简介1.1 存储类型1.1.1 储备知识1.1.2 三种存储1.1.3 块存储1.1.4 文件存储1.1.5 对象存储1.1.6 三种存储之间的关系1.1.7 总结 1.2 Ceph简介1.2.1 官方介绍1.2.2 软件特点1.2.3 基本结构1.2.4 应用场景 1.3 小结 1.存储简介 学习目标:这一节&#x…

抖音引流私域转化模式1.0现场视频,从抖音源源不断把人加到私域买单

抖音-引流私域转化模式1.0现场视频,从抖音源源不断把人加到私域,让加到私域的粉丝买单 课程内容:抖音引流私域转化模式1.0现场视频,从抖音源源不断把人加到私域买单 - 百创网-源码交易平台_网站源码_商城源码_小程序源码 01.第一…

Python | Leetcode Python题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n len(nums)best 10**7# 根据差值的绝对值来更新答案def update(cur):nonlocal bestif abs(cur - target) < abs(best - target):best…

LDR6328助力Type-C普及,便捷充电,绿色生活更精彩

随着科技的进步和全球统一接口的需求&#xff0c;Type-C接口正日益受到青睐。越来越多的设备正选择采纳这一先进的接口设计&#xff0c;它的普及无疑在改善着我们的日常生活。 在过往&#xff0c;许多小功率设备如小风扇、蓝牙音箱、桌面台灯以及家用加湿器等&#xff0c;都普遍…

Node.js进阶——Express

文章目录 一、初识Express1、概念2、安装3、使用3、托管静态资源4、nodemon 二、Express路由1、概念2、使用1&#xff09;简单使用2&#xff09;模块化路由 三、Express中间件1、介绍2、语法1&#xff09;基本语法2&#xff09;next函数作用3&#xff09;定义中间件函数4&#…

K8S - Service简介和 1个简单NodePort例子

大纲图 流量方向 如上图&#xff0c; 当用户or 别的service 从k8s 集群外部访问 集群内的services 流量方向有两种 一种是垂直方向&#xff0c; 通过域名 -> Load Balancer -> gateway -> services , 在k8s 一般是通过ingress 来实现&#xff0c; 而ingress 不是本文…

基于JSP SSM的社区生活超市管理系统

目录 背景 技术简介 系统简介 界面预览 背景 随着时代步伐的加速&#xff0c;计算机技术已广泛而深刻地渗透到社会的各个层面。随着居民生活水平的持续提升&#xff0c;人们对社区生活超市的期望和管理要求也越来越高。随着社区生活超市数量的稳步增长&#xff0c;开发一个…

项目:自主实现Boost搜索引擎

文章目录 写在前面开源仓库和项目上线其他文档说明 项目背景项目的宏观原理技术栈与环境搜索引擎原理正排索引倒排索引 去标签和数据清洗模块html文件名路径保存函数html数据解析函数文件写入函数 建立索引模块检索和读取信息建立索引建立正排索引建立倒排索引jieba工具的使用倒…

mysql结构与sql执行流程

Mysql的大体结构 客户端&#xff1a;用于链接mysql的软件 连接池&#xff1a; sql接口&#xff1a; 查询解析器&#xff1a; MySQL连接层 连接层&#xff1a; 应用程序通过接口&#xff08;如odbc,jdbc&#xff09;来连接mysql&#xff0c;最先连接处理的是连接层。 连接层…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十四篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…

最新高自定义化的AI翻译(沉浸式翻译),可翻译网页和PDF等文件或者文献(附翻译API总结,Deeplx的api,Deepl的api)

前序 常见问题&#xff1a; 1.有时候想翻译网页&#xff0c;又翻译文献怎么办&#xff1f;下两个软件&#xff1f; 2.什么软件可以翻译视频字幕&#xff1f; 3.什么软件可以翻译PDF文件&#xff1f; 沉浸式翻译介绍 可以翻译文献可以翻译视频字幕可以翻译PDF文件支持OpenAI翻译…

Linux中shell脚本的学习第一天,编写脚本的规范,脚本注释、变量,特殊变量的使用等,包含面试题

4月7日没参加体侧的我自学shell的第一天 Shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符 #&#xff01; 1)以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh, 也就是bash解释器 2)以#!/usr/bin/python 开头的文件&#…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

论文阅读《Semantic Prompt for Few-Shot Image Recognition》

论文地址&#xff1a;https://arxiv.org/pdf/2303.14123.pdf 论文代码&#xff1a;https://github.com/WentaoChen0813/SemanticPrompt 目录 1、存在的问题2、算法简介3、算法细节3.1、预训练阶段3.2、微调阶段3.3、空间交互机制3.4、通道交互机制 4、实验4.1、对比实验4.2、组…

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…

【Redis 知识储备】读写分离/主从分离架构 -- 分布系统的演进(4)

读写分离/主从分离架构 简介出现原因架构工作原理技术案例架构优缺点 简介 将数据库读写操作分散到不同的节点上, 数据库服务器搭建主从集群, 一主一从, 一主多从都可以, 数据库主机负责写操作, 从机只负责读操作 出现原因 数据库成为瓶颈, 而互联网应用一般读多写少, 数据库…

C++的List类(一):List类的基本概念

目录 前言 List类的基本概念 List的构造函数 List类迭代器的使用 List的功能 List的元素访问 List与vector比较 前言 vector的insert和erase都会导致迭代器失效list的insert不会导致迭代器失效&#xff0c;erase会导致迭代器失效 insert导致失效的原因是开辟了新空间后…

Visual Studio 2022-C语言如何防止头文件多次引入

头文件的包含 本地⽂件包含 #include "filename" 查找策略&#xff1a;先在源⽂件所在⽬录下查找&#xff0c;如果该头⽂件未找到&#xff0c;编译器就像查找库函数头⽂件⼀样在 标准位置查找头⽂件。 如果找不到就提⽰编译错误。 Linux环境的标准头⽂件的路径&…

如何自定义项目启动时的图案

说明&#xff1a;有的项目启动时&#xff0c;会在控制台输出下面的图案。本文介绍Spring Boot项目如何自定义项目启动时的图案&#xff1b; 生成字符图案 首先&#xff0c;找到一张需要设置的图片&#xff0c;使用下面的代码&#xff0c;将图片转为字符文件&#xff1b; impo…

【Unity每日一记】鼠标相关API

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…