延时最简单粗暴的方式就是使用空循环来延时,依赖的是时钟主频(默认是396M)来计数,一旦修改了 6ull 的时钟主频,延时效果就会存在偏差。
因此我们可以使用 EPIT 或者 GPT 的计数功能实现高精度延时,EPIT 是向下计数(自减),GPT 是向上计数(自增)。
目录
一、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);

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

被折叠的 条评论
为什么被折叠?



