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

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);
}
}

http://www.dtcms.com/a/405986.html

相关文章:

  • 前端经验:完美的圆角
  • Vue3组件通信的方法有哪些?
  • 学习嵌入式的第四十一天——ARM——时钟与定时器
  • 淮安网站建设优化北京h5网站建设报价
  • Qt 网络编程
  • ORBSLAM3-优化函数整理
  • 计算机视觉:安防智能体的实现与应用基于YOLOv8的实时无人机检测与跟踪
  • 【apifox】安装要点
  • 网站图片一般的像素企业网站需要多大空间
  • 做网站需要给设计提供专业的商城网站开发
  • 《Spring MVC奇幻漂流记:当Java遇上Web的奇妙冒险》
  • 前端性能优化,给录音播放的列表加个播放按键,点击之后再播放录音。减少页面的渲染录音文件数量过多导致加载缓慢
  • uniapp中封装底部跳转方法
  • Kafka-保证消息消费的顺序性及高可用机制
  • 通过kafka-connect 实现debezium数据监听采集
  • GTSAM 中自定义因子(Custom Factor)的详解和实战示例
  • 要建一个网站怎么做老板合作网站开发
  • 【Linux基础知识系列:第一百三十九篇】使用Bash编写函数提升脚本功能
  • 【MyBatis-Plus 动态数据源的默认行为】
  • GaussDB 和 openGauss 怎么区分?
  • 云服务器里的IP是什么意思,他们之间有什么关系?
  • @Transactional 事务注解
  • PaddleLabel百度飞桨Al Studio图像标注平台安装和使用指南(包冲突 using the ‘flask‘ extra、眼底医疗分割数据集演示)
  • 锦州网站建设工作如何快速网络推广
  • 科技网站建设公司wordpress必做
  • Webpack5 第二节
  • npm、pnpm、npx 三者的定位、核心差异和「什么时候该用谁」
  • 在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
  • AWS Quicksight实践:从零到可视化分析
  • 微服务注册中心 Spring Cloud Eureka是什么?