Перейти к содержанию

Низкая частота таймера


Рекомендуемые сообщения

Начинаю знакомство с STM32 после AVRок. Решил сделать дрыганог через прерывание по таймеру. Плата Nucleo на базе STM32F446re, частота работы до 180МГц, собираю проект в CubeIDE.

Для опыта решил взять таймер6 (на самом деле мне всё равно какой) и вызывать прерывания по переполнению счётчика. По даташиту, его тактирование идёт от APB1, которая работает на 45МГц, с множителем Х2 (т.е получается 90МГЦ). Прескалер выставил в 89 (т.е счёт должен идти с частотой 1 МГц), каунтер на 1 (т.е по идее я должен получать прерывания с частотой 500КГц).

static void MX_TIM6_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 89;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 1;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

В обработчике прерывания вызываю смену состояния светодиода на PA5.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim->Instance == TIM6) //check if the interrupt comes from TIM1
        {
                HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
        }
}

Загрузив код и проверив логическим анализатором я получаю частоту 254,5Кгц. Меняя значения прескалера в меньшую сторону увеличения частоты добиться не могу (основной цикл пуст, в программе никаких вычислений кроме этого нет). Почему так происходит?

Снимок.PNG

Снимок.PNG

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ну так у вас смена состояния PA5 происходит лишь один раз за прерывание. До первого прерывания низкий уровень, до второго - высокий. Вот и получился меандр частотой в 2 раза ниже частоты прерываний. А что получили не точно 250 kHz и частота не увеличивается при уменьшении прескаллера тут, думаю, упираетесь в быстродействие библиотеки HAL.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Точно, я что-то забыл что полный период это 2 прерывания. А вот по поводу увеличения частоты, неужели HAL настолько не оптимизирован? Я попробовал замену мигалки через запись регистра BSRR (выкл и вкл в одном обработчике) смены таймера на 10, который тактируется уже от APB2 (90МГц х2) но теперь частота достигла 662КГц. Даже мегагерцами не пахнет... 

Я не до конца понял концепцию того, что GPIO тактируется отдельно от ядра и их частоты не совпадают, подозреваю что внутри кристалла прерывания происходят намного чаще, а вот GPIO не успевает это всё отработать

Снимок.PNG

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

GPIO все успевает, согласно последнему рисунку смена с высокого уровня на низкий и обратно произошла за 3 сотых микросекунды, что в десятки раз быстрее времени всего периода.

У HAL по особому обрабатываются прерывания. Когда вы в кубе активируете прерывание таймера UpdateEvent, то в файле stm32f1xx_it.c автоматически создаётся обработчик с соответствующим именем - TIM1_UP_IRQHandler() (тут и далее для f1 проца и 1 таймера, у f4, думаю, также).

Когда случается прерывание таймера, мы попадаем в этот обработчик, он вызывает HAL-обработчик HAL_TIM_IRQHandler(&htim1). И тут уже происходит самое веселое - один за одним перебираются все флаги прерываний таймера. И лишь когда очередь дойдет до нужного - флаг сбрасывается и вызывается пользовательский коллбэк HAL_TIM_PeriodElapsedCallback() с вашим кодом. 

Изменено пользователем Рейес
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Что бы светодиод мигал на частоте 500kHz, нужно частоту 90 000 000 / 20 = 4 500 000 / 18 = 250 000 Hz(250kHz)
Так как период мигания требует два прерывания то вызов прерывания на частоте 250kHz даст Вам частоту 500 kHz.

image.png.9e6d8ea86a1116155f0bf8aa8eadb9f2.png

Получается нужно так настроить.

Изменено пользователем евгений рассохин
Ошибка расчёта
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...