Jump to content

Константин Галкин

Members
  • Content Count

    2
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Константин Галкин

  • Rank
    Новенький
  • Birthday 09/07/1995

Информация

  • Пол
    Мужчина
  • Город
    Москва

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    микроконтроллеры
  1. Точно, я что-то забыл что полный период это 2 прерывания. А вот по поводу увеличения частоты, неужели HAL настолько не оптимизирован? Я попробовал замену мигалки через запись регистра BSRR (выкл и вкл в одном обработчике) смены таймера на 10, который тактируется уже от APB2 (90МГц х2) но теперь частота достигла 662КГц. Даже мегагерцами не пахнет... Я не до конца понял концепцию того, что GPIO тактируется отдельно от ядра и их частоты не совпадают, подозреваю что внутри кристалла прерывания происходят намного чаще, а вот GPIO не успевает это всё отработать
  2. Начинаю знакомство с 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Кгц. Меняя значения прескалера в меньшую сторону увеличения частоты добиться не могу (основной цикл пуст, в программе никаких вычислений кроме этого нет). Почему так происходит?
×
×
  • Create New...