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和蜂鸣器状态切换每间隔一秒进行一次

相关推荐
抓虾爪1 小时前
STM32F407VGT6一站式配齐丨粤科源兴ST分销商,同系列F4/F7/H7均可配套
stm32·单片机·嵌入式硬件
foundbug9991 小时前
STM32 简单语音识别实现方案(开灯关灯拨打电话)
stm32·嵌入式硬件·语音识别
项目題供诗2 小时前
STM32-输入捕获模式测频率&PWMI模式测频率占空比(十五)
stm32·单片机·嵌入式硬件
济6172 小时前
ROS开发专栏---基于图像视觉的目标追踪实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
济6172 小时前
ROS开发专栏---视觉图像数据的获取实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
qxq_sunshine2 小时前
千问(Qwen)模型Linux部署操作手册
人工智能·gpt·语言模型
俊基科技2 小时前
矿用对讲降噪改造实战|A-68 语音模块解决井下高噪回音、啸叫难题
嵌入式硬件·语音识别·ai降噪·回声消除·矿用通信·语音 dsp
Hall_IC3 小时前
STM32F407VGT6产线急需?粤科源兴现货库存随时调拨,保障交期不延误
stm32·单片机·嵌入式硬件
Wxinxiaozhang3 小时前
GD32L235 更换外部晶振(8M → 16M)导致 MCU 无法启动的原因分析与解决方法
单片机·嵌入式硬件