当前位置: 首页 > news >正文

硬件(十)IMX6ULL 中断与时钟配置

一、OCP 原则(开闭原则)

对代码扩展是开放的,允许通过新增代码来扩展功能;对代码的修改是关闭的,尽量避免直接修改已有稳定运行的代码,以此保障代码的稳定性与可维护性。

二、中断处理

(一)中断函数注册机制

通过 typedef 定义函数指针类型 irq_handler,用于统一中断处理函数的格式(无参数、无返回值)。
定义中断向量表 interrupt_vector_table,存储不同中断源对应的处理函数。
提供 system_register_irq 函数,实现中断源与处理函数的注册关联,遵循 OCP 原则,方便新增中断处理时,仅需注册而无需修改已有代码。
system_interrupt_handler 函数通过中断号从向量表中调用对应的处理函数,完成中断响应。

(二)示例:按键中断

注册按键对应的中断源 GPIO1_Combined_16_31_IRQn 与处理函数 key_interrupt_handler
在 key_interrupt_handler 中,检测 GPIO1 的中断状态寄存器(ISR),若对应按键中断标志置位,执行 led_nor 操作并清除中断标志。

三、时钟系统

(一)时钟生成核心组件

  • PLL(锁相环电路):实现倍频功能,公式为 Fout​=Fin​×n(Fin​ 为输入频率,n 为倍频系数)。
  • Prescale(预分频器):实现分频功能,公式为 Fout​=Fin​/m(m 为分频系数)。
  • PFD(相位分数分频器):结合倍频与分频,公式为 Fout​=(Fin​×n)/m,可分配n,m的大小(即分数小于零或者大于零),实现倍频或分频。

(二)IMX6ULL 中的 PLL

IMX6ULL 有多个 PLL 用于不同模块时钟供给,如 ARM PLL(PLL1)为 Cortex - A7 内核提供时钟,528 PLL(PLL2)作为系统 PLL,USB1 PLL(PLL3)用于 USB 模块等。

(三)时钟配置步骤

1. PLL 配置(以 PLL1 为例)

修改 PLL1 前先将内核时钟置为 24MHz,是为避免切换时钟时因时钟不稳定导致 ARM 内核停止工作。具体步骤:

2. 时钟生成树(CLOCK ROOT GENERATOR)配置

分别配置关键时钟根:

  • AHB_CLK_ROOT:例如选择 PLL2 PFD02 作为时钟源,通过寄存器 CCM_CBCMR 配置时钟源选择位;利用 CCM_CBCDR 的 AHB_PODF 进行三分频,将 396MHz 时钟分频为 132MHz。
  • IPG_CLK_ROOT:对 AHB 时钟进行二分频,配置为 66MHz。
  • PERCLK_CLK_ROOT:保持一分频,时钟频率为 66MHz,为相关外设提供时钟。


文章转载自:

http://KEXCXaND.tzjqm.cn
http://UZ21uac9.tzjqm.cn
http://EVJegXWh.tzjqm.cn
http://blyBiFOu.tzjqm.cn
http://m68DOYU7.tzjqm.cn
http://NBqDvm28.tzjqm.cn
http://PqkJHzEC.tzjqm.cn
http://eUEEaVHA.tzjqm.cn
http://3tzJouLY.tzjqm.cn
http://eenZ9Xk4.tzjqm.cn
http://oATmTutt.tzjqm.cn
http://X7VCix8f.tzjqm.cn
http://IqPmVApu.tzjqm.cn
http://Nru63ch1.tzjqm.cn
http://LZo27uCW.tzjqm.cn
http://kP07Tiyp.tzjqm.cn
http://zLH1IcXc.tzjqm.cn
http://iHw4yHvm.tzjqm.cn
http://ALyUhYNI.tzjqm.cn
http://DM9afqRr.tzjqm.cn
http://jpS9EAzJ.tzjqm.cn
http://ece8gXdT.tzjqm.cn
http://HJWONfLD.tzjqm.cn
http://wMpQUSmM.tzjqm.cn
http://O9Spce09.tzjqm.cn
http://PRR5YJsy.tzjqm.cn
http://xrmnjMIR.tzjqm.cn
http://SCrzfGbF.tzjqm.cn
http://fA4IACdD.tzjqm.cn
http://xd6XfHFq.tzjqm.cn
http://www.dtcms.com/a/382455.html

相关文章:

  • 格式备忘录
  • Anaconda配置环境变量和镜像
  • 健康大数据与传统大数据技术专业有何不同?
  • 《C++ Primer 第五版》this 指针 (下)
  • Python 之 Faker
  • 【问题解决】VMware +Ubuntu20.04创建用户后无法登陆的问题
  • 【底层机制】【C++】std::move 为什么引入?是什么?怎么实现的?怎么正确用?
  • 链动 3+1 模式解析:社交电商裂变的高效破局路径
  • 镀锌板数控矫平机:把“波浪”熨成“镜面”的幕后原理
  • isEmpty 和 isBlank 的区别
  • AAC ADTS格式分析
  • `Object.groupBy`将数组中的数据分到对象中
  • IACheck赋能AI环评报告审核,提升智慧交通项目合规性
  • 腾讯面试题之编辑距离
  • 云服务器使用代理稳定与github通信方法
  • 通过内存去重替换SQL中distinct,优化SQL查询效率
  • 【完整源码+数据集+部署教程】航拍遥感太阳能面板识别图像分割
  • make和Makefile细节补充
  • 从经验主义到贝叶斯理论:如何排查线上问题
  • 机器人路径规划算法大全RRT,APF,DS,RL
  • 9.13AI简报丨哈佛医学院开源AI模型,Genspark推出AI浏览器
  • 04.【Linux系统编程】基础开发工具2(makefile、进度条程序实现、版本控制器Git、调试器gdb/cgdb的使用)
  • Apache Cloudberry:一款先进成熟的MPP数据库,Greenplum开源替代
  • Vue3基础知识-setup()参数:props和context
  • 机器学习-循环神经网络(RNN)、模型选择
  • 测试电商购物车功能,设计测试case
  • 第七章:AI进阶之------输入与输出函数(一)
  • Nginx SSL/TLS 配置指南
  • 单片机的RAM与ROM概念
  • C++初认、命名规则、输入输出、函数重载、引用+coust引用