levshkatov Опубликовано 9 апреля, 2017 Поделиться Опубликовано 9 апреля, 2017 Добрый день. Не хочет работать таймер на stm32f407. Пытаюсь раз в секунду поморгать светодиодом и не получается. Программа вообще не заходит в обработчик прерывания таймера. В чем может быть проблема? TIM_HandleTypeDef htim3; static void MX_TIM3_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); ... MX_TIM3_Init(); while (1){ } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } static void MX_TIM3_Init(void) { htim3.Instance = TIM3; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.Prescaler = 48000 - 1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; if (HAL_TIM_Base_Init(&htim3) != HAL_OK){ Error_Handler(); } if (HAL_TIM_Base_Start_IT(&htim3) != HAL_OK){ Error_Handler(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM3){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 (изменено) А кто нибудь сказал NVIC о том, что прерывание от таймера вообще разрешено? Колбэк обработается только в случае вызова системного обработчика прерываний контроллером этих самых прерываний. Я в этом коде вижу только одно прерывание, которое будет работать: 3 часа назад, levshkatov сказал: HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); если конфигурируете проект через куб, то в настройках таймера надо поставить галку - глобальные прерывание от таймера TIM3. Тогда строчка инициализации NVIC добавится в проект. Или можно вручную добавить HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); соответственно отработчик прописать в it.h void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&htim3); } Изменено 10 апреля, 2017 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
levshkatov Опубликовано 10 апреля, 2017 Автор Поделиться Опубликовано 10 апреля, 2017 (изменено) @mail_robot Знаю, что нужно разрешить прерывания, просто во всех примерах пользовались коллбэком и без этого. Включил прерывания. Но программа по-прежнему не заходит в void TIM3_IRQHandler(void){} Изменено 10 апреля, 2017 пользователем levshkatov 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
levshkatov Опубликовано 10 апреля, 2017 Автор Поделиться Опубликовано 10 апреля, 2017 Проблему решил. Ни в одном примере в интернете не нашел, что необходимо написать функцию HAL_TIM_Base_MspInit() в msp.c. Код: void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { if(htim_base->Instance==TIM3) { __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } } Также нужно написать аналогичную функцию DeInit: void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { if(htim_base->Instance==TIM3) { __HAL_RCC_TIM3_CLK_DISABLE(); HAL_NVIC_DisableIRQ(TIM3_IRQn); } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 (изменено) А теперь смотрим как это делается без калокубов void TIM3_IRQHandler (void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR&=(~TIM_SR_UIF); GPIOD->ODR^=GPIO_ODR_ODR_13; } } void TIM3_init(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; GPIOD->MODER &= ~GPIO_MODER_MODER13 ; GPIOD->MODER |= GPIO_MODER_MODER13_0 ; RCC->APB1ENR|=RCC_APB1ENR_TIM3EN; TIM3->PSC=8400-1; TIM3->ARR=10000-1; TIM3->DIER=TIM_DIER_UIE; NVIC_SetPriority(TIM3_IRQn,15); NVIC_EnableIRQ(TIM3_IRQn); TIM3->CR1|=TIM_CR1_CEN; } И главное смотрим размер кода ... Program Size: Code=792 RO-data=408 RW-data=0 ZI-data=1632 И это вместе с инитом тактовой...http://mcu.goodboard.ru/viewtopic.php?id=11 Изменено 10 апреля, 2017 пользователем dosikus 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 3 часа назад, levshkatov сказал: Ни в одном примере в интернете не нашел, что необходимо написать не надо ничего писать есть же 9 минут назад, dosikus сказал: калокуб он все это пишет автоматически. Поганая программка. Совершенно отвратительная. Столько времени экономит зазря... 10 минут назад, dosikus сказал: И главное смотрим размер кода ... Program Size: Code=792 RO-data=408 RW-data=0 ZI-data=1632 и да, при наличии полумегабайта флеша калокуб однозначно проигрывает по всем параметрам. Примерно как поссать в море в надежде его испортить 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 (изменено) Ога, ога . И самое главное пИсатели в калокубе даже не понимают что и зачем оно натыкано ... А когда прочитаешь RM оказывается все просто и понятно. Насчет необхватности флеша - весьма доставило, вот такие " тыкатели в калокубе" умудряются утыкать весь флеш под завязку... Внятное объяснение использование DeInit местный гуру может дать????????? Изменено 10 апреля, 2017 пользователем dosikus 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 Ну конечно. Все ж тупые. Поголовно. Кроме вас 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 (изменено) mail_robot, результат выше, раскройте глаза. Пора бы снять розовые очки и не уподобляться ардуинщикам... Изменено 10 апреля, 2017 пользователем dosikus 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 10 апреля, 2017 Поделиться Опубликовано 10 апреля, 2017 результат чего выше? Упорного бараньего мазохизма ради пары свободных байт на инитке? Остальной то код вовсе не на кубе пишется. И в чем тогда разница? 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.