当前位置: 首页 > news >正文

嵌入式学习day47-硬件-imx6ull-LED

1. 什么是 IOMUXC?

  • IOMUXC 全称 I/O Multiplexer Controller(输入输出复用控制器)。

  • 它的功能就是:把一个物理管脚(pad)切换到不同的功能

  • 因为 i.MX6ULL 的管脚非常多,但封装数量有限,所以同一个管脚可以复用成 GPIO / UART / I2C / SPI / ENET / LCD 等多种功能

  • 你写裸机代码要点亮 LED,首先要通过 IOMUXC 把 LED 所在的引脚复用成 GPIO 功能,否则它可能还在默认的其它外设模式下。


2. IOMUXC 的三个核心寄存器

每个引脚在 IOMUXC 里通常有三类寄存器来配置:

  1. MUX Control 寄存器 (IOMUXC_SW_MUX_CTL_PAD_xxx)

    • 决定这个 PAD 的功能复用。

    • 常见写法:

      • ALT0~ALTn 表示不同外设功能,比如 ALT0=UART,ALT5=GPIO。

    • 举例:

      IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0x05; // ALT5 表示 GPIO 
  2. PAD Control 寄存器 (IOMUXC_SW_PAD_CTL_PAD_xxx)

    • 配置电气属性,例如:上下拉、驱动能力、速度、开漏等。

    • 常用配置项:

      • PKE/PUE → 是否使能上下拉

      • PUS → 上拉/下拉强度

      • DSE → 驱动能力(2/4/8/12/16mA)

      • SPEED → 信号切换速度(低、中、高)

    • 举例(常见的 0x10B0 配置):

      IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 = 0x10B0;

  3. Select Input 寄存器 (IOMUXC_xxx_SELECT_INPUT)

    • 用于输入信号的路径选择。

    • 有些 PAD 有多个输入路径,可以通过这个寄存器选择信号来源。

    • 点亮 LED 用不到,一般在配置外设(比如 UART_RX 来源选择)才需要。


3. 使用流程(以 GPIO 点灯为例)

假设 LED 接在 GPIO1_IO03

  1. 开 GPIO1 模块时钟

    CCM_CCGR1 |= (3 << 26); // 打开 GPIO1 时钟

  2. 设置 PAD 复用

    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0x05; // ALT5 = GPIO

  3. 配置 PAD 电气属性

    IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 = 0x10B0; // 常用配置:上拉+中驱动

  4. GPIO 配置为输出并控制

    GPIO1_GDIR |= (1 << 3); // 设置 GPIO1_IO03 为输出 GPIO1_DR &= ~(1 << 3); // 输出低电平 → LED 亮(低有效)


4. IOMUXC 的重要性

  • 复用配置是裸机开发的第一步,不管是 LED、串口、I2C、SPI 还是 LCD,都必须通过 IOMUXC 把 PAD 映射到对应外设

  • 配置正确 → 外设才能工作;配置错误 → 信号根本出不来,怎么写驱动都没用。

  • PAD 电气属性 影响信号质量,驱动能力不够可能带不动外设或 LED 电流。


一、LED 实验中对 SoC 引脚的配置步骤

  1. IO 复用(IOMUX)

    • 将物理引脚的功能切换为 GPIO,而不是其他外设功能(如 UART、I²C 等)。

  2. 电气特性配置(PAD Control)

    • 设置引脚的上下拉电阻、驱动能力、信号上升沿速度、是否开漏或推挽输出。

    • 这些参数确保引脚能稳定驱动 LED,同时满足电气特性要求。

  3. 引脚方向(GPIO Direction)

    • 将该 GPIO 配置为“输出模式”,准备向外提供高/低电平信号。

  4. 数据输出控制(GPIO Data)

    • 通过写数据寄存器的某一位,控制引脚输出高电平或低电平,从而实现 LED 的点亮与熄灭。

    • 实际点亮方式取决于硬件电路的接法(低电平有效或高电平有效)。

  5. 实验效果

    • 在完成以上配置后,通过不断改变输出电平并加入延时,LED 会实现闪烁效果。

led_init:
//IO复用功能配置ldr r0, =0x020E0068ldr r1, =0x05str r1, [r0]
//引脚电器特性配置ldr r0, =0x020E02F4ldr r1, =0x10B0str r1, [r0]
//引脚方向ldr r0, =0x0209C004ldr r1, [r0]orr r1, r1, #(1 << 3)str r1, [r0] bx lrled_on:ldr r0, =0x0209C000ldr r1, [r0]bic r1, r1, #(1 << 3)str r1, [r0]bx lrled_off:ldr r0, =0x0209C000ldr r1, [r0]orr r1, r1, #(1 << 3)str r1, [r0]bx lr

