IMX6ULL--EPIT,GPT

1、什么是PLL,Prescaler、PFD,它们各自有什么作用?

PLL:(phase-locked loop),锁相环电路,倍频:a*n

Prescaler:预分频器,分频:a/n

PFD:(Phase-Frequency Detector),相位分数分频器,倍频/分频 a*m/n

2、IMX6ULL中有几个PLL?几个PFD?

/18.5.1.3

PLL1 - ARM PLL (typical functional frequency )

PLL2 - System PLL (functional frequency 528 MHz)

PLL3 - USB1 PLL (functional frequency 480 MHz)

PLL4 - Audio PLL

PLL5 - Video PLL

PLL6 - ENET PLL

PLL7 - USB2 PLL (functional frequency 480 MHz)

/18.5.1.4 和 18.7.15-18.7.16 明确,仅 System_PLL(528MHz)和 USB PLLs(480MHz)配备 PFD,每个 PLL 对应 4 个独立 PFD,总计 8 个 PFD

3、简述ARM和PLL的配置流程

ARM->1056M//手册

CCM->CCSR &= ~(1 << 8);//第八位STEP_SEL设为0,0derive clock from osc_clk (24M) - source for Ip_apm

CCM->CCSR |= (1 << 2);

CCM->CACRR &= ~(7 << 0);

CCM->CACRR |= (1 << 0);

// PLL1(ARM PLL)

unsigned int t;

t = CCM_ANALOG->PLL_ARM;

t &= ~(3 << 14);

t |= (1 << 13);

t &= ~(0x7F << 0);

t |= (88 << 0);

CCM_ANALOG->PLL_ARM = t;

CCM->CCSR &= ~(1 << 2);

4、IMX6ULL中的EPIT和GPT的工作原理是什么?

EPIT:32 位向下递减计数器,支持从 "加载值(LR 寄存器)" 开始递减,计数至 0 时触发中断或复位。

//选择PERCLK_CLK(高频率参考时钟,通常为 66MHz)

t = EPIT1->CR;

t &= ~(3 << 24); // 清除原有时钟源配置

t |= (1 << 24); // 配置时钟源为PERCLK_CLK

//使能自动重载,对应 EPIT 的 "Set-and-Forget 模式"(手册 1-1026),实现周期性循环定时,无需软件重复配置。

t |= (1 << 17); // 使能自动重载(AR位=1)

//分频系数设为 65,即实际计数时钟 = PERCLK_CLK / (65+1) = 66MHz / 66 = 1MHz;

//结合 LR 值1000*1000,可计算定时周期 = LR 值 / 计数时钟频率 = 1e6 / 1e6 = 1 秒,即每 1 秒触发一次中断。

t &= ~(0xFFF << 4); // 清除原有分频配置

t |= (65 << 4); // 配置分频系数为65

//使能比较中断、计数器复位与调试暂停功能,最终使能定时器,启动计数。

t |= (1 << 3); // 使能比较中断(OCI_EN位=1)

t |= (1 << 2); // 使能计数器复位(RST位=1,初始化计数器)

t |= (1 << 1); // 使能计数器暂停控制(DBG_EN位=1,调试时暂停)

// 后续代码:使能定时器(CR[0]位=1)完成中断的 "硬件使能 - 优先级配置 - 处理函数绑定",确保 EPIT 触发比较事件时,CPU 能响应并执行epit_irq_handler。

EPIT1->CR |= (1 << 0); // 使能定时器(EN位=1)

GIC_EnableIRQ(EPIT1_IRQn); // 1. 使能EPIT1中断请求(GIC层)

GIC_SetPriority(EPIT1_IRQn, 0); // 2. 设置中断优先级为最高(0级)

system_interrupt_register(EPIT1_IRQn, epit_irq_handler); // 3. 注册中断处理函数

if((EPIT1->SR & (1 << 0)) != 0) // 检测OCIF标志(比较事件标志)

{

led_nor(); // LED翻转,实现1秒反转

EPIT1->SR |= (1 << 0); // 清除OCIF标志(写1清除)

}

GPT:GPT 的核心定位是提供灵活的定时、输入捕获、输出比较功能,支持更复杂的时间测量与信号生成场景(如脉冲宽度测量、PWM 信号输出、外部事件计时等),其工作原理围绕 "向上计数 + 多通道功能扩展" 展开

void reset_gpt1(void)

{

GPT1->CR |= (1 << 15);

while ((GPT1->CR & (1 << 15)) != 0);

}

void gpt1_init(void)

