9 - 中断:PIT定时中断

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 定时中断服务函数

中断处理函数

void PIT0_IRQHandler(void)
{
  PIT_Flag_Clear(PIT0);                 //清中断标志位
  // Do sth.
}

XS128

准确配置请参考 Chapter 12 Periodic Interrupt Timer, MC9S12XS256 Reference Manual

初始化

Block Diagram
initPIT()函数可以这样写。
1. 设置前,禁用PIT模块;
PITCFLMT

PITCFLMT_PITE=0;           //PIT模块禁止

2. 设置中断间隔;
两个计数器相连,对bus clock进行分频。
80MHz的Bus Clock串联一个80分频计数器和1000分频计数器,获得1ms的时间。
PITMUX
PITMTLD01

  PITMTLD0=80-1;             //80分频,在80MHzBusClock下,为1MHz,即1us.
  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;  

4. 使能PIT模块;

PITCFLMT_PITE=1;

中断处理

void interrupt 66 PIT0() 
{
    EnableInterrupts; //开启中断,保证能进入更高优先级的行场中断;
  //  DisableInterrupts;
    PITTF_PTF0 =1;//清中断标志位
  // Do sth.
}

Troubleshooting

1. 检查是否正确初始化:PIT通道号,中断间隔;
2. 检查PIT是否enable;
3. 确认中断处理函数有清中断标志的操作。