PIT是个非常准的定时中断(相比delay函数来说),说好的1ms触发一次中断就是1ms触发一次。
PIT是平衡直立车的灵魂,因为角度计算,速度计算,和方向控制都高度依赖于积分,而积分的“单位时间”5ms靠的就是PIT中断。
PIT中断的配置也很简单。设置好中断时间间隔(这里是1ms),写好中断处理函数,就可以啦。
要注意的是,中断处理函数要尽可能简单,把复杂的工作留给主循环。
K60
这里用野火的底层库,详情请参考《三天入门 Cortex-M4——Kinetis 系列》PIT 定时中断模块。
初始化
函数原型
void pit_init(PITn,u32 cnt);
调用示例
pit_init(PIT0,100000); //初始化 PIT0,定时 100000 个时钟周期
中断处理
中断重定向
#undef VECTOR_084
#define VECTOR_084 PIT0_IRQHandler //重新定义 84 号中断为 PIT0_IRQHandler 中断
extern void PIT0_IRQHandler(); //PIT0 定时中断服务函数
#define VECTOR_084 PIT0_IRQHandler //重新定义 84 号中断为 PIT0_IRQHandler 中断
extern void PIT0_IRQHandler(); //PIT0 定时中断服务函数
中断处理函数
void PIT0_IRQHandler(void)
{
PIT_Flag_Clear(PIT0); //清中断标志位
// Do sth.
}
{
PIT_Flag_Clear(PIT0); //清中断标志位
// Do sth.
}
XS128
准确配置请参考 Chapter 12 Periodic Interrupt Timer, MC9S12XS256 Reference Manual
初始化
initPIT()函数可以这样写。
1. 设置前,禁用PIT模块;
PITCFLMT_PITE=0; //PIT模块禁止
2. 设置中断间隔;
两个计数器相连,对bus clock进行分频。
80MHz的Bus Clock串联一个80分频计数器和1000分频计数器,获得1ms的时间。
PITMTLD0=80-1; //80分频,在80MHzBusClock下,为1MHz,即1us.
PITLD0=1000 - 1; //定时1000*0.001ms = 1ms.
PITMUX_PMUX0=0; //通道0与微计时器0相连
PITLD0=1000 - 1; //定时1000*0.001ms = 1ms.
PITMUX_PMUX0=0; //通道0与微计时器0相连
3. 使能PIT通道;
PITINTE_PINTE0=1; //通道0中断使能
PITINTE_PINTE1=0;
PITINTE_PINTE2=0;
PITINTE_PINTE3=0;
PITINTE_PINTE1=0;
PITINTE_PINTE2=0;
PITINTE_PINTE3=0;
4. 使能PIT模块;
PITCFLMT_PITE=1;
中断处理
void interrupt 66 PIT0()
{
EnableInterrupts; //开启中断,保证能进入更高优先级的行场中断;
// DisableInterrupts;
PITTF_PTF0 =1;//清中断标志位
// Do sth.
}
{
EnableInterrupts; //开启中断,保证能进入更高优先级的行场中断;
// DisableInterrupts;
PITTF_PTF0 =1;//清中断标志位
// Do sth.
}
Troubleshooting
1. 检查是否正确初始化:PIT通道号,中断间隔;
2. 检查PIT是否enable;
3. 确认中断处理函数有清中断标志的操作。