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

深入解析:嵌入式硬件——基于IMX6ULL的GPT(通用定时器)实现

GPT(通用定时器)部分实现步骤

        GPT(General Purpose Timer)是 I.MX6ULL 芯片的通用定时器外设,核心用于实现高精度延时(us 级 /ms 级),其本质是 32 位向上计数器,支持多种时钟源和运行模式。

一、GPT 核心原理认知(实现基础)

在开始代码实现前,需明确 GPT 的核心特性与关键参数,确保配置符合需求:
计数模式:32 位向上计数(从 0x00000000 递增至 0xFFFFFFFF,溢出后回滚到 0);
时钟源选择:支持ipg_clk(66MHz,默认使用)、ipg_clk_32k、ipg_clk_highfreq等,本次选择ipg_clk;
分频器:12 位可编程分频(0~4095 对应 1~4096 分频),需配置为66 分频(66MHz / 66 = 1MHz),使计数器每计数 1 次对应 1us,简化延时计算;
运行模式:选择free-run 模式(计数器溢出后从 0 重新计数,不依赖比较寄存器复位,适合持续延时);
关键寄存器:
GPTx_CR:控制寄存器(复位、时钟源、运行模式、使能);
GPTx_PR:分频寄存器(设置分频值);
GPTx_CNT:计数寄存器(读取当前计数值,用于延时判断)。

二、GPT 初始化配置(核心步骤)

初始化的目标是将 GPT 配置为 1MHz 计数频率的自由运行模式,具体步骤如下:

步骤 1:关闭 GPT 并复位
目的:确保初始化前 GPT 处于默认状态,避免残留配置影响;
寄存器操作:
清零GPT1->CR(控制寄存器),关闭 GPT 并清除所有配置;
置位GPT1->CR的SWR位(bit15),触发软件复位;
等待复位完成:循环判断GPT1->CR的SWR位是否清零(复位完成后硬件自动清 0)。

代码示例:

GPT1->CR = 0;                  // 关闭GPT,清除所有配置
GPT1->CR |= (1 << 15);         // 置位SWR,触发软件复位
while((GPT1->CR & (1 << 15)) != 0);  // 等待复位完成(SWR位自动清0)

步骤 2:配置运行模式与时钟源
目的:选择free-run模式和ipg_clk时钟源,确保计数器持续自由计数;
寄存器操作:
置位GPT1->CR的FRR位(bit9):选择 free-run 模式(计数器溢出后从 0 重新计数);
置位GPT1->CR的CLKSRC位(bit6):选择ipg_clk为时钟源(CLKSRC=0b001,对应 66MHz)。

代码示例:

GPT1->CR |= ((1 << 9) | (1 << 6));  // FRR=1(free-run),CLKSRC=1(ipg_clk)

步骤 3:配置分频器(实现 1MHz 计数频率)
目的:将 66MHz 的ipg_clk分频为 1MHz,使计数器每计数 1 次对应 1us,简化延时计算;
寄存器操作:
GPT1->PR(分频寄存器):12 位分频值,配置为65(对应 66 分频,66MHz / 66 = 1MHz);
分频值计算:分频值 = 目标分频系数 - 1(如 66 分频需设置为 65)。

代码示例:

GPT1->PR = 65;  // 66分频,66MHz / 66 = 1MHz(1us/计数)

步骤 4:使能 GPT
目的:启动 GPT 计数器,开始向上计数;
寄存器操作:置位GPT1->CR的EN位(bit0),使能 GPT。

代码示例:

GPT1->CR |= (1 << 0);  // 使能GPT,计数器开始工作

初始化函数完整封装
将上述步骤封装为init_gpt1函数,供主程序调用:

#include "gpt.h"
#include "MCIMX6Y2.h"
void init_gpt1(void)
{// 步骤1:关闭GPT并软件复位GPT1->CR = 0;GPT1->CR |= (1 << 15);                // 触发复位while((GPT1->CR & (1 << 15)) != 0);    // 等待复位完成// 步骤2:配置运行模式(free-run)和时钟源(ipg_clk)GPT1->CR |= ((1 << 9) | (1 << 6));// 步骤3:配置分频器(66分频,1MHz计数频率)GPT1->PR = 65;// 步骤4:使能GPTGPT1->CR |= (1 << 0);
}

三、基于 GPT 的高精度延时函数实现

GPT 初始化完成后,计数器以 1MHz 频率计数(1us / 次),可通过读取GPT1->CNT(当前计数值)实现 us 级和 ms 级延时(对应代码:delay.c的delayus和delayms函数)。

us 级延时(delayus)
核心逻辑:
记录延时开始时的初始计数值(old_counter);
循环读取当前计数值(new_counter),计算计数差值(需处理计数器溢出:new_counter < old_counter时,差值为0xFFFFFFFF - old_counter + new_counter);
累加计数差值,当累加值≥目标延时 us 数时,退出循环。

代码实现:

#include "delay.h"
#include "MCIMX6Y2.h"
void delayus(unsigned int n)  // n:目标延时微秒数
{unsigned int counter = 0;        // 累加的总计数(对应总延时us)unsigned int old_counter, new_counter;old_counter = GPT1->CNT;        // 记录初始计数值while (1){new_counter = GPT1->CNT;    // 读取当前计数值if (new_counter != old_counter)  // 计数值变化时计算差值{if (new_counter > old_counter){// 无溢出:差值 = 新值 - 旧值counter += new_counter - old_counter;}else{// 有溢出:差值 = 0xFFFFFFFF - 旧值 + 新值counter += 0xFFFFFFFF - old_counter + new_counter;}// 累加计数≥目标延时,退出if (counter >= n){break;}old_counter = new_counter;  // 更新旧值,准备下一次计算}}
}

