ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1046602 Топик полностью
POV_ (23.10.2020 19:43, просмотров: 24) ответил Peter_M на Подскажите как сейчас правильно организовать в микроконтроллере программные таймеры?
Ответов много и все верный.. ну как же моих трех копеек ))... 

#include "events.h"

static TTMyEvent t2_events[MAX_EVENT] = {
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE },
    { DISABLE, 0, NULL, DISABLE }
};

static int pause = DISABLE;

void event_Disable(void* event)
{
    pause = ENABLE;

    if (event == EVENT_ALL)
    {
        for (int i = 0; i < MAX_EVENT; i++)
            t2_events[i].enabled = DISABLE;
    }
    else
    {
        for (int i = 0; i < MAX_EVENT; i++)
            if (t2_events[i].event == event)
            {
                t2_events[i].enabled = DISABLE;
                t2_events[i].event = NULL;
                break;
            }
    }

    pause = DISABLE;
}

void event_Init(void* event, uint32_t ms)
{
    event_Disable(event);

    for (int i = 0; i < MAX_EVENT; i++)
        if (t2_events[i].event == NULL)
        {
            t2_events[i].event = event;
            t2_events[i].ms = ms;
            t2_events[i].cycle = 0;
            t2_events[i].enabled = ENABLE;
            break;
        }
}

void event_InitCycle(void* event, uint32_t cycle)
{
    event_Disable(event);

    for (int i = 0; i < MAX_EVENT; i++)
        if (t2_events[i].event == NULL)
        {
            t2_events[i].event = event;
            t2_events[i].ms = cycle;
            t2_events[i].cycle = cycle;
            t2_events[i].enabled = ENABLE;
            break;
        }
}

void TIM2_IRQHandler(void)
{
    if (pause == DISABLE)
        for (int i = 0; i < MAX_EVENT; i++)
            if (t2_events[i].enabled == ENABLE)
            {
                if (--t2_events[i].ms == 0)
                {
                    if (t2_events[i].cycle)
                        t2_events[i].ms = t2_events[i].cycle;
                    else
                        t2_events[i].enabled = DISABLE;

                    if (t2_events[i].event != NULL)
                        ((TFunc)t2_events[i].event)();
                }
            }

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    __ASM("nop");
    __ASM("nop");
}






#ifndef EVENTS_H
#define EVENTS_H

#include "common.h"

#define MAX_EVENT 10

typedef void (*TFunc)();

typedef struct
{
    uint32_t enabled;
    uint32_t ms;
    void* event;
    uint8_t cycle;
} TTMyEvent;

#define EVENT_ALL NULL

void event_Disable(void* event);
void event_Init(void* event, uint32_t ms);
void event_InitCycle(void* event, uint32_t cycle);

#endif // EVENTS_H