STM32F4. Урок 10 — Программные таймер и счетчик

Эта библиотека использует системный таймер, который отсчитывает по 1мкс(или 1мс) и обрабатывает прерывание. Данная библиотека позволяет реализовать различные паузы (в микросекундах, миллисекундах и секундах). Библиотека позволяет запускать и опрашивать циклически два программных таймера(теоретически может быть запущенно любое количество таймеров). Программные счетчики позволяют измерять промежутки времени. Счетчик запускается с 0 отметки и может быть запрошен в некоторой точке, получив пройденное время (в микросекундах, миллисекундах и секундах).

Требования:

   Подключаемые модули CooCox-IDE: отсутствуют.
   Поддерживаемые библиотеки: отсутствуют.

Перечисления:

 typedef enum {     TIMER_STOP =0,  // Таймер остановлен и сброшен     TIMER_START_us, // Таймер запущен в режиме микросекунд     TIMER_START_ms, // Timer запущен в режиме миллисекунд     TIMER_START_s,  // Timer запущен в режиме секунд     TIMER_CHECK     // Проверка окончания работы таймера }TIMER_STATUS_t;  typedef enum {   TIMER_HOLD =0,  // Таймер закончил работу   TIMER_RUN       // Таймер работает }TIMER_CHECK_t;  typedef enum {     COUNTER_STOP =0,  // Счетчик остановлен     COUNTER_START_us, // Счетчик запущен в режиме микросекунд     COUNTER_START_ms, // Счетчик запущен в режиме миллисекунд     COUNTER_START_s,  // Счетчик запущен в режиме секунд     COUNTER_CHECK     // Проверка, сколько времени прошло }COUNTER_STATUS_t;
 

Функции:

 void UB_Systick_Init(void);                                            // инициализация системного таймера void UB_Systick_Pause_us(__IO uint32_t pause);                         // прерывание на X мкс void UB_Systick_Pause_ms(__IO uint32_t pause);                         // прерывание на X мс void UB_Systick_Pause_s(__IO uint32_t pause);                          // прерывание на X с TIMER_CHECK_t UB_Systick_Timer1(TIMER_STATUS_t status, uint32_t wert); // Получение данных от Timer1 TIMER_CHECK_t UB_Systick_Timer2(TIMER_STATUS_t status, uint32_t wert); // Получение данных от Timer2 uint32_t UB_Systick_Counter1(COUNTER_STATUS_t status);                 // Получение данных от Counter1 uint32_t UB_Systick_Counter2(COUNTER_STATUS_t status);                 // Получение данных от Counter2
 

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 22.02.2013 // Version  : 1.0 // Autor    : UB // EMail    : mc-4u(@)t-online.de // Web      : www.mikrocontroller-4u.de // CPU      : STM32F4 // IDE      : CooCox CoIDE 1.7.0 // Module   : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der Systick-Library // Hinweis  : Diese zwei Files muessen auf 8MHz stehen //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_systick.h" #include "stm32_ub_led.h"  int main(void) {   SystemInit(); // Инициализация настроек кварца    UB_Systick_Init(); // Инициализация системного счетчика    UB_Led_Init(); // Инициализация светодиодов     while(1)   {     // 200мс пауза (по системному счетчику)     UB_Systick_Pause_ms(200);     // переключение светодиода     UB_Led_Toggle(LED_GREEN);      // Проверка окончания работы таймера     if(UB_Systick_Timer1(TIMER_CHECK,0)==TIMER_HOLD) {       // переключить светодиод       UB_Led_Toggle(LED_RED);       // запуск таймера (на 800мс)       UB_Systick_Timer1(TIMER_START_ms,800);     }   } } 

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.