I.MX6U 裸机开发3. GPIO操作控制LED灯

I.MX6U 裸机开发3. GPIO操作控制LED灯

  • 一、创建项目目录及源文件
    • 1. 新建目录
    • 2. 远程开发环境
    • 3. 创建源文件
  • 二、代码编写
    • 1. 打开时钟
    • 2. 配置端口复用功能为GPIO
    • 3. 配置端口电气属性
    • 4. 设置GPIO方向(GDIR寄存器)
    • 5. 输出
    • 6. 死循环等待
  • 三、编译程序
    • 1. 整体过程
    • 2. 编译,使用命令 arm-linux-gnueabihf-gcc
    • 3. 链接,使用命令 arm-linux-gnueabihf-ld
      • 3.3.1 起始地址
      • 3.3.2 DDR初始化
      • 3.3.3 链接命令:
    • 4. 格式转换 arm-linux-gnueabihf-objcopy
    • 5. 反汇编
  • 四、烧写测试
    • 1. 准备工具
    • 2. 将SD卡通过读卡器连接到虚拟机
    • 3. 烧写
  • 五、执行
    • 1. SD卡插到开发板
    • 2. 引导方式拨码开关调到SD卡模式
  • 六、创建 makefile

在这里插入图片描述

一、创建项目目录及源文件

1. 新建目录

~/linux/IMX6ULL/Board_Drivers/1_leds

2. 远程开发环境

为了方便远程开发,可在本地的vscode安装 Remote Development 插件:
在这里插入图片描述
设置方法:
点View-Command Palette,输入Remote,选择 Remote-SSH:Add New SSH Host…
在这里插入图片描述
按提示格式输入:
ssh root:123456@192.168.222.129
账号密码按自己真实情况填写,

点击
在这里插入图片描述
点击自己Ubuntu设备后的连接:
在这里插入图片描述
接下来的提示窗口按提示选择即可:
在这里插入图片描述
接下来点击 Open Folder,选择ubuntu上的开发目录 :
在这里插入图片描述

3. 创建源文件

leds.s
在这里插入图片描述

二、代码编写

1. 打开时钟

I.MX6U的时钟寄存器,首先到IMX6ULL参考手册找到 CCGR0~CCGR6地址,通过设置为0xFFFFFFFF把时钟全部使能。
在这里插入图片描述
初始化代码:

.global _start @全局标号

_start:
    /* 使能CCGR0的全部时钟 */
    LDR R0, =0x020C4068     @ 把 CCGR0 的内存地址赋值给R0
    LDR R1, =0xFFFFFFFF      @ R1 里赋值
    STR R1, [R0]            @ 把 CCGR0 全部设置为高

    /* 使能CCGR1的全部时钟 */
    LDR R0, =0x020C406C
    STR R1, [R0]

    /* 使能CCGR2的全部时钟 */
    LDR R0, =0x020C4070
    STR R1, [R0]

    /* 使能CCGR3的全部时钟 */
    LDR R0, =0x020C4074
    STR R1, [R0]

    /* 使能CCGR4的全部时钟 */
    LDR R0, =0x020C4078
    STR R1, [R0]

    /* 使能CCGR5的全部时钟 */
    LDR R0, =0x020C407C
    STR R1, [R0]

    /* 使能CCGR6的全部时钟 */
    LDR R0, =0x020C4080
    STR R1, [R0]

2. 配置端口复用功能为GPIO

在手册找到 1571 页,
在这里插入图片描述

代码:


    @ 配置 GPIO1_IO03的复用功能
    @ IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5
    LDR R0, =0x020E0068
    LDR R1, =0x00000005
    STR R1, [R0]

3. 配置端口电气属性

在手册第1793页:
在这里插入图片描述
在这里插入图片描述

设置:

  • bit0: SRE压摆率,设置为0低速率
  • bit5~3:DSE驱动能力,设置为110 (R0/6)
  • bit7~6:设置为10(100Mhz)
  • bit11:设置为0,关闭开漏输出
  • bit12:PKE设置为1,使能pull/keeper
  • bit13:PUE设置为0,保持
  • bit15~14:PUS设置为00, 等效100欧下拉
  • bit16:HYS设置为0关闭
    代码:
    LDR R0, =0x020E02F4
    LDR R1, =0x10b0
    STR R1, [R0]

4. 设置GPIO方向(GDIR寄存器)

手册第 1357 页:
在这里插入图片描述

    LDR R0, =0x0209C004
    LDR R1, =0x8
    STR R1, [R0]

5. 输出

在这里插入图片描述

    /* 设置GPIO1_IO03输出低电平 */
    LDR R0, =0x0209C000
    LDR R1, =0x0
    STR R1, [R0]

6. 死循环等待

B .

三、编译程序

1. 整体过程

  1. 编译:将.c .s文件编译为 .o 目标文件
  2. 链接:将所有的.o 文件链接为 elf 格式可执行文件
  3. 将 elf 转成.bin 文件。

2. 编译,使用命令 arm-linux-gnueabihf-gcc

命令:

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

3. 链接,使用命令 arm-linux-gnueabihf-ld

3.3.1 起始地址

为了确定程序在内存中的加载位置,链接器通过链接脚本或命令行参数要指定起始地址。指定起始地址有以下作用:

  1. 内存布局控制:指定起始地址可以确保程序的各个部分(如代码段、数据段、堆栈等)在内存中有序排列,避免冲突。
  2. 硬件要求:某些嵌入式系统或硬件平台的特定要求。
  3. 调试和诊断:指定起始地址有助于调试和诊断,因为开发人员可以明确知道程序在内存中的位置。

使用 I.MX6ULL时,链接起始地址应指向RAM地址。而RAM分为内部RAM和外部RAM,根据文档可查询到,其RAM范围:

  • 内部RAM的范围是 0x900000~0x91FFFF,
  • 外部RAM的范围,需要视开发板而定。

我这里使用的正点原子I.MX6U-MINI开发板,512M字节的DDR范围是 :
0x80000000~0x9FFFFFFF
对于256M字节的DDR的范围是:
0x80000000~0x8FFFFFFF

本系列博文,链接地址使用了0x87800000,这是以后要学到的Uboot的链接地址就是0x87800000,这里沿用其设置。

3.3.2 DDR初始化

DDR内存模块,在上电后处于未定义状态,要使用需要先初始化。
这里我们要添加一个头部,在这个头部实现 从指定存储中读取头部、初始化DDR,并将bin拷贝到指定地方。
Bin的运行地址要和链接地址保持一致。

3.3.3 链接命令:

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

4. 格式转换 arm-linux-gnueabihf-objcopy

本步骤有以下作用:

  1. 格式转换:将目标文件从一种格式转换为另一种格式。例如,从 ELF 格式转换为二进制格式。
  2. 去除符号表:可以去除目标文件中的符号表和调试信息,以减小文件大小。
  3. 提取部分内容:可以从目标文件中提取特定的部分,如只提取代码段或数据段。
  4. 合并文件:可以将多个目标文件合并为一个文件。
  5. 修改段属性:可以修改目标文件中段的属性,如段的起始地址、大小等。

命令:

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

5. 反汇编

这一步不是为了烧写,而是为了方便以后调试代码。
命令:

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

反汇编生成的文件示例:
在这里插入图片描述

四、烧写测试

I.MX6U 支持 SD卡、EMMC、NAND、NOR、SPI Flash,本例程使用烧写到SD卡。
烧写工具使用: imxdownload。

1. 准备工具

将 imxdownload 其拷到ubuntu的tools目录下:
在这里插入图片描述
使用 chmod +x imxdownload 给文件可执行权限。
在这里插入图片描述
imxdownload 工具会向led.bin添加一个头部。

2. 将SD卡通过读卡器连接到虚拟机

先在ubuntu上执行命令:

ls /dev/sd* -l

输出如下内容:
在这里插入图片描述
将U盘连接到Ubuntu虚拟机,再次执行:

ls /dev/sd* -l

输出如下:
在这里插入图片描述
其中 /dev/sdb有一个/dev/sdb1备用设备,这个/dev/sdb 就是目标SD卡。

3. 烧写

命令:

../tools/imxdownload led.bin /dev/sdb

在这里插入图片描述
其中的load.imx就是最终烧写到SD卡的文件。

五、执行

1. SD卡插到开发板

在这里插入图片描述

2. 引导方式拨码开关调到SD卡模式

默认是 EMMC启动方式,按丝印所示调整为SD卡模式:
在这里插入图片描述
通过 USB_TTL 上电,
执行效果,启动后等1-2秒,LED1亮。
在这里插入图片描述

六、创建 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 -f *.bin *.o *.dis *.elf

.PHONY: clean

以后可以下面命令来代码前面的编译、链接、格式转换等工作:

make clean
make

如果提示make没有安装,可以使用:

sudo apt install make -y

安装 make 。

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

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

相关文章

「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现

自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。 关键词 自定义动画动画路径贝塞尔曲…

FLUX 推出 Ultra 和 Raw 模式,仅10秒生成2K高清图!

大家好,我是渔夫。 就在 2024年11月6日,BlackForestLabs 团队升级了他们最新的文生图模型 FLUX1.1 [pro]。 推出 Ultra 和 Raw 模式,仅10秒就能生成2K高清图片,速度非常惊人。 Ultra 模式:可生成超高分辨率图像&#x…

24/11/6 算法笔记 SVD

SVD,即奇异值分解(Singular Value Decomposition),是线性代数中一种重要的矩阵分解方法。 定义 对于任何给定的 mnmn 的实数矩阵 AA(其中 mm 是行数,nn 是列数),SVD分解可以表示为…

