嵌入式硬件——IMX6ULL 裸机LED点亮实验

一. 实验准备 

基于正点原子 IMX6ULL-Mini 开发板,实现 LED 周期性闪烁功能,需完成环境搭建与硬件原理确认两大核心准备工作。 

1.1 开发环境搭建 

需在Windows和Ubuntu中安装工具,确保文件传输、交叉编译、代码编辑功能正常。

1.1.1 跨系统文件传输工具(FileZilla + Ubuntu FTP服务) 

用于Windows与Ubuntu之间传输代码、工具链等文件:

1. Windows端安装FileZilla

下载地址:[https://www.filezilla.cn/download](https://www.filezilla.cn/download),默认安装即可。

2. Ubuntu端配置FTP服务(vsftpd)

打开Ubuntu终端,执行以下命令:

```bash # 安装vsftpd服务 sudo apt-get install vsftpd

# 配置vsftpd.conf文件 sudo vi /etc/vsftpd.conf ``` 在配置文件中确保以下两行**无注释(删除开头的#)** : ```ini local_enable=YES # 允许本地用户登录 write_enable=YES # 允许写入操作 ``` 保存退出后,重启FTP服务:`sudo /etc/init.d/vsftpd restart`。

3. 连接测试

打开FileZilla,点击「文件→站点管理器」,输入Ubuntu的IP地址、用户名、密码,连接成功后即可互传文件。

1.1.2 交叉编译工具链安装(Linaro GCC)

由于PC(x86架构)需编译ARM架构(I.MX6ULL)的程序,需安装**交叉编译工具链**:

1. 下载工具  选择适配64位Ubuntu的版本,下载地址: [https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/](https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/) 文件名:`gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz`。

2. 解压工具链到Ubuntu        用FileZilla将工具链压缩包上传到Ubuntu家目录,执行以下命令: ```bash # 创建安装目录 sudo mkdir /usr/local/arm # 拷贝压缩包到安装目录 sudo cp ~/工具链文件名 /usr/local/arm/ -f # 解压 sudo tar -vxf /usr/local/arm/工具链文件名 ```

3. 配置环境变量        编辑`~/.bashrc`文件,在末尾添加工具链路径: ```bash export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin ``` 保存后执行`source ~/.bashrc`使环境变量生效。

4. 验证安装        终端输入`arm-linux-gnueabihf-gcc -v`,若显示`4.9.4`版本信息,则安装成功。

5. 安装依赖库        执行`sudo apt-get install lsb-core lib32stdc++6`,解决64位Ubuntu运行32位工具链的依赖问题。

 1.1.3 代码编辑器(VSCode) 可选Windows或Ubuntu版本,用于编写汇编、C代码,推荐安装`C/C++`、`ARM`插件以支持语法高亮。

1.2 开发板硬件原理确认

 1.2.1 开发板结构 IMX6ULL-Mini开发板分为**核心板**和**底板**:

- 核心板:包含IMX6ULL芯片、DDR(内存)、eMMC(存储)等核心器件;

- 底板:包含LED、按键等外设。

1.2.2 LED核心控制逻辑

当GPIO1_IO03输出**低电平(0)** 时,LED导通点亮;输出**高电平(1)** 时,LED熄灭。

二. 代码编写

实验代码分为「汇编初始化代码」和「C语言功能代码」,汇编负责初始化C环境(时钟、GPIO复用),C语言实现LED闪烁逻辑。

2.1 汇编代码(start.s)

LED

作用:初始化系统时钟、配置GPIO1_IO03引脚复用和电气属性、设置GPIO方向和初始电平,最终跳转到C语言`main`函数。

.global _start_start:ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, = _svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12   // irq 模式msr cpsr, r0ldr sp, =0x86000000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F   // sys 模式msr cpsr, r0ldr sp, =0x84000000bl _bss_clearb main_bss_clear:ldr r0, = __bss_startldr r2, = __bss_end
loop:mov r1, #0str r1, [r0]add r0, r0, #4cmp r0, r2blt loopbx lrfinished:b finished

说明:代码中寄存器地址与配置逻辑参考`imx6ull裸机(v1.2).pdf`中GPIO配置流程(使能时钟→复用配置→电气属性→方向/电平设置)。

 2.2 C语言功能代码

2.2.1 头文件(led.h)

 声明LED控制函数,依赖NXP SDK的寄存器定义(如`MCIMX6Y2.h`):

#ifndef _LED_H_#define _LED_H_#include "MCIMX6Y2.h"/* LED初始化函数:配置GPIO1_IO03 */void init_led(void);/* LED点亮:GPIO1_IO03输出低电平 */void led_on(void);/* LED熄灭:GPIO1_IO03输出高电平 */void led_off(void);/* LED翻转:GPIO1_IO03电平取反 */void led_nor(void);#endif

 2.2.2 LED功能实现(led.c)

封装GPIO配置与LED控制逻辑,调用`fsl_iomuxc.h`中的IO复用函数:

#include "led.h"
#include "fsl_iomuxc.h"void init_led(void) {/* 1. 配置GPIO1_IO03复用为GPIO */IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);/* 2. 配置电气属性:关闭HYS、上拉、200M速度 */IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);/* 3. 设置为输出模式 */GPIO1->GDIR |= (1 << 3);}void led_on(void) {GPIO1->DR &= ~(1 << 3);  /* 低电平点亮 */}void led_off(void) {GPIO1->DR |= (1 << 3);   /* 高电平熄灭 */}void led_nor(void) {GPIO1->DR ^= (1 << 3);   /* 电平取反 */}

 说明:`IOMUXC_SetPinMux`和`IOMUXC_SetPinConfig`是SDK封装的IO配置函数,用于简化寄存器操作。

2.2.3 主函数(main.c) 

实现LED周期性闪烁(软件延时):

#include "MCIMX6Y2.h"#include "led.h"/* 软件延时函数:参数越大,延时越长 */void delay(unsigned int n) 
{while(n--);}int main(void) 
{/* 1. 使能所有外设时钟 */CCM->CCGR0 = 0xFFFFFFFF;CCM->CCGR1 = 0xFFFFFFFF;CCM->CCGR2 = 0xFFFFFFFF;CCM->CCGR3 = 0xFFFFFFFF;CCM->CCGR4 = 0xFFFFFFFF;CCM->CCGR5 = 0xFFFFFFFF;CCM->CCGR6 = 0xFFFFFFFF;/* 2. 初始化LED */init_led();/* 3. 循环翻转LED(周期约500ms) */while(1) {led_nor();delay(0xFFFFF);}return 0;}

三. 编译配置(Makefile) 

编写Makefile实现自动化编译,避免手动输入繁琐命令,支持汇编、C文件的编译与链接: 

target = ledcross_compiler = arm-linux-gnueabihf-cc = $(cross_compiler)gcc
ld = $(cross_compiler)ld
objcopy = $(cross_compiler)objcopy
objdump = $(cross_compiler)objdumpincdirs = bsp imx6ull
srcdirs = bsp projectinclude = $(patsubst %, -I%, $(incdirs)) cfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))
sfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S)) cfilenodir = $(notdir $(cfiles))
sfilenodir = $(notdir $(sfiles))cobjs = $(patsubst %, obj/%, $(cfilenodir:.c=.o))
sobjs = $(patsubst %, obj/%, $(sfilenodir:.S=.o))objs = $(cobjs) $(sobjs)VPATH = $(srcdirs)$(target).bin : $(objs)$(ld) -Timx6ull.lds -o$(target).elf $^$(objcopy) -O binary -S -g $(target).elf $@$(objdump) -D $(target).elf > $(target).dis$(sobjs) : obj/%.o : %.S@mkdir -p obj$(cc) -Wall -nostdlib -c $(include) -o $@ $<  $(cobjs) : obj/%.o : %.c@mkdir -p obj		$(cc) -Wall -nostdlib -c $(include) -o $@ $<.PHONY : clean
clean:rm -rf $(objs) $(target).elf $(target).bin $(target).dis