ms 级延时(delayms)
核心逻辑:
基于delayus实现,1ms = 1000us,循环调用delayus(1000)即可。

代码实现:

void delayms(unsigned int n)  // n:目标延时毫秒数
{while (n--){delayus(1000);  // 每次延时1000us(1ms)}
}

四、GPT 的使用与验证

在主程序中,需先初始化 GPT,再调用延时函数,确保延时精度。

典型使用流程
初始化系统时钟(init_clock):确保ipg_clk为 66MHz(GPT 时钟源依赖);
初始化 GPT(init_gpt1):完成上述配置;
调用延时函数(delayus/delayms)实现高精度延时。

代码示例(参考main.c):

#include "led.h"
#include "beep.h"
#include "MCIMX6Y2.h"
#include "key.h"
#include "interrupt.h"
#include "clock.h"
#include "epit.h"
#include "gpt.h"
#include "delay.h"
int main(void)
{init_clock();        // 初始化系统时钟(确保ipg_clk=66MHz)system_interrupt_init();  // 中断初始化(非GPT必需,按需添加)init_beep();         // 蜂鸣器初始化init_led();          // LED初始化init_gpt1();         // GPT初始化(关键:启动1MHz计数器)while(1){led_nor();       // LED状态翻转beep_nor();      // 蜂鸣器状态翻转delayms(1000);   // GPT实现1000ms(1秒)延时}return 0;
}

五、关键注意事项

时钟源依赖:GPT 的ipg_clk来自系统时钟,需先通过init_clock配置系统时钟(确保ipg_clk=66MHz),否则分频后频率异常,导致延时不准;
溢出处理:delayus必须处理计数器溢出(new_counter < old_counter),否则当GPT1->CNT从 0xFFFFFFFF 回滚到 0 时,会导致延时计算错误;
分频值计算:若需调整计数频率,需重新计算GPT1->PR(如需 2MHz 频率,分频值 = 66/2 -1=32),但需确保分频后频率与延时函数的时间换算匹配(如 2MHz 对应 0.5us / 计数,需修改delayus的计数累加逻辑)。

http://www.gsyq.cn/news/35901.html

相关文章:

  • 2025年10月教育资源好的学习机品牌推荐:实力榜全面评测
  • 2025年10月适合初中生的学习机品牌推荐:口碑榜全维度对比指南
  • 2025小型防撞与桥梁护栏企业推荐榜:聚焦实用适配的优质之选,道路防撞与桥梁护栏,桥面防撞与桥梁护栏厂家
  • nginx和微服务中网关
  • 2025 年珠海装修公司最新推荐榜,聚焦企业技术实力、服务品质与市场口碑深度解析珠海豪宅/珠海品质/珠海口碑好的/珠海大宅/珠海设计工作室推荐
  • 使用 curl 发送 POST 请求
  • 2025 年云梯车厂家最新推荐榜,技术实力与市场口碑深度解析,助力企业精准采购高空云梯车,蓝牌云梯车,拖挂式云梯车厂家推荐
  • 2025年10月防脱生发产品评价榜:国货与进口实测数据横向对比
  • 动画演示编辑距离
  • 这是一篇随笔
  • 2025 年汽车升降机,移动式升降机,提升机,登车桥厂最新推荐排行榜:技术实力与市场口碑深度解析
  • 为什么别人用 DevPod 秒启 DeepSeek-OCR,你还在装环境?
  • 2025年济南小型画室培训机构推荐精选榜单,美术生择校参考,济南画室培训机构,画室机构厂家推荐
  • 性能优化:两条SQL索引优化,CPU占用率从40%降至25%
  • 2025 科技馆运维厂家企业推荐榜:专业力量守护科普阵地,博物馆运营,民防馆运营,展馆维保厂家推荐
  • 2025实用主板板卡厂家推荐榜:聚焦中小规模优质供应商,工控主板板卡,核心板主板板卡厂家推荐
  • 2025年武汉小型车出租厂家服务商推荐榜单,实用出行参考,防撞车出租,高空车出租,登高车出租厂家推荐
  • leetcode274. H 指数
  • 2025年BAB筑垒建设公司权威深度解析:北京写字楼装修业测评与未来趋势揭秘
  • 2025 年最新推荐:货梯源头厂家排行榜 防爆 / 升降 / 仓库 / 载货电梯靠谱品牌精选
  • 边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
  • Pinely Round 5 (Div.1 + Div.2)
  • 【新特性】 版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年10月发布)
  • 2025年10月绩效管理咨询公司推荐:实力榜评价
  • 使用JMH对远程接口进行压测
  • Playwright与Selenium的对比
  • MLGO微算法科技发布多用户协同推理批处理优化系统,重构AI推理服务效率与能耗新标准
  • 2025 年 HDPE 土工膜,聚乙烯土工膜,糙面土工膜厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025年乌鲁木齐黄金回收权威推荐榜单:黄金上门回收/黄金首饰回收/黄金首饰加工服务商精选
  • The lifelong path of human