新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 19:29:44来源:尧图网络
裸机开发速记:启动流程|GIC 中断|时钟系统|UART 通信
ARM裸机笔记ARM启动代码中做的事Cortex‑A7裸机上电首先执行启动汇编完成硬件、内核模式、栈、缓存初始化最后跳转C语言main函数。设置异常向量表将复位、未定义指令、软中断、预取中止、数据中止、IRQ、FIQ异常的跳转指令放在内存起始处发生异常CPU自动跳转到对应偏移地址执行。异常向量表地址重映射把异常向量表重映射到程序链接地址0x87800000告诉Cortex‑A7内核从此处读取异常向量。为不同处理器工作模式分配栈指针SPARM7/A7有多种工作模式管理模式、IRQ中断模式、FIQ模式、系统模式。每种模式拥有独立SP栈寄存器在汇编里给IRQ模式、System模式设置栈空间中断发生才能正常入栈保存寄存器。ARM默认是满减栈STMFD入栈、LDMFD出栈。使能IRQ内核总中断修改CPSR程序状态寄存器打开内核层面IRQ中断开关注意GIC外设中断还需要单独使能此处只是内核允许接收IRQ。清零BSS段BSS段存放初始化为0/未初始化的全局、静态变量BSS段在bin文件中不占空间汇编需要手动把BSS内存区域全部置0防止随机脏数据。打开I‑CACHE指令缓存关闭D‑CACHE数据缓存CP15协处理器控制CacheI‑Cache指令高速缓存打开CPU取指令速度大幅提升D‑Cache数据高速缓存裸机下关闭避免IO寄存器访问被缓存优化出现异常。跳转到C语言main函数执行使用bl main把返回地址存入LR正式进入C语言裸机业务代码。关键指令补充MRS读取CPSR特殊寄存器到通用寄存器MSR把通用寄存器写回CPSR用来切换工作模式、开关中断。stmfd sp!,{r0‑r12,lr}中断入栈保护现场ldmfd sp!,{r0‑r12,lr}中断出栈恢复现场。中断系统GIC V2IMX6ULLGIC是ARM提供的通用中断控制器Cortex‑A7使用GIC V2IMX6ULL硬件支持160路中断源。GIC中断三大类SPI共享外设中断各类外设产生GPIO、EPIT、GPT、UART、I2C多核之间可以共享处理。PPI私有中断属于单个CPU内核用于核间通信和外部外设无关。SGI软件中断SVC/swi指令软件触发多用于操作系统。IMX6ULL外部中断完整流程以GPIO按键为例外设侧寄存器配置GPIO模块GPIOx_ICR配置中断触发方式上升沿 / 下降沿 / 高电平 / 低电平GPIOx_IMR中断掩码使能该引脚中断GPIOx_ISR中断状态标志位写1清除中断标志。GIC中断控制器配置设置该中断源优先级GIC Distributor层使能对应中断内核响应中断外设产生中断信号送给GICGIC转发给Cortex‑A7内核。CPU进入IRQ异常模式跳转到异常向量表IRQ入口。中断服务处理读C_IAR寄存器获取发生中断的中断号根据中断号调用对应外设中断处理函数处理完成将中断号写入C_EOIR通知GIC本次中断处理完毕恢复寄存器现场返回被打断的程序。中断优先级IMX6ULL共32级优先级0~31数字越小优先级越高。定时器EPIT / GPTEPIT定时器32位自减计数器两种工作模式Free‑Running 自由运行模式计数器到0后自动重装载最大值0xFFFFFFFFSet‑and‑Forget 设置遗忘模式计数到0只重装载一次加载寄存器的值。GPT定时器32位自增计数器输出比较可以输出PWM方波输入捕获测量外部脉冲高/低电平时间测脉冲宽度。按键软件消抖利用定时器延时跳过机械按键抖动时间段再读取IO电平代替硬件RC电容消抖。时钟系统IMX6ULL外部输入晶振24M无源晶振PLL锁相环实现倍频把低频外部晶振提升到高频内核时钟PFD相位分数分频器进一步做倍频、分频Prescale预分频器对时钟做整数分频。IMX6ULL核心时钟配置目标ARM内核时钟528MHzAHB_CLK_ROOT132MHz 高速总线时钟AHB总线高速外设DDR、USBIPG_CLK_ROOT66MHzPERCLK_CLK_ROOT66MHz总线划分AHB高速总线高速外设 DDR、网卡、USBAPB外设总线低速外设 GPIO、UART、定时器、I2C。每个外设都有CCGR时钟门控寄存器使用外设前必须打开时钟否则外设不工作。UART 通用异步收发器UART全双工、串行、异步通信。信号线TXD发送RXD接收RTS_B 请求发送、CTS_B清除发送硬件流控防止接收缓冲区溢出丢数据裸机一般不用。UART通信帧格式空闲状态总线高电平1bit起始位低电平 → 8bit数据位 → 可选校验位 → 1bit停止位高电平常用配置115200‑8‑N‑1波特率1152008数据位无校验1停止位。电气标准对比项目TTLRS232RS485信号单端单端差分A/B电平0~3.3V / 0~5V±3~±15VA‑B压差最大距离5m15m1200m双工全双工全双工半双工节点点对点点对点总线多节点抗干扰弱一般强工业环境芯片IO口MAX232MAX485UART编程要点CCM打开UART外设时钟IOMUXC引脚复用把IO配置成TXD/RXD功能配置电气属性设置波特率寄存器分频、采样因子设置帧格式数据位、停止位、校验使能发送器、接收器两种收发方式轮询模式不断查询发送/接收状态标志寄存器判断是否可以发送、是否收到数据简单CPU占用高中断模式收到数据/发送缓冲区空触发中断在中断服务函数处理收发CPU效率更高。UART异步含义收发双方没有公共时钟信号线依靠预先约定的波特率来采样数据波特率误差不能太大否则乱码。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows显示器音频设备名乱码?注册表强制固化方案 2026/10/1 19:29:39

