新手自学嵌入式 | 学习日记:异常与中断基础、i.MX6ULL裸机开发环境搭建、GPIO模块与点灯原理

一、 异常与中断基础

在嵌入式系统中,异常和中断是核心机制。基础概念:

  • 异常向量表:处理器在发生异常时,会跳转到固定的地址执行代码。

  • 软中断(SVC):

    • 通过指令 SVC<c> #<imm24> 触发,例如 svc #7。

    • 常用于在用户模式下调用操作系统内核的系统调用(Syscall)。

  • 硬中断:由外部硬件(如GPIO引脚、定时器)触发的中断。


二、 开发环境搭建与工具链

今天理清了Windows和Ubuntu协同开发的流程,这也是嵌入式开发的经典工作流。

1. 协同工作流(FTP)
  • Windows :作为开发主机,使用 Vscode 编写代码(作为FTP Client)。

  • Ubuntu:作为编译服务器(作为FTP Server),进行交叉编译。

  • FileZilla (FTP):用于在Windows和Ubuntu之间同步代码文件。

2. Vscode 必装插件

为了在Windows上获得更好的开发体验,安装了以下插件:

  • C/C++

  • C/C++ Extension Pack

  • ARM Assembly

  • Makefile Tools

3. 交叉编译器安装

在Ubuntu中,通过解压安装包来安装交叉编译器:

bash

复制代码
sudo tar -xvf gcc-xxx.tar.xz

三、 i.MX6ULL 内存映射与地址空间

理清内存映射是裸机开发的基础。结合图示,明确了i.MX6ULL的DDR3内存分布:

  • DDR3起始地址 :0x80000000

  • DDR3大小:512MB

  • 结束地址 :0x80000000 + 0x20000000 = 0xA0000000

结合内存分布图,看到了栈指针(SP)的划分:

  • 0x84000000 附近:sp_system(系统模式栈)。

  • 0x86000000 附近:sp_irq(中断模式栈)。

  • 各占据 32MB 的空间。

  • 顶部 0xA0000000 附近为其他用途。

(注:结合昨天的满减栈知识,这里不同模式下拥有独立的SP指针,印证了ARM多模式栈的设计。)


四、 点亮LED的三个核心模块

在i.MX6ULL上点亮一颗LED,需要配置三个核心模块(对应手册的章节):

1. 时钟(CCM 18章节)
  • 作用:SoC中外设默认是关闭时钟的,为了省电,使用前必须使能对应外设的时钟。

  • 寄存器 :CCM_CCGR0 - CCM_CCGR6。

  • 操作 :通过写入 0xFFFFFFFF 可以打开所有外设时钟门(实际开发中按需开启)。

2. 引脚复用功能 + 引脚电气属性(IOMUXC 32章节)
  • IOMUXC_SW_MUX_CTL_PAD :引脚复用功能。将引脚配置为GPIO模式(例如 _GPIO1_IO03)。

  • IOMUXC_SW_PAD_CTL_PAD:电气属性。配置驱动能力、上下拉、压摆率等。

    • 压摆率(Slew Rate):控制信号跳变的陡峭程度。高压摆率曲线陡峭,适用于高速设备;低压摆率曲线平缓,适用于低速设备,可减少EMI干扰。
3. GPIO模块(GPIO 28章节)

GPIO模块的寄存器是控制引脚的关键:

  • GPIOx_DR (Data Register):数据寄存器。向某个引脚写0或1(低电平/高电平)。

  • GPIOx_GDIR (Direction Register):方向寄存器。设置引脚为输入(0)或输出(1)。

  • GPIOx_PSR (Pad Status Register):状态寄存器(只读)。读取引脚当前状态。

  • GPIOx_ICR (Interrupt Configuration Register):中断配置寄存器。设置触发方式(低电平、高电平、下降沿、上升沿)。

  • GPIOx_IMR (Interrupt Mask Register):中断屏蔽寄存器。屏蔽/允许中断。

  • GPIOx_ISR (Interrupt Status Register):中断状态寄存器。查询是否产生中断。

  • GPIOx_EDGE_SEL (Edge Select Register):边沿选择寄存器。设置双边沿触发。


五、 点灯实现的三种方式

在掌握上述原理后,点灯可以通过三种递进的方式实现,这也是接下来的动手目标:

  1. 汇编点灯:最底层,直接操作寄存器,理解最深刻。

  2. C点灯:用C语言指针操作寄存器,提高开发效率。

  3. NXP提供固件库点灯:使用官方SDK,企业级开发常用,可读性好,屏蔽底层细节。


今日总结与反思

今天的信息量非常大,但脉络很清晰。从异常向量表 到交叉编译环境搭建 ,再到内存映射 和GPIO底层寄存器。尤其是GPIO的七个寄存器(DR、GDIR、PSR、ICR、IMR、ISR、EDGE_SEL),每个都有明确的分工。

踩坑预警:

  1. 配置引脚时,务必先配置 IOMUXC 复用和电气属性,再配置 GPIO 的方向和电平。

  2. 不要忘记开启 CCM 时钟门,否则操作GPIO寄存器无效。

  3. 压摆率根据实际设备速度配置,不可一味求快。

相关推荐
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(94):MemGen——在推理过程中动态生成并织入潜在记忆
论文阅读·人工智能·学习·开源·github
晓德2 小时前
0、LLM大模型安全学习系列(启)
学习·安全
Titan20243 小时前
MySQL索引学习笔记
笔记·学习·mysql
JWASX3 小时前
Java 转 go 学习 - kitex(5)
学习·golang
AOI小白新手上路3 小时前
VDMamba·AutoDL 复现笔记 · 学习笔记
笔记·学习
~kiss~3 小时前
LangGraph ~ 为图添加跨线程持久化
学习
xianrenli385 小时前
水肺潜水学习
学习
凌云若寒6 小时前
BarTender提示#807错误:无法在拥有其他许可证的Licensing Service上激活节点锁定的 Professional 版许可证 的解决办法
运维·服务器·前端·学习·软件需求
爱吃苹果的日记本7 小时前
离散数学第七课
学习·离散数学