开发笔记 | 快速上手基于Dify等第三方大模型平台接口实现AI智能聊天

前置: 1.部署Dify,见官方教程及介绍https://docs.dify.ai/zh-hans,本文主要讲基于部署完之后的java实现的调用它的接口实现AI智能聊天,其他AI功能后续有用到再补充,没有就看缘分 2.什么是Dify?可以简单理解…

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…

查看网路信息-ifconfig命令

1.ifconfig缺点: 可以查看接口的网络类型;部分IP和掩码以及状态是否插线,看不到接口下的网关,DNS, 要想看到接口下多个IP,使用 ip addr show 命令 要想看网关,使用 ip route show 命令、route -n 命令 显示路由表内…

基于Spring Boot的中小型制造企业质量管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自…

Java:多态的调用

1.什么是多态 允许不同类的对象对同一消息做不同的响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。多态使用了一种动态绑定(dynamic binding)技术,指在执行期间判断所引用…

并查集算法详解

文章目录 并查集概念并查集的常见操作构建并查集合并并查集和查找 关于find函数 并查集概念 并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。其主要应用是判断两个元素是否在同一个集合中,以及合并…

Redis持久化机制——针对实习面试

目录 Redis持久化机制Redis为什么要有持久化机制?Redis持久化方式有哪些?AOF持久化工作原理是什么?有什么优缺点?AOF持久化工作原理AOF的优点AOF的缺点 RDB持久化工作原理是什么?有什么优缺点?RDB持久化工作…

【系统架构设计师(第2版)】七、系统架构设计基础知识

有效的软件体系结构及其明确的描述和设计,已成为软件工程领域中重要的主题。 *注:由于历史原因,研究者和工程人员对**Software Architecture(简称SA)*的翻译不尽相同,本文中软件“体系结构”和“架构”具有…

【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集

命名实体识别 (NER) 是自然语言处理 (NLP) 中的一项重要任务,用于自动识别和分类文本中的实体,例如人物、位置、组织等。尽管它很重要,但手动注释大型数据集以进行 NER 既耗时又费钱。受本文 ( https://huggingface.co/blog/synthetic-data-s…

Google推出了AI驱动的学习工具“Learn About”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue3中使用LogicFlow实现简单流程图

实现结果 实现功能&#xff1a; 拖拽创建节点自定义节点/边自定义快捷键人员选择弹窗右侧动态配置组件配置项获取/回显必填项验证 自定义节点与拖拽创建节点 拖拽节点面板node-panel.vue <template><div class"node-panel"><divv-for"(item, k…

本地部署运行 HuggingFace Diffuser 大模型

最近需要篡改大模型验证篡改定位水印的泛化性&#xff0c;但是由于网络连接原因无法直接使用&#x1f917;s Diffusers library &#xff0c;在网上找到了以下本地部署的方法。 目录 下载模型&#xff0c;部署至服务器上 1&#xff09;huggingface官网下载 2&#xff09;gi…

Bert框架详解(下)

一、Bert模型网络结构 1、Add与Normalize Add&#xff1a;将前面的数据传到后面层&#xff0c;残差网络同理。 Normalize &#xff1a;归一化&#xff0c;与batch normalize同理。 2、outputs(shifted right) outputs&#xff08;shifted right&#xff09;&#xff1a;指在…

操作系统学习笔记-3.2虚拟内存

文章目录 虚拟内存请求分页管理方式页面置换算法最佳置换算法工作原理OPT 算法的示例最佳置换算法的优点和缺点 先进先出置换算法最近最久未使用时钟置换算法时钟置换算法的工作原理&#xff1a;算法的步骤&#xff1a; 改进型时钟置换算法改进型时钟置换算法的特点&#xff1a…

【数学】通用三阶矩阵特征向量的快速求法 超简单!!!

目录 三个定理1、3个特征值&#xff08;即根互不相等&#xff09;例题实践2、2个特征值&#xff08;即有一个双重根&#xff09;3、1个特征值&#xff08;即有一个三重根&#xff09;定理证明 三个定理 本定理适用于 所有三阶矩阵 的特征向量求法&#xff01; 1、3个特征值&…

16通道AD采集方案,基于复旦微ARM + FPGA国产SoC处理器平台

测试数据汇总 表 1 本文带来的是基于复旦微FMQL20S400M四核ARM Cortex-A7(PS端) + FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业评估板的AD采集案例。本次案例演示的开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit PL端开发环境:P…

文件系统和日志管理

文件系统和日志管理 文件系统&#xff1a;文件系统提供了一个接口&#xff0c;用户用来访问硬件设备&#xff08;硬盘、光驱&#xff09;------------- 在硬件设备上对文件的管理 1、文件存储在硬盘上&#xff08;机械硬盘&#xff1a;一个扇区 2、文件中硬盘上的最小存储单位…