📝摘要:本篇承接IMX6ULL裸机开发笔记,讲解
CPS模式/中断开关指令、裸机启动完整流程、GIC中断优先级体系;时钟系统晶振、PLL锁相环、PFD相位分数分频、预分频Prescale;EPIT自减定时器、GPT自增定时器功能;UART串口参数、硬件流控RTS/CTS,附带代码片段,适合嵌入式期末复习、裸机实验。
🔖标签:#IMX6ULL#CPS指令#PLL时钟#EPIT GPT定时器#UART串口
1. CPS指令:模式切换与IRQ/FIQ中断开关
CPS指令从 ARMv6指令集开始支持,Cortex‑A7属于ARMv7,完全支持;用于快速切换处理器模式、快速开关IRQ/FIQ中断,不需要MRS/MSR读写CPSR。
① 切换处理器工作模式
语法:CPS #<mode_number>
cps #0x12 ; 0b10010 → IRQ模式
cps #0x1F ; 0b11111 → System系统模式
对比旧方案:传统需要
MRS→修改寄存器→MSR三步;CPS单条指令完成模式切换。
② 快速使能/关闭中断
CPSIE i:CPS Interrupt Enable,使能IRQ普通中断CPSID i:CPS Interrupt Disable,屏蔽IRQ普通中断CPSIE f:使能FIQ快速中断CPSID f:屏蔽FIQ快速中断
示例汇编片段
cpsid i ; 关闭IRQ,防止初始化阶段被中断打断
cps #0x12 ; 进入IRQ模式
; 设置IRQ模式栈指针
cps #0x1F ; 切回System模式
cpsie i ; 初始化完成,打开IRQ中断
⚠️注意:CPS只能在特权模式执行,USER用户模式下不能使用CPS修改模式/中断掩码。
2. ARM裸机启动汇编标准流程
裸机start.S汇编入口完整执行步骤:
- 设置异常向量表;
- CP15协处理器操作,完成异常向量表地址重映射,把向量表基地址设置到
0x87800000; - 为各个处理器工作模式开辟独立栈:IRQ模式栈、System模式栈;
- 使用
CPSIE i使能IRQ内核中断总开关; - 清零
.bss段(把初始值为0的全局变量内存全部置零); - CP15打开I‑Cache指令高速缓存,提升取指速度;
- 跳转
bl main,进入C语言main函数。
简易框架start.S片段
.global _start
_start:
cpsid i ; 先关闭中断
; 1.向量表重映射,设置CP15 c12寄存器
ldr r0,=0x87800000
mcr p15,0,r0,c12,c0,0
; 2.设置IRQ模式栈
cps #0x12
ldr sp,=0x86000000
; 3.设置System模式栈
cps #0x1F
ldr sp,=0x84000000
cpsie i ; 开启IRQ中断
; 4.清零bss段
ldr r0,=__bss_start__
ldr r1,=__bss_end__
bss_loop:
cmp r0,r1
beq bss_done
mov r2,#0
str r2,[r0],#4
b bss_loop
bss_done:
; 5.打开I‑Cache
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<12)
mcr p15,0,r0,c1,c0,0
bl main ;跳转到C语言main
b . ;main返回就死循环
3. GIC‑V2中断优先级体系
GIC‑V2总共有256个优先级(0~255),数字越小优先级越高。
IMX6ULL实际裁剪为 32级优先级:0 ~ 31,数值越小优先级越高。
优先级拆分为两部分:
- 抢占优先级(组优先级):高抢占优先级中断可以抢占低抢占优先级中断,实现中断嵌套;
- 子优先级:同抢占优先级的多个中断同时到来,按子优先级决定处理先后;不能发生中断抢占。
💡开闭原则OCP(Open‑Closed Principle):面向对象设计思想
- 对扩展开放:新增功能,尽量新增代码;
- 对修改关闭:尽量不去修改已经稳定的旧业务代码。
4. 时钟系统:晶振、PLL、Prescale预分频、PFD相位分数分频
晶振分类
- 无源晶振:外部只提供振荡源,需要芯片内部振荡电路;
- 有源晶振:自带振荡电路,直接输出稳定时钟波形。
IMX6ULL外部主晶振:24MHZ无源晶振,作为整个芯片时钟树根。
三大时钟模块
- PLL 锁相环 Phase‑Locked Loop
实现整数倍倍频:输入时钟 × N
例:24MHz输入,N倍,输出 =24MHz × N
- Prescale 预分频器
整数分频:输入时钟 ÷ M
例:24MHz输入,M分频,输出 =24MHz / M
- PFD相位分数分频器 Phase Fraction Divider
支持分数倍频/降频:输出 =
24MHz × (N / M)
- N/M >1 → 倍频;
- N/M <1 → 降频。
IMX6ULL时钟配置工作步骤:
- 配置ARM内核PLL,输出528MHZ给Cortex‑A7内核;
- 配置PLL2下4路PFD、PLL3下4路PFD;
- 配置3路根时钟(典型132MHz、66MHz、66MHz),给片内外设(UART、GPT、EPIT等)提供时钟源。
硬件框图逻辑:24M晶振输入,经过PLL/PFD产生高频时钟,再经过各级预分频得到外设工作时钟。
5. IMX6ULL定时器EPIT与GPT
EPIT定时器(自减型定时器)
- 32位,计数范围
0x00000000 ~ 0xFFFFFFFF,从初值向下自减。
两种工作模式:
- Free‑Running Mode自由运行模式:计数器从
0xFFFFFFFF开始向下递减;计数到0后自动重装0xFFFFFFFF。 - Set‑and‑Forget Mode 设置‑遗忘模式:写入初值,计数器向下减,计数到0自动重新加载用户设置的初值,适合周期性定时中断。>
时钟源可以选择24MHz主晶振或者32.768KHZ RTC实时时钟。
GPT定时器(自增型定时器)
- 32位,计数器向上自增,范围
0x00000000 ~ 0xFFFFFFFF。
两大核心功能:
- 输入捕获 Input Capture:捕获外部引脚电平跳变,计算两次跳变之间时间间隔;典型场景:测量脉冲宽度、测量电机转速。
- 输出比较 Output Compare:计数器计到设定阈值,硬件自动输出指定电平,产生PWM方波;用于电机驱动、LED呼吸灯。
简单伪代码软件延时示例(裸机,实际项目尽量使用硬件定时器)
//软件粗略延时,不精准,仅演示
void delay_us(unsigned int n)
{
while(n--){
;
}
}
💡按键消抖两种实现
- 硬件消抖:增加RC电容,电容阻断直流,导通交流,滤除抖动尖峰;
- 软件消抖:定时器延时,抖动时间过后再读取按键电平。
6. UART串口通信、波特率、硬件流控RTS‑CTS
串口典型参数:115200 8 N 1
含义:波特率115200,数据位8,无校验位,停止位1。
波特率生成原理
IMX6ULL UART波特率计算公式
Baudrate=RefClock(UBMR+1)×16 Baudrate = \frac{Ref_Clock}{(UBMR+1) \times 16}Baudrate=(UBMR+1)×16RefClock
示例:参考时钟下,UBMR=43402,UBIR=999,得到波特率115200。
硬件流控 RTS / CTS
用于防止接收缓冲区溢出丢包,强干扰工业场景常用:
- RTS_B(Request To Send 请求发送):我方输出引脚,通知对方:我这边接收缓冲区有空,可以接收你的数据。
- CTS_B(Clear To Send 清除发送):输入引脚,读取对方状态;对方拉低CTS,代表请暂停发送数据。
逻辑:当接收端缓冲区快要满,RTS置无效,通知发送方停止发送;缓冲区腾出空间,RTS恢复有效,通知对方继续传输。
流控分为硬件RTS/CTS流控 和 XON/XOFF软件流控。
7. 拓展:Modbus总线拓扑与校验
Modbus工业总线,典型一主多从拓扑:
- Master主机:IMX6ULL;
- Slaver从机:多个IMX6ULL/传感器设备。
总线运行在强干扰、强电场工业环境,必须使用校验保障数据正确性:
- 累加和校验:全部字节简单相加取低字节;实现简单,纠错能力弱。
- 奇偶校验:统计bit中1的个数;只能检出单bit错误。
- CRC循环冗余校验:工业最常用,检错能力最强。
8. 英文缩写全称对照表
| 缩写 | 英文全称 | 中文释义 |
|---|---|---|
| CPS | Change Processor State | 修改处理器状态指令(ARMv6+) |
| IRQ | Interrupt Request | 普通中断请求 |
| FIQ | Fast Interrupt Request | 快速中断请求 |
| OCP | Open‑Closed Principle | 开闭原则(面向对象设计原则) |
| PLL | Phase‑Locked Loop | 锁相环,实现整数倍时钟倍频 |
| PFD | Phase Fraction Divider | 相位分数分频器,支持分数倍频分频 |
| Prescale | Prescaler | 预分频器,整数分频 |
| EPIT | Enhanced Periodic Interrupt Timer | 增强型周期中断定时器(自减) |
| GPT | General Purpose Timer | 通用定时器(自增) |
| RTC | Real‑Time Clock | 实时时钟 |
| RTS | Request To Send | 请求发送(硬件流控输出信号) |
| CTS | Clear To Send | 清除发送(硬件流控输入信号) |
| CRC | Cyclic Redundancy Check | 循环冗余校验 |
| Modbus | Modbus | 工业串行通信总线协议 |
💡复习小结
- CPS指令ARMv6之后支持,快速切换模式、开关IRQ/FIQ,特权模式才能使用;
- 裸机启动顺序:向量表重映射 → 设置各模式栈 → 清零bss → 开ICache → 跳C main;
- GIC优先级数字越小优先级越高;抢占优先级控制中断嵌套,子优先级仅控制同优先级处理顺序;
- PLL整数倍频,PFD支持分数倍频/分频;外部24MHz晶振为IMX6ULL时钟树根;
- EPIT向下计数,GPT向上计数,GPT支持输入捕获、输出比较PWM;
- UART硬件流控RTS/CTS用来防止缓冲区溢出丢包;工业Modbus常用CRC校验。
612



被折叠的 条评论
为什么被折叠?



