Loading

简述逐飞 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. 如果正在执行定时器服务程序(定时器 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 实现一次大循环。需要将每个程序的运行时间设置到位,便可以让各个程序在不同的时间下干扰尽量少的运行。

posted @ 2020-01-18 18:43  滑稽果  阅读(729)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end