说明: - 链接地址`0x87800000`:选择DDR中的地址,与Uboot链接地址一致,避免地址冲突;

- `-Ttext`:指定.text段(代码段)的起始地址; - `objcopy -O binary`:将ELF格式文件转换为裸机可执行的bin文件。

四. 程序编译与烧写

4.1 编译步骤

1. 执行编译

终端进入实验目录,执行`make`命令,编译成功后生成`led.bin`(最终烧写文件)。

4.2 程序烧写(SD卡启动)

IMX6ULL无内部Flash,需将程序烧写到SD卡,通过SD卡启动。

 4.2.1 准备工具与SD卡

1. 下载imxdownload工具 NXP提供的SD卡烧写工具,拷贝到实验目录并添加执行权限: ``` chmod +x imxdownload ```

2. SD卡准备 - 使用空白SD卡(建议4GB以上),备份数据; - 通过读卡器连接Ubuntu,确保SD卡被Ubuntu识别。

 4.2.2 确认SD卡设备名

终端执行`ls /dev/sd*`,识别SD卡设备文件:

- 未插SD卡时:显示`/dev/sda /dev/sda1`(系统磁盘);

- 插入SD卡后:新增`/dev/sdb /dev/sdb1`(SD卡,`sdb`为设备名)。

注意:务必确认设备名为`/dev/sdb`,避免烧写到系统磁盘(`sda`)。

 4.2.3 执行烧写

