裸机开发速记:启动流程|GIC 中断|时钟系统|UART 通信

ARM裸机笔记

ARM启动代码中做的事

Cortex‑A7裸机,上电首先执行启动汇编,完成硬件、内核模式、栈、缓存初始化,最后跳转C语言main函数。

  1. 设置异常向量表
    将复位、未定义指令、软中断、预取中止、数据中止、IRQ、FIQ异常的跳转指令放在内存起始处,发生异常CPU自动跳转到对应偏移地址执行。
  2. 异常向量表地址重映射
    把异常向量表重映射到程序链接地址0x87800000,告诉Cortex‑A7内核从此处读取异常向量。
  3. 为不同处理器工作模式分配栈指针SP
    ARM7/A7有多种工作模式:管理模式、IRQ中断模式、FIQ模式、系统模式。
    每种模式拥有独立SP栈寄存器;在汇编里给IRQ模式、System模式设置栈空间,中断发生才能正常入栈保存寄存器。

ARM默认是满减栈,STMFD入栈、LDMFD出栈。

  1. 使能IRQ内核总中断
    修改CPSR程序状态寄存器,打开内核层面IRQ中断开关;注意:GIC外设中断还需要单独使能,此处只是内核允许接收IRQ。
  2. 清零BSS段
    BSS段存放初始化为0/未初始化的全局、静态变量;BSS段在bin文件中不占空间,汇编需要手动把BSS内存区域全部置0,防止随机脏数据。
  3. 打开I‑CACHE指令缓存,关闭D‑CACHE数据缓存
    CP15协处理器控制Cache:
  • I‑Cache:指令高速缓存,打开,CPU取指令速度大幅提升;
  • D‑Cache:数据高速缓存,裸机下关闭,避免IO寄存器访问被缓存优化出现异常。
  1. 跳转到C语言main函数执行
    使用bl main,把返回地址存入LR,正式进入C语言裸机业务代码。

关键指令补充:

  • MRS:读取CPSR特殊寄存器到通用寄存器;MSR:把通用寄存器写回CPSR,用来切换工作模式、开关中断。
  • stmfd sp!,{r0‑r12,lr}:中断入栈保护现场;ldmfd sp!,{r0‑r12,lr}:中断出栈恢复现场。

中断系统(GIC V2,IMX6ULL)

GIC是ARM提供的通用中断控制器,Cortex‑A7使用GIC V2,IMX6ULL硬件支持160路中断源。

GIC中断三大类

  1. SPI共享外设中断:各类外设产生(GPIO、EPIT、GPT、UART、I2C),多核之间可以共享处理。
  2. PPI私有中断:属于单个CPU内核,用于核间通信,和外部外设无关。
  3. SGI软件中断:SVC/swi指令软件触发,多用于操作系统。

IMX6ULL外部中断完整流程(以GPIO按键为例)

  1. 外设侧寄存器配置(GPIO模块)
  • GPIOx_ICR:配置中断触发方式:上升沿 / 下降沿 / 高电平 / 低电平;
  • GPIOx_IMR:中断掩码,使能该引脚中断;
  • GPIOx_ISR:中断状态标志位,写1清除中断标志。
  1. GIC中断控制器配置
  • 设置该中断源优先级;
  • GIC Distributor层使能对应中断;
  1. 内核响应中断
    外设产生中断信号送给GIC;GIC转发给Cortex‑A7内核。CPU进入IRQ异常模式,跳转到异常向量表IRQ入口。
  2. 中断服务处理
  • 读C_IAR寄存器,获取发生中断的中断号;
  • 根据中断号调用对应外设中断处理函数;
  • 处理完成,将中断号写入C_EOIR,通知GIC本次中断处理完毕;
  • 恢复寄存器现场,返回被打断的程序。

中断优先级:IMX6ULL共32级优先级0~31,数字越小优先级越高。

定时器(EPIT / GPT)

EPIT定时器

32位自减计数器,两种工作模式:

  1. Free‑Running 自由运行模式:计数器到0后自动重装载最大值0xFFFFFFFF;
  2. Set‑and‑Forget 设置遗忘模式:计数到0,只重装载一次加载寄存器的值。
GPT定时器

