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

  • 相关阅读:
    细看运维85条军规,是否触动了你内心深处那根弦?
    SQL语句的CRUD
    sqlserver数据库类型对应Java中的数据类型
    Struts2文件上传--多文件上传(插件uploadify)
    web.xml文件详解
    关于Java的散列桶, 以及附上一个案例-重写map集合
    hibernate多表查询封装实体
    spring的7个模块
    Struts标签库详解【3】
    Struts标签库详解【2】
  • 原文地址:https://www.cnblogs.com/zhangxiaochn/p/12209867.html
Copyright © 2020-2023  润新知