正点原子阿尔法ARM开发板-IMX6ULL(四)——汇编LED驱动实验-下

news2024/11/25 13:55:02

文章目录

  • 一、驱动编写
    • 1.1 配置GPIO的电气属性
    • 1.2 配置GPIO的功能(GDIR寄存器)
    • 1.3 设置输出(DR寄存器)
    • 1.4 最终代码
  • 二、编译程序
    • 2.1 编译程序
    • 2.2 链接文件
    • 2.3 格式转换成BIN文件
    • 2.4 反汇编
  • 三、烧写bin到SD卡中并运行
    • 3.1 准备工作
    • 3.2 向SD卡烧写bin文件
    • 3.3 插入阿尔法的tf卡槽
  • 四、makefile的补充
  • 五、其他

一、驱动编写

1.1 配置GPIO的电气属性

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

根据设置换算成十六进制
在这里插入图片描述

    /*配置GPIO的电气属性
    即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    地址为:0X020E02F4

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

    */
    ldr r0, =0X020E02F4
    ldr r1, =0X10B0
    str r1, [r0]

1.2 配置GPIO的功能(GDIR寄存器)

GDIR,共32位,每一位控制一个GPIO
在这里插入图片描述
在这里插入图片描述

/*
    设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
    GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
    也就是设置GPIO1_GPIO03为输出
    */

    ldr r0, =0x0209C004
    ldr r1, =0x8
    str r1, [r0]

1.3 设置输出(DR寄存器)

在这里插入图片描述
在这里插入图片描述

    /*
    LED点亮,设置输出为0
    也就是设置DR寄存器
    */
    ldr r0, =0x0209C000
    ldr r1, =0
    str r1, [r0]

loop:
    b loop @死循环

1.4 最终代码


.global _start @全局标号

_start:
    /*使能所有寄存器*/
    ldr r0, =0x020C4068 @写入CCGR0的地址
    ldr r1, =0xFFFFFFFF @要写入的数据(全部使能)
    str r1, [r0]        @写入CCGR0

    ldr r0, =0x020C406C @写入CCGR1的地址(由于CCGR都是紧挨着的,每个间隔4位)
    str r1, [r0]        @写入CCGR1

    ldr r0, =0x020C4070 @写入CCGR2的地址
    str r1, [r0]        @写入CCGR2

    ldr r0, =0x020C4074 @写入CCGR3的地址
    str r1, [r0]        @写入CCGR3

    ldr r0, =0x020C4078 @写入CCGR4的地址
    str r1, [r0]        @写入CCGR4

    ldr r0, =0x020C407C @写入CCGR5的地址
    str r1, [r0]        @写入CCGR5

    ldr r0, =0x020C4080 @写入CCGR6的地址
    str r1, [r0]        @写入CCGR6

    /*配置GPIO1_3,使复用方式变为GPIO
    写入0101,即5
    寄存器是IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    */
    ldr r0, =0x020E0068 @写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
    ldr r1, =0x5        @要写入的数据
    str r1, [r0]        @写入

    /*配置GPIO的电气属性
    即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    地址为:0X020E02F4

    Bit0:      0   低速率
    bit5:3:   110 R0/6驱动能力
    bit7:6:    10  100MHZ速度
    bit11:     0   关闭开路输出
    bit12:    1   使能pull/keeper
    bit13:     0   keeper
    bit15:14   00  100K下拉
    bit16:     0   关闭迟滞

    */
    ldr r0, =0x020E02F4
    ldr r1, =0x10B0
    str r1, [r0]

    /*
    设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
    GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
    也就是设置GPIO1_GPIO03为输出
    */

    ldr r0, =0x0209C004
    ldr r1, =0x8
    str r1, [r0]

    /*
    LED点亮,设置输出为0
    也就是设置DR寄存器
    */
    ldr r0, =0x0209C000
    ldr r1, =0
    str r1, [r0]

loop:
    b loop @死循环

二、编译程序

2.1 编译程序

  1. 使用arm-linux-gnueabihf-gcc,将.c.s文件变为.o文件
  2. 将所有的.o文件连接为elf格式的可执行文件。
  3. 将elf文件转为bin文件。
  4. 将elf文件转为汇编,反汇编。

输入指令,编译文件
arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
其中 ““-g”选项是产生调试信息 GDB能够使用这些调试信息进行代码调试。“ “-c”选项是编译源文件,但是不链接。

2.2 链接文件

arm-linux-gnueabihf-ld用来将众多的 .o文件链接到一个指定的链接位置。
链接就是将所有.o文件链接在一起,并且链接到指定的地方。本实验链接的时候要指定链接起始地址。链接起始地址就是代码运行的起始地址。
对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM.也就是DDR。6ULL内部RAM地址范围0X900000 ~ 0X91FFFF。也可以放到外部DDR中,对于IMX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0X80000000 ~ 0X9 FFFFFFF。对于256MB的DDR来说,那就是0X80000000~0X8 FFFFFFF。
本系列视频,裸机代码的链接起始地址为0X87800000。要使用DDR,那么必须要初始化DDR,对于IMX来说BIN如文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡,EMMC等外置存储中读取头部信息,然后初始化DDR,并且将BIN如文件拷贝到指定的地方。BIN的运行地址一定要和链接起始地址一致。位置无关代码除外。
在这里插入图片描述

总结,就是I.MX有内部ram但是只有128k,但是外部可用的DDR,足足有512MB,所以放到DDR。
然后初始化,可以从外置存储中获取初始化参数

指令
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中 -Ttext就是指定链接地址,“-o”选项指定链接生成的 elf文件名

2.3 格式转换成BIN文件

arm-linux-gnueabihf-objcopy更像一个格式转换工具,我们需要用它将 led.elf文件转换为led.bin文件,命令如下:

指令
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“ ,“-O”选项指定以什么格式输出,后面的 binary”表示以二进制格式输出选项“ “-S”表示不要复制源文件中的重定位信息和符号信息 ,“-g”表示不复制源文件中的调试信息。

2.4 反汇编

大多数情况下我们都是用 C语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf文件反汇编

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

在这里插入图片描述
上述代码中的“ “-D”选项表示反汇编所有的段
在这里插入图片描述

三、烧写bin到SD卡中并运行

3.1 准备工作

6U儿L支持SD卡、EMMC、NAND、nor、SPIf1ash等等启动。裸机例程选择烧写到SD卡里面。
在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于lM仪而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。·

首先就是对TF卡进行格式化FAT32
在这里插入图片描述
最右边这个图标,右键,连接,
在这里插入图片描述
在这里插入图片描述
此时,TF卡进入了linux系统
再把imdounload放入文件夹
在这里插入图片描述
imxdownload使用方法,确定烧写的SD卡,确定是/dev/sdb
在这里插入图片描述

3.2 向SD卡烧写bin文件

在这里插入图片描述
所以我的指令是:
./imxdownload led.bin /dev/sdb
实际上生成了load.imx文件,里面有头部文件

3.3 插入阿尔法的tf卡槽

使用SD卡时,编码器如下
在这里插入图片描述
成功点亮

在这里插入图片描述

四、makefile的补充

led.bin : leds.s
	arm-linux-gnueabihf-gcc -g -c leds.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,就会清空

五、其他

嵌入式开发,不使用JLINK
使用点灯、串口进行调试

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

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

相关文章

中介者模式mediator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/mediator 减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

数据结构:树与二叉树(2)

1、线索二叉树 1.1线索二叉树的定义 (1)线索二叉树有啥用? 普通二叉树的节点包含左孩子和右孩子的信息,但并没有直接存储关于“直接前驱”和“直接后继”的信息,结点的前驱和后继只能在遍历过程中获得。 因此这里引…

Springboot中mybatis的使用

一.创建Springboot项目并加载依赖 1.利用IDEA创建SpringBoot项目,并勾选必须依赖,步骤如下(IDEA版本为2024版) 注意: 1.首先更换镜像源,否则加载配置环境比较慢,网上搜阿里的镜像源就行。 2…

关于在vue2中使用el-tree的记录

此文章会持续更新在使用el-tree过程中应用到的功能... 先看此效果&#xff1a; html&#xff1a; <el-tree :data"data" :props"defaultProps" node-click"handleNodeClick">//自定义节点内容<span slot-scope"{ data }"&g…

Leetcode面试经典150题-135.分发糖果

