Туториал Использование HAL GPT драйвера

Тема в разделе "ChibiOS/RTOS", создана пользователем radioengineer, 18 июл 2015.

  1. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.592
    Симпатии:
    357
    Адрес:
    Алматы
    GPT (General Purpose Timer) модуль предоставляет в приложении некоторые функции таймеров, которые не могут быть использованы другими способами. Модуль может вызывать функцию callback по истечению какого-либо временного интервала, причем может это делать в режиме Continuous, т.е. периодически, либо в режиме OneShot, т.е. один раз. Также имеется функция простых задержек на очень короткие интервалы времени, менее 1мс.
    Для того, чтобы заставить GPT работать необходимо задать небольшое количество параметров.
    В первую очередь в halconf.h параметр HAL_USE_GPT выставляем в TRUE. В файле mcuconf.h включаем соответствующий таймер для GPT, например, мы хотим запустить GPT драйвер на Timer 2:
    Код:
    #define STM32_GPT_USE_TIM2                  TRUE
    Хорошо, теперь вернемся непосредственно к параметрам самого модуля.

    Timer Clock

    Этот параметр определяет разрешение таймера. Это разрешение будет обратной величиной Timer Clock. Параметр этот должен быть типа integer, например, для STM32F4 число 203143 не будет работать, потому что 168000000/203143 = 827,003638 а это уже float.

    Trigger Period

    Это собственно то значение, по которому и будет происходить тикание вашего таймера и оно зависит от частоты тактирования таймера, т.е. интервал времени одного тика таймера. Например, если вы задали в Timer Clock 1 000 000Hz и количество тиков 84840, то 1us * 84840 = 8.484ms - это то время, через промежутки которого ваш таймер будет вызывать callback функцию.

    Callback function

    Тут все просто это функция, которая вызывается, когда таймер отсчитал заданный промежуток времени. Параметр опционален и может не задаваться, для это можно просто задать его в NULL.

    Пример конфигурации

    Для того, чтобы присвоить параметры, описанные выше, необходимо заполнить одну структуру GPTConfig. В ней как раз задается Timer Clock и Callback function:
    PHP:
    /*
    * Приведем пример все для того же Timer2.
    * GPT2 config
    */
    static GPTConfig gpt2cfg =
    {
      
    200000,      // Timer clock
      
    gpt2cb        // Callback function
    };
    Тут нужно обязательно упомянуть, что если используется функция callback, то длительность ее выполнения должна быть меньше, чем период таймера. Ниже представим простую функцию, которая функциями palSetPad() и palClearPad() поможет оценить длительность исполнения кода:
    PHP:
    /*
    * GPT2  callback.
    */
    static void gpt2cb(GPTDriver *gptp)
    {
        
    palSetPad(GPIODGPIOD_LED3);

        
    // Здесь ваш код, который должен быть выполнен за промежуток времени меньше периода таймера

        
    palClearPad(GPIODGPIOD_LED3);
      }
    После того как все параметры настроены остается лишь запустить таймер и указать период в тиках таймера. Функция gptStart() конфигурирует GPT, но не запускает его. Для запуска есть две функции:
    gptStartContinuous() -- вызывает callback функцию периодически
    gptStartOneShot() -- вызывает callback функцию один раз
    gptPolledDelay() -- не вызывает колбэков, но формирует очень короткие задержки, функция ест процессорное время и работает не понятно пока для меня как, осторожно с ней.
    PHP:
    // Настраиваем таймер
    gptStart(&GPTD2,&gpt2cfg);

    // Запускаем таймер на 25 тиков за период
    // Timer clock равен 200,000Hz, значит один тик равен 5us, следовательно 200,000 / 25 = 8,000Hz, значит период срабатывания таймера равен 125us
    gptStartContinuous(&GPTD2,25);
    На этом все. Здесь есть пример использования gptPolledDelay() но пока до конца не разобрался во всех аспектах работы этой функции.
     
    : gpt, chibios, hal, timer, clock

Поделиться этой страницей