ARM6.(时钟设置,EPIT定时器)

1.晶振原理图

有源晶振,为 IMX6ULL提供 24MHz 的系统时钟源。

IMX6ULL时钟树:

时钟根所对应功能:

2.配置时钟

2.1首先给arm配置528mhz时钟:

给PLL1设置为1056,经过二分频变为528,但是不能直接修改PLL1,其频率会直接加载到arm内核导致死机,因此我们需要先让arm临时工作在24mhz(step_clock)下,配置好PLL和2分频后再改回PLL1输入,原理图如下:

先将ccm的ccsr第八位清零,选通step,再将ccsr的第二位置1,此时arm工作在24mhz,最后给PPL------ARMn14-15位清零,13位置1使能,倍频div_select=88(1056 = 24*div_select/2.0)再二分频。将ARM频率切回PLL1。

2.2接下来分别设置PLL2(528n)的四个PFD和 PLL3(480n)的四个PFD。

528n:pfd0:352,pfd1:594,pfd2:396,pfd3:297

528n手册:

给0-5,8-13,16-21,24-29清零,后续填写分频因子,使能四个pfd,计算分频因子并写入,将t写回:

480n手册:

480n同理:

2.3最后我们配置三个根时钟

配置示意图:

CCM->CSCMR第19-18位写入01选通PLL2的PFD2,CBCDR第25位清零选通PLL2,CPCDR第10-12位先清零再写入2,选通3分频,CPCDR第8-9位先清零再写入2,选通2分频,写回t,再将CSCMR1第6位清零,再写入000000到0-5位,选通1分频,写回t,至此时钟配置完成。

与给arm配置时钟不同的是给其他外设配置时钟时应该先关闭时钟防止出现大幅波动导致外设死机,配置好后重新打开。

复制代码
void init_clock(void)
{
    //初始化arm时钟
    unsigned int t;
    CCM->CCSR &= ~(1 << 8);//先将ccm的ccsr第八位清零,选通step,
    CCM->CCSR |= (1 << 2);//再将ccsr的第二位置1,此时arm工作在24mhz
    t = CCM_ANALOG->PLL_ARM;//读取
    t &= ~(3 << 14);//PPL------ARMn14-15位清零
    t |= (1 << 13); //13位置1使能
    t &= ~(0x7f << 0);//先清零
    t |= (0x58 << 0); //,再倍频div_select=88(1056 = 24*div_select/2.0)
    CCM_ANALOG->PLL_ARM = t;//将t写回
    CCM->CACRR |= (1 << 0);//开2分频
    CCM->CCSR &= ~(1 << 2);//将ccsr的第二位清零,此时arm工作在528mhz
    

    //PLL2 PLL3下的PFD
    //PLL2>528n:pfd0:352,pfd1:594,pfd2:396,pfd3:297
    t = CCM_ANALOG->PFD_528;
    t &= ~((0x3f << 0) | (0x3f << 8)|(0x3f << 16) |(0x3f << 24));
    //给0-5,8-13,16-21,24-29位清零
    //后续填写分频因子
    t &= ~((1 << 7) | (1 << 15)|(1 << 23) |(1 << 31));//使能四个pfd
    t |= (27 << 0) |  (16 << 8) |(24 << 16) | (32 << 24);//计算分频因子并写入
    CCM_ANALOG->PFD_528 = t;//将t写回

    //PLL2>528n:pfd0:720,pfd1:540,pfd2:508,pfd3:454.7
    t = CCM_ANALOG ->PFD_480;
    t &= ~((0x3f << 0) | (0x3f << 8)|(0x3f << 16) |(0x3f << 24));
    //给0-5,8-13,16-21,24-29位清零
    //后续填写分频因子
    t &= ~((1 << 7) | (1 << 15)|(1 << 23) |(1 << 31));//使能四个pfd
    t |= (12 << 0) |  (16 << 8) |(17 << 16) | (19 << 24);//计算分频因子并写入
    CCM_ANALOG->PFD_480 = t;//将t写回


    /*7、配置三个根时钟AHB_CLK=132、IPG_CLK=66、PERCLK_CLK=6*/
    t = CCM->CBCMR;
    t &= ~(3 << 18);//清零18-19位
    t |= (1 << 18);//写入01选通PLL2的PFD2
    CCM->CBCMR = t;//写回t

    t = CCM->CBCDR;
    t &= ~(1 << 25);//25位清零选通PLL2
    t &= ~(7 << 10);//10-12位清零
    t |= (2 << 10);//AHB_CLK_ROOT=Fin/3,选通4分频
    t &= ~(3 << 8);//8-9位清零
    t |= (1 << 8); //IPG_CLK_ROOT=Fin/2,选通2分频
    CCM->CBCDR = t;//写回t

    t = CCM->CSCMR1;
    t &= ~(1 << 6);
    t &= ~(0x3f << 0);//PERCLK_CLK_ROOT=Fin/1
    CCM->CSCMR1 = t;


    enable_clicks();//配置完时钟后再打开所有外设时钟

}

3.EPIT定时器

EPIT 是 i.MX6ULL 内部的一个 32 位(0x00000000~0xffffffff)向下计数定时器,主要用于产生周期性中断或定时延时。它有两个独立实例 EPIT1 和 EPIT2,支持 1 到 4096 的分频系数,可以工作在周期性或单次模式。工作时,它会从装载寄存器 LR 读取初值,向下递减计数,当计数到 0 时产生中断,并自动重载 LR 继续计数。使用 EPIT 需要先通过 CCM 时钟控制器打开其时钟门控,然后配置控制寄存器 CR 选择时钟源、分频值和模式,再设置 LR 决定定时周期,最后使能定时器并在 IRQ 中断服务函数中清除中断标志位。相比 89C51 的定时器,EPIT 位数更长、分频更灵活,并且通过 GIC 统一管理中断,而不是固定的中断入口地址。

若此与门ITIE使能打开,且收到ITIF,就会发起一次中断。

4.GPT定时器

GPT(General Purpose Timer)是 i.MX6ULL 内部的一个 32 位通用定时器,支持向上计数、输入捕获、输出比较及中断/DMA 请求,比 EPIT 功能更强。它通过 CCM 打开时钟门控后,配置控制寄存器 CR 选择时钟源和计数模式(自由运行或重启模式),再通过预分频寄存器 PR 设置分频值,若使用周期中断可将比较值写入 OCR1,最后使能定时器并在 IRQ 中清除状态寄存器 SR 的中断标志。GPT 常用于高精度定时、时间戳采集或 PWM 输出,而 EPIT 更适合简单的周期性中断;两者都要经过 GIC 管理中断,GPT 有独立的 CNT(计数值)、OCRn(输出比较)和 ICRn(输入捕获)寄存器。

4.1使用GPT定时器进行高精度延时

选择自由运行模式和ipg时钟源:

编写并调用延迟函数:

可以发现led和蜂鸣器状态切换每间隔一秒进行一次

相关推荐
Groundwork Explorer13 小时前
W5500 网卡编程初始化与使用指南
python·单片机
智闲电子设计15 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
薛定猫AI16 小时前
【深度解析】多编程代理协同开发:用共享上下文构建 Claude Code 与 Codex 编排工作流
人工智能·gpt
ヾChen16 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub17 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤17 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀17 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎17 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Lee_jerome19 小时前
python神经网络编程入门(四十二)——GPT:自回归生成式预训练
gpt·生成式·decoder·topk·自回归·temperature·下一个词预测
Be for thing19 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习