解法都在代码里&#xff0c;不懂就留言或者私信 阿里字节都考过 class Solution {/**对于每个孩子来说&#xff0c;我们试一下从左边开始它应该分几个糖果&#xff0c;然后看一下从右边开始它应该分几个糖果然后左右取最大值&#xff0c;每个位置求和就是我们要的答案 */publ…

【解决keil不能跳转函数声明的问题】

第一步&#xff1a;将魔术棒中的output选项里Browase Information功能打开 第二步&#xff1a;重新编译整个工程 第三步&#xff1a;跳转测试

Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…

【笔记】2.1 石英类原料

2.1.1 石英类原料的种类 石英&#xff1a;结晶矿物。 &#xff08;1&#xff09;石英砂&#xff08;硅砂&#xff09; 石英石、长石在水、二氧化碳、温度作用下风化分解由水流冲击沉积而形成。 主要成分为&#xff0c;质地纯净的硅砂为白色&#xff0c;其中若含有少量杂质&…

SpringCloud集成MybatisPlus,实现MySQL多数据源配置

引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version> </dependency><dependency><groupId>com.alibaba</groupId><art…

Apache DataFusion查询引擎简介

01 简介 DataFusion是一个查询引擎&#xff0c;其本身不具备存储数据的能力。正因为不依赖底层存储的格式&#xff0c;使其成为了一个灵活可扩展的查询引擎。它原生支持了查询CSV&#xff0c;Parquet&#xff0c;Avro&#xff0c;Json等存储格式&#xff0c;也支持了本地&#…

TCP通信实现

前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于流的通信协议。它是互联网协议栈&#xff08;TCP/IP&#xff09;中的核心协议之一&#xff0c;主要用于保证在计算机网络中可靠地传输数据。 TCP通信的基…

面向物联网基础的智能农业环境的节能边缘-雾-云计算架构

这篇论文的标题是《Energy-Efficient Edge-Fog-Cloud Architecture for IoT-Based Smart Agriculture Environment》&#xff0c;作者是Hatem A. Alharbi和Mohammad Aldossary&#xff0c;发表在IEEE Access期刊上。论文的主要内容可以概括为以下几个部分&#xff1a; 摘要&am…

【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用

【JVM 工具命令】JAVA程序线上问题诊断&#xff0c;JVM工具命令的使用&#xff0c;jstat&#xff0c; jstack&#xff0c;jmap命令的使用 1. JVM监控工具&#xff1a; Jstat命令 通过这个命令查询java程序&#xff0c;gc的情况 jstat -gcutil {pid} 5000 12 5000 表示5000…

JavaWeb【day12】--(SpringBootWeb登录认证)

案例-登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们…

Mysql高级篇(中)—— 索引优化

Mysql高级篇&#xff08;中&#xff09;—— 索引优化 一、索引分析案例案例 1&#xff1a;单表查询案例 2&#xff1a;两表连接查询案例 3&#xff1a;三表连接查询 二、避免索引失效常见索引失效场景简述场景 1场景 2场景 3场景 4场景 5场景 6 三、索引优化文字版示例版 一、…

每日OJ_牛客_数组中出现次数超过一半的数字

目录 牛客_数组中出现次数超过一半的数字 解析代码1 解析代码2 牛客_数组中出现次数超过一半的数字 数组中出现次数超过一半的数字__牛客网 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。例如输入一个长度为…

瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

本文OpenHarmony标准系统应用兼容性测试指导&#xff0c;适用鸿蒙系统软件开发测试的新手入门学习课程。设备为触觉智能的瑞芯微RK3566开发板&#xff0c;型号Purple Pi OH。是Laval官方社区主荐的一款鸿蒙开发主板。支持Openharmony、安卓Android、Linux的Debian、Ubuntu系统。…

实战项目01-icon图标修改

修改项目图标 引入图片资源&#xff0c;放入指定目录&#xff0c;覆盖掉之前图片即可 目录&#xff1a;entry > src > main > resources > base > media 图片&#xff1a;startIcon.png foreground.png background.png 修改项目标题 需要修改 EntryAbilit…

Deploying Spring Boot Apps Tips

Java PaaS providers chatter command Efficient deployments See also spring-boot-reference.pdf https://docs.spring.io/spring-framework/reference/integration/checkpoint-restore.html

基于JAVA+SpringBoot+Vue的网上商城系统的设计与实现

基于JAVASpringBootVue的网上商城系统的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1…