Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32: генерирование частот порядка единиц МГц таймером

Ср мар 15, 2017 22:44:34

Всем привет! Поясните не совсем понимающему, реально ли осуществить сабж? Подозреваю, что реально, посредством использование режима таймера Output Compare. Но вот на деле нифига не получается. Инициализационный код генерю Кубом, а именно вот так:

Спойлер
Код:
static void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 2;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  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();
  }

  if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
  sConfigOC.Pulse = 100;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim2);

}


Потом из main() запускаю таймер: HAL_TIM_OC_Start(&htim2,1);

И... ничего не происходит. Выходная нога, будто в воздухе висит. Что я делаю не так?

Re: STM32: генерирование частот порядка единиц МГц таймером

Чт мар 16, 2017 06:35:57

Период таймера 2, а значение канала 100 - вот он и не срабатывает.

Re: STM32: генерирование частот порядка единиц МГц таймером

Чт мар 16, 2017 08:04:21

Нашел этот косяк - исправил, все равно тишина.

Re: STM32: генерирование частот порядка единиц МГц таймером

Вс апр 02, 2017 00:16:13

А таймер сам стартанули хоть??
Функция халовская такая есть - HAL_TIM_Base_Start(&htim) . По умолчанию Куб таймер не стартует. Одной функции TIM_Init недостаточно. Вы его сами должны стартануть вот этой функцией. И он пойдет тикать.

И советую уходить от Куба, и чем скорее, тем лучше. Он пригоден только для того, чтобы что-то подсмотреть, чтобы легче разобраться.
А так.. не советую. Получите тормоза с кодом, нулевую оптимизацию со всеми вытекающими.

И если стоит задача генерации импульсов с частотой единицы мегагерц, то можно попробовать использовать прерывание таймера, в котором при переполнении просто будет инвертироваться нужная нога. В обработчике прерывания достаточно добавить
(GPIOx->ODR ^= GPIO_ODR_ODRx;)
Но таким способом на практике больше 5МГц на бюджетных контроллерах получить проблематично. Это ерунда, что пишут, что частота GPIO может быть 50Мгц. Чушь полнейшая. Проверено не раз. Больше 5МГц по таймеру.. увы.

Re: STM32: генерирование частот порядка единиц МГц таймером

Вс апр 02, 2017 15:54:35

Да все, разобрался уже, спасибо! Таймер стартовал. Проблема была в некорректных настройках PLL, которые почему то Куб предложил - так что с этим надо быть осторожнее. Все уже давно работает и еще как )
Ответить