一、 异常与中断基础
在嵌入式系统中,异常和中断是核心机制。基础概念:
-
异常向量表:处理器在发生异常时,会跳转到固定的地址执行代码。
-
软中断(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):边沿选择寄存器。设置双边沿触发。
五、 点灯实现的三种方式
在掌握上述原理后,点灯可以通过三种递进的方式实现,这也是接下来的动手目标:
-
汇编点灯:最底层,直接操作寄存器,理解最深刻。
-
C点灯:用C语言指针操作寄存器,提高开发效率。
-
NXP提供固件库点灯:使用官方SDK,企业级开发常用,可读性好,屏蔽底层细节。
今日总结与反思
今天的信息量非常大,但脉络很清晰。从异常向量表 到交叉编译环境搭建 ,再到内存映射 和GPIO底层寄存器。尤其是GPIO的七个寄存器(DR、GDIR、PSR、ICR、IMR、ISR、EDGE_SEL),每个都有明确的分工。
踩坑预警:
-
配置引脚时,务必先配置
IOMUXC复用和电气属性,再配置GPIO的方向和电平。 -
不要忘记开启
CCM时钟门,否则操作GPIO寄存器无效。 -
压摆率根据实际设备速度配置,不可一味求快。