中级会员
- 积分
- 254
- 金钱
- 254
- 注册时间
- 2020-3-22
- 在线时间
- 35 小时
|
6金钱
本帖最后由 YOKI 于 2020-5-24 23:20 编辑
在学习了EPIT 和 GPT定时器后我想写一个自己的 精确延时程序,
视频里用的是GPT1定时器实现的,GPT定时器有输入捕获功能,用来做长期运行的定时器太浪费
因为考虑到EPIT定时器是向下计数的定时器,功能更纯粹,所以选择使用 EPIT2 定时器来实现,
另外也想检验一下自己的学习效果。
/**********************************************
函数功能:延时1ms 使用 EPIT2定时器,但不采取中断模式
采取 查询中断标志位 EPIT2->SR 的 方式
查询 EPIT2定时器是否计时结束
**********************************************/
void delay_epit_1mS(void)
{ unsigned int time_count;
EPIT2->CR = 0; /* 先清零CR寄存器 */
EPIT2->CR |= (1 << 1) | //写 1 EPIT2从装载值开始计数
(1 << 2) | //写 1 比较中断使能
(1 << 3) | //写 1 set and forget模式
(65 << 4)| //写分频值 66 分频 1Mhz
(01 << 24); //写 01 时钟选择 IPG_CLK
EPIT2->LR = (1000000/10000); //写重装载值 100uS
EPIT2->CMPR = 0x00000000; //比较值为0 即倒计数到 0 发生中断
EPIT2->CR |= (1 << 0); // EPIT2 使能
for(time_count = 10; (EPIT2->SR & (1<<0)) && (time_count > 0);time_count--)
{
EPIT2->SR |= (1<<0); // 写EPIT2_SR 写1清零 清除中断标志位
}
while(!(time_count>0)) //
{
EPIT2->CR &= ~(1<<0); // EPIT1 关闭
EPIT2->CR |= (00 << 24); // EPIT1 时钟关闭
}
}
但是将以上函数在延时函数中调用时虽然可以执行但计时时间却远远小于定时器设定的时间。求大神解答
|
|