как прочитать текущее значение аппаратного таймера в STM32L1? - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь реализовать две независимые задачи с помощью аппаратных таймеров. Мне нужно, чтобы задача 1 повторялась через каждые 100 мкс, а другая - повторять 10 мкс. Я сгенерировал код из STM32cubemx. Функция таймера выглядит следующим образом:

static void MX_TIM2_Init(void) {
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 100;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 800;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {
    Error_Handler();
  }
}

Я продолжаю обработку с помощью функции, как показано ниже:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim-> Instance == TIM2)
    {
        ledBlueBlink();
    }
}

У меня есть задача ledGreenBlink(), которая должна запускаться каждые 10 раз задача ledBlueBlink() запускается. Кто-нибудь, пожалуйста, дайте мне знать, как я могу это реализовать?

1 Ответ

1 голос
/ 19 июня 2020

Не уверен насчет формулировки, если вы действительно ищете задачу, поскольку я не вижу задачу «ledBlueBlink ()».

Если вы просто хотите вызывать «ledGreenBlink ()» каждые десять вызовов вашего обратного вызова, я бы порекомендовал просто сделать это, добавив переменную счетчика и запустив ее каждые десять раз.

static unsigned counter = 0;
if (counter%10)
    ledGreenBlink();

counter++; 

Обратите внимание, что переменная счетчика должна быть c, чтобы сохранить его значение по нескольким вызовам обратного вызова. Более того, это должен быть беззнаковый тип, чтобы безопасно переключаться при достижении максимального значения.

Если вам действительно нужны задачи для чего-то, вы можете уточнить свой код, чтобы поддержать вопрос.

...