一、基础概念回顾
1.1 异常向量表 & SVC软中断
– SVC指令:SVC<c ><imm24>,用于触发软中断,后面跟中断号,示例:svc 7。
– 硬中断:IMX6ULL外设产生的硬件触发中断。
1.2 IMX6ULL GPIO分组
IMX6ULL的GPIO一共分为5组:GPIO1、GPIO2、GPIO3、GPIO4、GPIO5。
二、开发环境:Windows VSCode 连接Ubuntu
采用Windows端VSCode,Ubuntu作为编译服务器,配合FTP实现文件传输。
2.1 VSCode必备插件
|
插件名称 |
作用 |
|
C/C++ |
C 语言基础编译调试支持 |
|
C/C++ Extension Pack |
C/C++ 全套扩展包 |
|
ARM Assembly |
ARM 汇编语法高亮 |
|
Makefile Tools |
Makefile 工程编译管理 |
2.2 文件传输 FileZilla
– Windows:FileZilla FTP Client
– Ubuntu:搭建FTP Server
实现Windows写代码,Ubuntu进行交叉编译。
三、DDR3内存布局
IMX6ULL DDR3起始地址:0x80000000,总大小512MB。
内存范围:0x80000000 ~ 0xA0000000
内存栈划分:
1. sp_system(系统模式栈):0x84000000起始
2. sp_irq(中断模式栈):占用32MB空间,起始地址0x86000000
小知识点:32MB 换算字节:0x2000000
四、LED点灯的三种实现方式
IMX6ULL裸机点灯一共有3种方式:
1. 汇编语言直接操作寄存器点灯
2. C语言操作寄存器点灯
3. 使用NXP官方固件库点灯
点灯开发需要操作三大模块:IOMUXC引脚复用、GPIO寄存器、CCM时钟控制器
4.1 模块1:IOMUXC 引脚复用与电气属性
IOMUXC负责配置引脚复用功能、引脚电气特性。
两个核心寄存器(以GPIO1_IO03为例):
1. IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03:引脚复用功能寄存器,配置这个引脚复用为GPIO功能或者其他外设功能。
2. IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03:引脚电气属性寄存器
– 高压摆率:波形陡峭,适合高速设备
– 低压摆率:波形平缓,适合低速场景
4.2 模块2:GPIO寄存器组(参考手册第28章)
GPIO模块负责引脚方向设置、输出电平、读取引脚状态、GPIO中断配置。
|
寄存器名 |
功能说明 |
|
GPIOx_DR |
输出寄存器,写 0 输出低电平,写 1 输出高电平 |
|
GPIOx_GDIR |
方向寄存器:0 = 输入,1 = 输出 |
|
GPIOx_PSR |
只读,读取引脚外部输入电平状态 |
|
GPIOx_ICR |
中断触发方式:高 / 低电平、上升沿、下降沿 |
|
GPIOx_IMR |
中断屏蔽寄存器:开启 / 关闭该引脚中断 |
|
GPIOx_ISR |
中断状态查询,判断引脚是否产生中断 |
|
GPIOx_EDGE_SEL |
双边沿中断选择,上升下降沿都触发中断 |
4.3 模块3:CCM时钟控制器
外设寄存器如果没有时钟供给,寄存器无法读写。
寄存器CCM_CCGR0 ~ CCM_CCGR6,全部置0xFFFFFFFF,打开全部外设时钟门控。
注意:裸机开发必须先打开外设时钟,否则GPIO、IOMUXC寄存器读写全部无效!
五、Day03学习总结
1. SVC软中断指令格式svc 中断号,区分软中断、硬件中断;
2. IMX6ULL GPIO分为5组,点灯必须操作IOMUXC、GPIO、CCM时钟三大模块;
3. DDR内存从0x80000000开始,需要划分不同模式下的栈空间;
4. 裸机点灯三种方式:汇编、C语言、NXP库;
5. VSCode+Ubuntu+FileZilla是非常方便的裸机开发组合。


