EPIT 是周期性中断定时器,向下计数(即自减),会定期调用指定的中断服务函数,其实可以看做是一种IRQ的外设中断,对应的中断ID是88(=56+32)或者 89(=57+32)。
![]()
目录
一、定时器计数流程
定时器计数主要涉及到三个寄存器:
- count register:计数器启动以后,每隔一个时钟周期,自减1
- compare register:当 count register == compare register 时,触发中断,调用对应的中断服务函数
- load register:处理完中断服务函数以后,下一次开始自减的初始值是多少(有两种模式,分别对应着不同的初始值)
这里使用简单的 C 代码阐述一下这三个寄存器之间的关系
/*
* mode: 表示计数模式
* count register: 计数寄存器(每隔一个时钟周期,自减1)
* compare register: 比较寄存器(保存每次停止自减的临界值)
* load register: 加载寄存器。保存每次重新自减的初始值
*/
if(mode == 0) // 每次从 0xffff ffff 开始自减
count_register = 0xffffffff;
else // mode = 1,每次从 load register 开始自减
count_register = load_register;
// 假设每一次while循环都是一个时钟周期
while(1)
{
if(count_register == compare_register) // 停止计数
{
// 调用中断服务函数
// 重新开始计数
if(mode == 0) // 每次从 0xffff ffff 开始自减
count_register = 0xffffffff;
else // mode = 1,每次从 load register 开始自减
count_register = load_register;
}
else
count_register --;
}
二、寄存器解析
了解定时器的计数流程后,我们也大致知道了计数过程需要用到哪些寄存器,整个过程涉及到的寄存器如下:
- EPIT1_CR —— 配置 EPIT(选择时钟源、计数使能、比较使能等)
- EPIT1_LR —— 对应 load register
- EPIT1_CMPR —— 对应 compare register
- EPIT1_CNR —— 对应 count register
- EPT1_SR &

文章介绍了EPIT(周期性中断定时器)的工作原理,包括计数流程、涉及的主要寄存器如CR、LR、CMPR、CNR和SR的解析,并提供了初始化和中断服务函数的示例。此外,还提到了全局中断初始化、GIC的中断使能和中断服务函数的注册过程。
最低0.47元/天 解锁文章
1170

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