Windows显示器音频设备名乱码?注册表强制固化方案

1. 为什么显示器音频设备名会“乱码”或“重复”,而注册表是唯一解?Windows系统里,当你把一台带HDMI/DP音频输出的显示器接上电脑,它不只是显示画面——它同时会作为一个独立的音频播放设备出现在“声音设置”里。但很多人发现&am…

阅读更多 →
Jev决策模型实战:从判断决策到分类聚合的关键落地路径 2026/10/1 19:29:39

Jev决策模型实战:从判断决策到分类聚合的关键落地路径

最近这段时间,我一直在折腾 TypeSafe AI 发布的 Jev 决策模型,确切地说是围绕“判断决策”和“分类聚合”这两个关键词反复做验证。圈子里很多朋友都在问 Jev 模型到底是什么、值不值得申请、拿到之后能用在哪些地方,我结合自己跑通的一轮实验…

阅读更多 →
基于Python+Flask+MySQL的养老保险管理系统开发实践 2026/10/1 19:29:39

基于Python+Flask+MySQL的养老保险管理系统开发实践

做基于Python的养老保险管理系统这个毕设时,我踩的第一个坑就是把它当成了普通的增删改查项目。等到数据库建完第一版,才发现参保、缴费、账户、待遇这几张表之间的关系根本理不清:一个人每个月缴的钱进了哪个账户?领待遇的时候金…

阅读更多 →
马德拉“不死之酒”全解析:酿造、品鉴与收藏指南 2026/10/1 19:29:39

马德拉“不死之酒”全解析:酿造、品鉴与收藏指南

如果你问一个在酒圈泡了十几年的人:“哪种酒最适合入门收藏?”十有八九会听到“马德拉(Madeira)”这个名字。这款来自葡萄牙马德拉群岛的加强型葡萄酒,在圈内有个响当当的绰号叫“不死之酒”,不是因为它度数…

阅读更多 →
深度学习优化器选型与实战调参指南:从SGD到AdamW 2026/10/1 19:29:39

深度学习优化器选型与实战调参指南:从SGD到AdamW

很多刚接触深度学习的同学看到"Model-Optimizer"这个名字时会有点困惑:这到底是指一个具体工具,还是某类算法的统称?其实在训练管线里,它指向的通常就是那个控制模型参数如何更新的优化器(Optimizer&#xf…

阅读更多 →
容器逃逸攻击路径与防御加固实践指南 2026/10/1 19:29:32

容器逃逸攻击路径与防御加固实践指南

1. 容器逃逸到底是什么先讲个我实际经历过的场景。有一次帮客户做安全排查,客户的反馈是“容器里好像被种了东西”,结果我们顺着线索往上一查,发现宿主机也被拿下了。这就是典型的容器逃逸——攻击者本来只是攻破了一个容器,但最后…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