在实验目录执行烧写命令: ```./imxdownload led.bin /dev/sdb ``` -

**烧写验证**:终端显示烧写大小(如3.2KB)、速度(正常几百KB/s以内);

- 生成`load.imx`文件:imxdownload在bin文件前添加启动头,适配IMX6ULL启动协议。

五. 实验验证

5.1 开发板启动配置

1. 设置BOOT拨码开关  需将开发板BOOT拨码开关设置为  SD卡启动  ,参考拨码表:

拨码位

状态

说明

1

OFF

BOOT_MODE1=0

2

ON

BOOT_MODE0=1

3~8

OFF

选择 SD 卡通道

2. 连接硬件- 插入烧写好程序的SD卡; - 打开开发板电源。

5.2 上电运行

打开开发板电源开关,观察用户LED(LED0):

- 正常现象:LED周期性闪烁(约1秒1次);

- 异常排查:若LED不亮,检查BOOT拨码、SD卡烧写、GPIO配置是否正确。

 六. 常见问题排查

问题现象

可能原因

解决方案

交叉编译工具链未找到(command not found

环境变量配置错误

重新执行source ~/.bashrc,或检查~/.bashrc中工具链路径

烧写速度异常(>100MB/s)

SD 卡未被正确识别

重新插拔 SD 卡,重启 Ubuntu 后重试

LED 不亮但烧写成功

GPIO 配置错误 / BOOT 拨码错误

1. 检查start.s中 GPIO1_IO03 的复用与电气属性;
2. 确认 BOOT 拨码为 SD 卡启动

编译报错(undefined reference

源文件缺失或 Makefile 中未添加目标文件

1. 确认objs变量包含所有.o 文件;
2. 检查源文件是否存在

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

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

相关文章

深度学习之PyTorch基本使用(一)

一、PyTorch简介与安装1.核心概念PyTorch 是一款 Python 深度学习框架&#xff0c;其核心是张量&#xff08;Tensor&#xff09; —— 元素为同一种数据类型的多维矩阵&#xff0c;以 “类” 的形式封装&#xff0c;内置了张量运算、处理等方法&#xff0c;是深度学习中数据存储…

SQLAlchemy -> Base.metadata.create_all(engine )详解

目录 一、核心作用 二、是否每次运行项目都会执行&#xff1f; 1. ​​典型场景​​&#xff08;推荐&#xff09; 2. ​​需要避免的情况​​ 三、最佳实践建议 1. ​​生产环境​​ 2. ​​开发/测试环境​​ 四、常见问题解答 Q1: 如果表结构改了&#xff0c;creat…

C++异步任务处理与消息可靠性保障指南:从基础到实战

在当今多核处理器普及的时代&#xff0c;程序性能和响应能力的提升成为开发者面临的核心课题。无论是高频交易系统的毫秒级响应需求、实时游戏引擎的流畅交互体验&#xff0c;还是网络服务器的高并发处理能力&#xff0c;异步编程都已成为突破性能瓶颈的关键技术[1]。作为高性能…

LazyForEach性能优化:解决长列表卡顿问题

本文将深入解析HarmonyOS中LazyForEach的工作原理、性能优势、实战优化技巧及常见问题解决方案&#xff0c;帮助你构建流畅的长列表体验。 1. LazyForEach 核心优势与原理 LazyForEach 是鸿蒙ArkUI框架中为高性能列表渲染设计的核心组件&#xff0c;其核心设计思想基于动态加载…

Spring Boot 全栈优化:服务器、数据、缓存、日志的场景应用!

Spring Boot以其“开箱即用”闻名&#xff0c;但默认配置往往在高并发场景下成为瓶颈&#xff1a;Tomcat线程堵塞、数据库连接耗尽、缓存命中率低下、日志洪水般淹没磁盘。想象一个电商微服务&#xff0c;峰值流量下响应迟钝&#xff0c;用户流失——这不是宿命&#xff0c;而是…

Leetcode sql 50 ~5

select product_idfrom Productswhere low_fats Y and recyclable Y;SQL 规定&#xff1a;null 的比较必须用 is null 或 is not null&#xff0c;不能用普通的等号&#xff08;&#xff09;。# Write your MySQL query statement below select name from Customer where ref…

C#高并发与并行理解处理

目录 1.什么是IO密集型任务/CPU密集型任务 2.高并发概念和技术实现 2.并行&#xff08;Parallelist&#xff09;概念和技术实现 4.核心区别对比 1.什么是IO密集型任务/CPU密集型任务 1.IO密集型任务&#xff1a; 定义&#xff1a;任务核心逻辑不依赖CPU计算&#xff0c;而是…

正点原子STM32F407 U盘升级程序(IAP)OTA Bootloader APP USB升级+FATFS+USB Host

正点原子STM32F407 U盘升级程序&#xff08;IAP&#xff09;OTA Bootloader APP USB升级FATFSUSB HostChapter0 解决STM32 Bootloader跳转APP失败问题问题背景问题描述问题解决原APP跳转的函数为&#xff1a;修改APP程序main入口处Chapter1 MDK如何生成*.bin格式的文件Chapter2…

MySQL 8.0 在 Ubuntu 22.04 中如何将启用方式改为mysql_native_password(密码认证)

MySQL 8.0 在 Ubuntu 22.04 中默认启用了 auth_socket 认证方式(而非密码认证),导致 mysql_secure_installation 跳过了 root 密码设置。这会直接影响后续用 Navicat 连接 MySQL(因为 Navicat 需要密码登录),必须手动调整 root 用户的认证方式并设置密码。 核心问题:au…

七层网络协议-面试

七层网络协议概述七层网络协议&#xff0c;即OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;提出的网络通信框架。它将网络通信过程划分为七个层次&#xff0c;每一层负责特定的功能&#xff0c;并通…

【Blender】二次元人物制作【二】:五官的制作

一、制作眼睛 选中眼眶内部的一圈线。shiftD复制出来调整成圆形&#xff0c;然后F快捷键填充将眼睛放在眼框内合适的位置&#xff0c;并用i键进行几次内插&#xff0c;做出瞳孔&#xff0c;并且将内部的眼瞳做得稍微向内凹陷一点。二、制作睫毛 选中眼眶上半部分的面&#xff0…

Deepin 25 系统安装 Docker:完整教程 + 常见问题解决

Deepin 25 系统安装 Docker&#xff1a;完整教程 常见问题解决 作为基于 Debian 的 Linux 发行版&#xff0c;Deepin 25 因系统目录&#xff08;如/usr&#xff09;默认只读的特性&#xff0c;安装 Docker 时需特殊处理 GPG 公钥存储路径。本文结合社区实践&#xff0c;整理出…

Redis MySQL小结

问题1&#xff1a;Redis为什么高效&#xff1f;答&#xff1a;基于内存&#xff0c;reactor&#xff0c;value的数据组织&#xff08;五种数据结构&#xff09;&#xff0c;KV的数据组织方式&#xff08;渐进hash&#xff09;问题2&#xff1a;跳表是什么&#xff1f;和红黑树的…

Flink on YARN 实战问题排查指南(精华版)

一、客户端常见问题速查 ‌1. JAR加载失败终极解法‌报错提示&#xff1a;"Could not build the program from JAR file" 核心原因&#xff1a;80%的情况是Hadoop依赖缺失 黄金配置&#xff1a;export HADOOP_CONF_DIR${HADOOP_HOME}/etc/hadoop export HADOOP_CLASS…

迅为RK3576开发板Android12制作使用系统签名

配套资料在网盘资料“iT0P-RK3576 开发板\02_【iTOP-RK3576 开发板】开发资料\ 08Android 系统开发配套资料\ 07 Android 制作使用系统签名”目录下制作签名文件 在 Android 源码 build/make/target/product/security/下存放着签名文件&#xff0c;如下所示&#xff1a;将北京迅…

django连接minio实现文件上传下载(提供接口示例)

django连接minio实现文件上传下载&#xff08;提供接口示例&#xff09;项目环境前提1.模型创建2. 在 settings.py 中添加 MINIO 配置3.创建 MINIO 工具类4.创建序列化器5. 创建视图6. 配置 URL 路由7.接口测试项目环境前提 已安装python3.8以上环境已安装djangorestframework…

Kafka消息队列进阶:发送策略与分区算法优化指南

Kafka消息队列进阶&#xff1a;发送策略与分区算法优化指南 目录Kafka消息队列进阶&#xff1a;发送策略与分区算法优化指南摘要1. Kafka消息发送模式概述1.1 消息发送的核心流程1.2 三种发送模式对比2. 同步发送模式详解2.1 同步发送实现原理2.2 同步发送性能优化3. 异步发送模…

【VScode】ssh报错

【VScode】ssh报错1. ssh报错2. 解决1. ssh报错 Failed to parse remote port from server output 2. 解决 windows电脑删除 C:\Users\username\.ssh\known_hosts linux cd /home/username/.vscode-server/ rm -rf ~/.vscode-server重新回到Vscode连接ok

Grafana+Loki+Alloy构建企业级日志平台

1.日志系统介绍日志系统&#xff1a;GLA、ELK、数仓 ⽇志处理流程&#xff1a;采集 > 存储 > 检索 > 可视化日志系统工作流程&#xff1a;日志平台的目的&#xff1a;统一聚合分散的日志日志平台搭建方案&#xff1a;ELK&#xff1a;ElasticSearch:存储日志&#xff0…

老梁聊全栈系列:(阶段一)现代全栈的「角色边界」与「能力雷达图」

JAVA Vue/React 双栈工程师的「T 型→E 型」进化指南 接上篇《从单体到云原生的演进脉络》 大家好&#xff0c;我是技术老梁&#xff0c;这是系列文章的第五篇。欢迎大家讨论&#xff0c;分享经验。如果知识对你有用&#xff0c;关注我&#xff0c;多多支持老梁&#xff0c;鼓…