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 的内存地址赋值给R0LDR R1, =0xFFFFFFFF      @ R1 里赋值STR R1, [R0]            @ 把 CCGR0 全部设置为高/* 使能CCGR1的全部时钟 */LDR R0, =0x020C406CSTR R1, [R0]/* 使能CCGR2的全部时钟 */LDR R0, =0x020C4070STR R1, [R0]/* 使能CCGR3的全部时钟 */LDR R0, =0x020C4074STR R1, [R0]/* 使能CCGR4的全部时钟 */LDR R0, =0x020C4078STR R1, [R0]/* 使能CCGR5的全部时钟 */LDR R0, =0x020C407CSTR R1, [R0]/* 使能CCGR6的全部时钟 */LDR R0, =0x020C4080STR R1, [R0]

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

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

代码:

@ 配置 GPIO1_IO03的复用功能@ IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5LDR R0, =0x020E0068LDR R1, =0x00000005STR 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, =0x020E02F4LDR R1, =0x10b0STR R1, [R0]

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

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

    LDR R0, =0x0209C004LDR R1, =0x8STR R1, [R0]

5. 输出

在这里插入图片描述

    /* 设置GPIO1_IO03输出低电平 */LDR R0, =0x0209C000LDR R1, =0x0STR 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.sarm-linux-gnueabihf-gcc -g -c leds.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 -f *.bin *.o *.dis *.elf.PHONY: clean

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

make clean
make

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

sudo apt install make -y

安装 make 。

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

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

相关文章

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候,其实我们说的是两件东西: 一是小米模式的本质,即高效率的商业模式; 另一件是小米这家公司具象的商业模式,这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

Java:多态的调用

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

基于Python的学生宿舍管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104

结合现有六和医院网上预约挂号管理系统的特点,应用新技术,构建了六和医院网上预约挂号管理系统。首先从需求出发,对目前传统的六和医院网上预约挂号管理进行了详细的了解和分析。根据需求分析结果,对系统进行了设计,并…

C++初阶(九)--初识模板

目录 引入 一、什么是模板 二、函数模板 1.函数模板的概念 2.函数模板的格式 template关键字 模板参数列表 3.函数模板的原理 4.函数模板的实例化 5.数模板的匹配原则 三、类模板 1.类模板的定义格式 2.类模板的实例化 引入 在编程的世界里,我们经常…

C语言 | Leetcode C语言题解之第537题复数乘法

题目: 题解: bool parseComplexNumber(const char * num, int * real, int * image) {char *token strtok(num, "");*real atoi(token);token strtok(NULL, "i");*image atoi(token);return true; };char * complexNumberMulti…

牛客网项目总结

下面这幅图是牛客网项目的架构图,最下层是Spring Boot,表示我们所有的技术都是基于Spring Boot,上面一层是Spring,Spring上面是Spring MVC、Spring MyBatis 和 Spring Security。 通过Spring MVC 解决前后端请求交互的问题&#…

想画一个沙漠掘金游戏地图

想画一个沙漠掘金游戏地图 沙漠掘金生成一个地图htmljs 沙漠掘金 沙漠掘金是一个企业培训课程游戏,规则大致是: 玩家从大本营出发,到达矿山掘金后返回,如果规定的天数未回来,则失败,如果回来,…

【Java爬虫的淘宝寻宝记】—— 淘宝商品类目的“藏宝图”

引言: 在淘宝这个广袤的“商品宇宙”中,每一件商品都是一颗璀璨的星球,而商品类目就是连接这些星球的星际航道。今天,我们将派遣一位勇敢的Java爬虫宇航员,去揭开这些星际航道背后的秘密——商品类目。准备好了吗&…

内网穿透-SSF内网穿透反向socks代理之渗透内网thinkphp主机上线msf

1 ssf 简介 Secure Socket Funneling socks正反向代理,linux版较好的免杀 1.1下载地址 https://github.com/securesocketfunneling/ssf 1.2下载编译好的执行文件 https://github.com/securesocketfunneling/ssf/releases/tag/3.0.0 2.环境 kali 攻击机 网卡 桥…

【HarmonyOS】键盘遮挡输入框UI布局处理

【HarmonyOS】键盘遮挡输入框UI布局处理 问题背景: 在开发输入框UI时,特别是登录页面的密码输入框靠下,或者是评论底部的pop弹框。 当我们输入框获得焦点后,键盘自下而上显示,一般情况下会遮挡住我们的UI布局。 导致…

ssm基于BS的仓库在线管理系统的设计与实现+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术3 …

QML项目实战:自定义TextField

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义TextField 1.属性设置 2.输入框设置 3.按钮开关 三.效果 1.readonly为false 2.readonly为true 四.代码 一.添加模块 import QtQuick.…

C++ | Leetcode C++题解之第523题连续的子数组和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool checkSubarraySum(vector<int>& nums, int k) {int m nums.size();if (m < 2) {return false;}unordered_map<int, int> mp;mp[0] -1;int remainder 0;for (int i 0; i < m; i) {r…

AFL++实战入门与afl-fuzz流程解析(源码流程图)

简介 本项目为模糊测试的零基础教学,适合了解 pwn 且会使用 Linux 的 gcc、gdb 的读者。模糊测试旨在通过向程序投喂数据使其崩溃,从而获取崩溃样本以寻找程序漏洞。本文前半部分介绍 AFL++ 的 docker 环境配置,帮助读者解决入门时的环境和网络问题; 后半部分全面解析 afl…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…

用Python脚本执行安卓打包任务

这个样例是基于windows系统写的python打包安卓的脚本&#xff1a; 一、配置AndroidStudio下的打包任务 1.在Android项目根目录下的build.gradle文件配置生成Release包的任务&#xff1a; task cleanAll(type: Delete) {delete rootProject.buildDirrootProject.subprojects.e…

C++学习笔记----9、发现继承的技巧(六)---- 有趣且令人迷惑的继承问题(7)

6、非公共继承 在前面所有的例子中&#xff0c;父类总是用public关键字列出。你可能会想是否父类也可以是private或protected。实际上&#xff0c;是可以的&#xff0c;但都不像public一样常见。如果不对父类进行访问指示符的指定&#xff0c;对于类来讲就是private继承&#x…

Linux服务控制及系统基本加固

一. liunx操作系统的开机引导的过程 1. 开机自检 根据bios的设置&#xff0c;对cpu,内存&#xff0c;显卡&#xff0c;键盘等等设备进行初步检测如果以上检测设备工作正常&#xff0c;系统会把控制权移交到硬盘 总结:检测出包含系统启动操作系统的设备&#xff0c;硬盘&#…

k8s 处理namespace删除一直处于Terminating —— 筑梦之路

问题现象 k8s集群要清理某个名空间&#xff0c;把该名空间下的资源全部删除后&#xff0c;删除名空间&#xff0c;一直处于Terminating状态&#xff0c;无法完全清理掉。 如何处理 为什么要记录下这个处理的步骤&#xff0c;经过查询资料&#xff0c;网上也有各种各样的方法&…