二、工具链关键组件的作用

  1. 编译器(Compiler)

    • 将高级语言(C/C++)源代码翻译为目标文件或机器指令。

    • 包含语法分析、优化和指令生成等步骤。

  2. 连接器 / 链接器(Linker)

    • 将多个目标文件和库合并,解析符号引用,分配存储地址。

    • 生成最终的可执行文件或带符号的映像文件(如 ELF)。

  3. 格式转换器(Object/Format Converter)

    • 在不同文件格式之间进行转换。

    • 常见用途是将 ELF 文件转换成 BIN/HEX 格式,以便烧录到开发板或 Flash。

  4. 反汇编器(Disassembler)

    • 将二进制机器码还原为汇编指令,方便阅读和调试。

    • 结果通常不包含变量名和注释,只提供指令层面的信息。

(1)使用arm-linux-gnueabihf-gcc只汇编不链接arm-linux-gnueabihf-gcc -c start.S -o start.o -g
(2)使用arm-linux-gnueabihf-ld链接代码到特定地址(得到可执行,可连接程序linux executable linkable file)arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf
(3)使用arm-linux-gnueabihf-objcopy 格式转换 arm-linux-gnueabihf-objcopy -O binary -S(去符号信息) -g(去调试信息) start.elf start.bin
(4)使用arm-linux-gnueabihf-objdump 反汇编(此处只是为了阅读代码,非必要步骤)arm-linux-gnueabihf-objdump -D start.elf  > start.dis

三、从源代码到点亮 LED 的完整流程

  1. 编写源码(C 或汇编)。

  2. 编译:由编译器生成目标文件。

  3. 链接:由链接器将多个目标文件与库整合,输出 ELF 文件。

  4. 格式转换:由工具将 ELF 转为 BIN 或 HEX 文件。

  5. 烧录执行:单片机上电后运行初始化代码 → 配置 MUX、PAD、方向、数据寄存器 → LED 被点亮。


文章转载自:

http://GrfRax5l.ptsLx.cn
http://djxIeGDD.ptsLx.cn
http://DX49EjeJ.ptsLx.cn
http://udw75yr9.ptsLx.cn
http://1rwu6Lx4.ptsLx.cn
http://EoJJDz2O.ptsLx.cn
http://VQqKTMsi.ptsLx.cn
http://QdUy2xsC.ptsLx.cn
http://9fyyzAh1.ptsLx.cn
http://APWvu05i.ptsLx.cn
http://M2SAsFRP.ptsLx.cn
http://z4Bjw4PI.ptsLx.cn
http://169ESsb4.ptsLx.cn
http://iH5NpJtR.ptsLx.cn
http://tmZXhA5G.ptsLx.cn
http://COmh1gks.ptsLx.cn
http://hriWOzdi.ptsLx.cn
http://8eYldCRN.ptsLx.cn
http://BtHXZyqN.ptsLx.cn
http://ewKxkdYf.ptsLx.cn
http://ARgx6zPJ.ptsLx.cn
http://gCVwlA2i.ptsLx.cn
http://F6BefWLp.ptsLx.cn
http://3WBmRMxA.ptsLx.cn
http://msTuN7cK.ptsLx.cn
http://xwLHH5z2.ptsLx.cn
http://UVw4qE76.ptsLx.cn
http://DIgFAigq.ptsLx.cn
http://34QpqAnt.ptsLx.cn
http://CJevVrVw.ptsLx.cn
http://www.dtcms.com/a/376584.html

相关文章:

  • 深入体验—Windows从零到一安装KingbaseES数据库
  • 力扣习题——电话号码的字母组合
  • Linux环境下爬虫程序的部署难题与系统性解决方案
  • 深入解析ThreadLocal:线程数据隔离利器
  • D01-【计算机二级】Python(1)基本操作第41题
  • API开发工具postman、国内xxapi和SmartApi的性能对比
  • Scikit-learn Python机器学习 - 分类算法 - 线性模型 逻辑回归
  • SciKit-Learn 全面分析 digits 手写数据集
  • 《sklearn机器学习——数据预处理》标准化或均值去除和方差缩放
  • 保序回归Isotonic Regression的sklearn实现案例
  • 《sklearn机器学习——数据预处理》离散化
  • 无人机桨叶转速技术要点与突破
  • GPFS存储服务如何使用及运维
  • ELK 日志采集与解析实战
  • BI数据可视化:驱动数据价值释放的关键引擎
  • FinChat-金融领域的ChatGPT
  • OpenTenBase日常操作锦囊(新手上路DML)
  • Dart 中的 Event Loop(事件循环)
  • C++/Java编程小论——方法设计与接口原则总结
  • Java-Spring入门指南(四)深入IOC本质与依赖注入(DI)实战
  • 线扫相机采集图像起始位置不正确原因总结
  • JVM 对象创建的核心流程!
  • 秋日私语:一片落叶,一个智能的温暖陪伴
  • springCloud之配置/注册中心及服务发现Nacos
  • 第1讲 机器学习(ML)教程
  • Ubuntu 系统 YOLOv8 部署教程(GPU CPU 一键安装)
  • 【C++】string 的使用(初步会用 string,看这一篇文章就够了)
  • 基于 lua_shared_dict 的本地内存限流实现
  • 基于场景的自动驾驶汽车技术安全需求制定方法
  • 【lucene】pointDimensionCount` vs `pointIndexDimensionCount`: