【裸机开发】GPT 定时器(三) —— 使用GPT实现高精度延时

文章介绍了如何利用GPT(GeneralPurposeTimer)进行精确的延时操作,包括GPT的初始化、无中断的延时函数`delayus`和`delayms`的实现,强调了在不同时钟频率和分频设置下的计数原理,以及如何处理计数器溢出的情况。

延时最简单粗暴的方式就是使用空循环来延时,依赖的是时钟主频(默认是396M)来计数,一旦修改了 6ull 的时钟主频,延时效果就会存在偏差。

因此我们可以使用 EPIT 或者 GPT 的计数功能实现高精度延时,EPIT 是向下计数(自减),GPT 是向上计数(自增)。


目录

一、GPT 初始化

二、延时函数delayus(us 级)

1、原理解析

2、具体实现

三、延时函数delayms(ms级)


一、GPT 初始化

和前面定时中断不一样,如果只是要实现延时功能的话,无需初始化中断,因为延时只用到了 GPT 的计数功能。

  • GPT 复位,并等待复位完成
  • 配置GPT定时器(设置计数器初始值、选择时钟源、选择工作模式)
  • 设置分频数(66 分频)
  • 启动定时器
/*
 * @description	: gpt 定时初始化(不会产生中断,只是单纯的计数)
 * @param 		: 定时器时间间隔
 * @return 		: 无
 */
void delay_init()
{
	// 禁用GPT定时器
    GPT1_CR = 0;
	GPT1_CR |= (1 << 15);
	while((GPT1_CR >> 15) & 0x01);		// 等待复位完成

	/* 
     * 配置GPT定时器
     * bit 1: 1 设置计数器初始值为0
     * bit 8-6: 001 选择时钟源ipg_clk
     * bit 9: 1 选择工作模式free-run
     */
    GPT1_CR |= ((1 << 1) | (1 << 6) | (1 << 9));

	// 分频
	GPT1_PR &= ~(0xFFF << 0);    // 低 12 bit 清零
	GPT1_PR |= (65 << 0);  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值