{

reset_gpt1();

unsigned int t;

//初始化前清除无关功能的配置位,避免残留配置影响 GPT 的基础定时功能。

t = GPT1->CR;

t &= ~(7 << 26); // 清除"外部时钟滤波配置位"(CR[28:26])

t &= ~(3 << 18); // 清除"捕获触发模式配置位"(CR[19:18])

//使能 "自由运行模式"(CR 寄存器 [9] 位)

//FRR=1 时,GPT 工作在自由运行模式:计数器从 0 开始向上递增,计数至0xFFFFFFFF(32 位最大值)后自动复位为 0,循环计数;FRR=0 时为 "模值模式"(计数至 PR 寄存器定义的模值后复位)

t |= (1 << 9); // 使能自由运行模式(CR[9] = FRR = 1)

//GPTx_CR寄存器 [8:6] 位为 "时钟源选择位(CLKSRC)",支持 8 种时钟源,其中001对应 "IPG_CLK"(系统外设总线时钟,默认频率为 22MHz,

t &= ~(7 << 6); // 清除原有时钟源配置(CR[8:6])

t |= (1 << 6); // 选择时钟源为IPG_CLK(CR[8:6] = 001)

//禁用 "调试暂停"(CR 寄存器 [1] 位)GPTx_CR寄存器 [1] 位为 "调试暂停使能位(DBG_EN)",DBG_EN=1 时,当 CPU 进入调试模式(如 JTAG 暂停),GPT 计数器自动暂停;DBG_EN=0 时,调试期间计数器继续计数

t &= ~(1 << 1);

GPT1->CR = t;

// 配置预分频系数(PR 寄存器 [11:0] 位)

GPT1->PR &= ~(0XFFF << 0); // 清除原有分频配置(PR[11:0])

GPT1->PR |= (65 << 0); // 配置分频系数为65(PR = 65)

//GPTx_CR寄存器 [0] 位为 "计数器使能位(EN)",EN=1 时,GPT 计数器开始向上递增;EN=0 时计数器暂停

GPT1->CR |= (1 << 0);

}

void delay_us(unsigned int us)

{

unsigned int counter = 0; // 累计的"计数时钟周期数"

unsigned int old_counter = 0; // 上一次读取的CNT值

unsigned int new_counter = 0; // 当前读取的CNT值

old_counter = GPT1->CNT; // 1. 记录初始CNT值

while (1)

{

new_counter = GPT1->CNT; // 2. 读取当前CNT值

if(new_counter != old_counter) // 3. 若CNT值变化(计数未停滞)

{

// 4. 计算两次读取的CNT差值(处理溢出情况)

if(old_counter < new_counter)

counter += new_counter - old_counter; // 无溢出:直接加差值

else

counter += 0xFFFFFFFF - old_counter + new_counter; // 溢出:加"最大值-旧值+新值"

// 5. 若累计周期数达到"目标延时对应的周期数",退出循环

if(counter >= us * (22000000 / 66)) // 注:此处需补充"计数周期→微秒"的转换(代码原逻辑隐含该关系)

return;

old_counter = new_counter; // 6. 更新旧CNT值,进入下一轮判断

}

}

}

void delay_ms(unsigned int ms)

{

while(ms--)

{

delay_us(1000);

}

}

相关推荐
沐欣工作室_lvyiyi3 小时前
基于物联网的智能衣柜系统的设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计·智能衣柜
sheepwjl4 小时前
《嵌入式驱动(二):驱动开发基本概念》
arm开发·驱动开发·单片机·嵌入式硬件·imx6ull·驱动·裸机
来自嵌入式的zyz5 小时前
STM32学习-UART串口通信:物理层/协议层/UART基本架构/代码实战
stm32·嵌入式硬件·学习
La Pulga5 小时前
【STM32】USART串口(上)
c语言·stm32·单片机·嵌入式硬件·mcu
茯苓gao5 小时前
STM32G4 电流环闭环(二) 霍尔有感运行
笔记·stm32·单片机·嵌入式硬件·学习
涂山苏苏⁠6 小时前
STM32软件I2C读写AT24C64
stm32·单片机·at24c64
京雨6 小时前
关于RISC-V 中断处理的分析
单片机·嵌入式硬件·risc-v
cellurw6 小时前
Day51 时钟系统与定时器(EPIT/GPT)
单片机·嵌入式硬件·gpt
lingzhilab6 小时前
零知IDE——基于STM32F407VET6和MCP2515实现CAN通信与数据采集
stm32·单片机·嵌入式硬件