32位自增计数器:

  1. 输出比较:可以输出PWM方波;
  2. 输入捕获:测量外部脉冲高/低电平时间,测脉冲宽度。

按键软件消抖:利用定时器延时,跳过机械按键抖动时间段再读取IO电平,代替硬件RC电容消抖。


时钟系统

IMX6ULL外部输入晶振:24M无源晶振

  • PLL锁相环:实现倍频,把低频外部晶振提升到高频内核时钟;
  • PFD相位分数分频器:进一步做倍频、分频;
  • Prescale预分频器:对时钟做整数分频。

IMX6ULL核心时钟配置目标

  1. ARM内核时钟:528MHz
  2. AHB_CLK_ROOT:132MHz 高速总线时钟(AHB总线,高速外设:DDR、USB)
  3. IPG_CLK_ROOT:66MHz
  4. PERCLK_CLK_ROOT:66MHz

总线划分:

  • AHB高速总线:高速外设 DDR、网卡、USB;
  • APB外设总线:低速外设 GPIO、UART、定时器、I2C。

每个外设都有CCGR时钟门控寄存器,使用外设前必须打开时钟,否则外设不工作。


UART 通用异步收发器

UART:全双工、串行、异步通信 。

信号线:

  • TXD:发送;RXD:接收;
  • RTS_B 请求发送、CTS_B清除发送:硬件流控,防止接收缓冲区溢出丢数据,裸机一般不用。

UART通信帧格式

空闲状态:总线高电平

1bit起始位(低电平) → 8bit数据位 → 可选校验位 → 1bit停止位(高电平)

常用配置:115200‑8‑N‑1:波特率115200,8数据位,无校验,1停止位。

电气标准对比

项目 TTL RS232 RS485
信号 单端 单端 差分A/B
电平 0~3.3V / 0~5V ±3~±15V A‑B压差
最大距离 <5m 15m 1200m
双工 全双工 全双工 半双工
节点 点对点 点对点 总线多节点
抗干扰 弱 一般 强工业环境
芯片 IO口 MAX232 MAX485

UART编程要点

  1. CCM打开UART外设时钟;
  2. IOMUXC引脚复用,把IO配置成TXD/RXD功能,配置电气属性;
  3. 设置波特率寄存器(分频、采样因子);
  4. 设置帧格式:数据位、停止位、校验;
  5. 使能发送器、接收器;
  6. 两种收发方式:
    • 轮询模式:不断查询发送/接收状态标志寄存器,判断是否可以发送、是否收到数据;简单,CPU占用高;
    • 中断模式:收到数据/发送缓冲区空触发中断,在中断服务函数处理收发,CPU效率更高。

UART异步含义:收发双方没有公共时钟信号线,依靠预先约定的波特率来采样数据;波特率误差不能太大,否则乱码。

相关推荐
LCG米1 小时前
STM32串口接收卡死根因排查:ORE溢出标志陷阱、错误标志清除顺序与中断恢复实测
stm32·单片机·嵌入式硬件·串口·嵌入式
创界工坊工作室3 小时前
38-基于单片机的老人健康监测系统
单片机·嵌入式硬件·51单片机·proteus
三佛科技-134163842124 小时前
20W~200W副边反馈SSR隔离方案HN1562+碳化硅MOS(含光耦817,431)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
恒锐丰科技林技术员6 小时前
EG2103 高压 MOS/IGBT 驱动芯片解析:半桥驱动的高性价比之选
经验分享·嵌入式硬件·硬件工程
_Ningye8 小时前
STM32 — 11.5 硬件SPI读写W25Q64
stm32·单片机·嵌入式硬件
inrichtt8 小时前
第九课时:STM32 SPI实战:按键消抖与FLASH断电保护
stm32·单片机·嵌入式硬件
优信电子9 小时前
STM32 驱动 SHT35 温湿度传感器:从 I²C 通信到 CRC 校验的完整实战
单片机·嵌入式
尼喃10 小时前
两节两串锂电池保护板原理图+充电电路二合一电路图
嵌入式硬件
深圳市恒锐丰科技杨生10 小时前
SS6208L 12V 集成 MOS 半桥功率芯片|LeadPower 率能半导体
嵌入式硬件·硬件工程
女神下凡11 小时前
芯参谋(61):PMSM永磁同步电机驱动电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范