简述逐飞 K60 定时器程序的使用
程序使用 K60 逐飞科技库
首先,定时器需要初始化以及定义时间(本文使用定时器 1 举例):
pit_init_ms(pit1, 1); // 设置定时器时间为 1ms
定时器时间过长,会造成程序运行后出现的效果非常迟钝。
定时器时间过短,可能会使定时器里的程序运行时间不够,从而造成溢出。
所以在时间方面需要细心拿捏。
设置定时器的优先级:
set_irq_priority(PIT1_IRQn, 0); // 设置优先级为 0
其中,0 优先级最高,其次是 1,以此类推。
设置完成后,就可以打开定时器,开始运行:
enable_irq(PIT1_IRQn); // 打开定时器 1
运行定时器时,需要注意定时器里的程序最好不要过多,尽可能不要有延时函数。
// 定时器 1
void PIT1_IRQHandler(void) {
// 用户程序
PIT_FlAG_CLR(pit1); // 定时器中断标志清除
}
这样就基本实现了定时器的初始化及运行。
当然我们也可以同时用两个甚至多个定时器,让它们同时运行。但是,定时器过多可能会出现一些问题。比如:
- 出现两个定时器同时满足进入的条件时,这时就会根据定时器优先级进行判断先进入哪个定时器服务程序里,高优先级的执行完毕才会进入低优先级定时器。
- 如果正在执行定时器服务程序(定时器 1)时,另一个定时器(定时器 2)触发,如果 2 优先级高于 1,那么会立即执行定时器 2 的服务程序,等定时器 2 执行完毕,才会继续执行定时器 1。相反的,如果定时器 2 优先级低于定时器 1,则等待定时器 1 执行完毕才会执行定时器 2。
也就是说,如果两个或者多个定时器同时满足运行条件,可能会造成低优先级中断里的程序没有机会运行,从而影响使用。所以,没有太大必要的情况下,不建议同时使用多个定时器。
那么,如果只用一个定时器,而又需要让程序在不同的时间下运行该怎么办呢?
如下给出一个可行的方案:
// 定时器 0,计时 1ms
void PIT0_IRQHandler(void) {
timeCount++; // 每运行一次中断,值 +1
if (timeCount % 1 == 0 ) { timeFlag_1ms = 1; } // 1ms 标志
if (timeCount % 2 == 0 ) { timeFlag_2ms = 1; } // 2ms 标志
if (timeCount % 5 == 0 ) { timeFlag_5ms = 1; } // 5ms 标志
if (timeCount % 10 == 0 ) { timeFlag_10ms = 1; } // 10ms 标志
if (timeCount % 20 == 0 ) { timeFlag_20ms = 1; } // 20ms 标志
if (timeCount % 50 == 0 ) { timeFlag_50ms = 1; } // 50ms 标志
if (timeCount % 200 == 0 ) { timeFlag_200ms = 1; timeCount = 0; } // 200ms 标志,并清除计时标志
if (timeFlag_1ms == 1) { timeFlag_1ms = 0; ... } // 每 1ms 运行一次程序
if (timeFlag_2ms == 1) { timeFlag_2ms = 0; ... } // 每 2ms 运行一次程序
if (timeFlag_5ms == 1) { timeFlag_5ms = 0; ... } // 每 5ms 运行一次程序
if (timeFlag_10ms == 1) { timeFlag_10ms = 0; ... } // 每 10ms 运行一次程序
if (timeFlag_20ms == 1) { timeFlag_20ms = 0; ... } // 每 20ms 运行一次程序
if (timeFlag_50ms == 1) { timeFlag_50ms = 0; ... } // 每 50ms 运行一次程序
if (timeFlag_200ms == 1) { timeFlag_200ms = 0; ... } // 每 200ms 运行一次程序
PIT_FlAG_CLR(pit0); // 定时器标志清除
}
如上,让定时器里的程序每 200ms 实现一次大循环。需要将每个程序的运行时间设置到位,便可以让各个程序在不同的时间下干扰尽量少的运行。