Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба Здравствуйте, подскажите, пожалуйста. Процессор крутится в прерывании постоянно, видимо флаг не сбрасывается?! Хотя в документации написано, что флаг снимается после чтения флага из регистра состояния. /******************************************************************************** TIM3 init function *******************************************************************************/ void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0x63; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 6; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim3); HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } //void MX_TIM3_Init(void) void TIM3_IRQHandler(void) { if ((TIM3->SR & TIM_FLAG_CC1) != RESET) /* Capture compare 1 event */ { if ((TIM3->DIER & TIM_IT_CC1) != RESET) { TIM3->SR = ~TIM_FLAG_CC1; // Clear IRQ Flag } } } //void TIM3_IRQHandler(void) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 50 минут назад, Vladimir_T сказал: Хотя в документации написано, что флаг снимается после чтения флага из регистра состояния. Прямо так и написано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба Видно я не верно понимаю. А написано - CC1IF / rc_w0. Тогда как правильно будет? Этот бит я ведь сбрасываю в регистре состояния на выходе из прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 1. Проверьте название функции обработчика прерывания. 2. Проверьте другие установленные биты в DIER, но не сброшенные в обработчике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба И еще - в каком режиме таймер работает? Обычный счет, или захват? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба Название функции обработчика - TIM3_IRQHandler(void) Отладчик в нее заходит. В регистре DIER только флаг TIM_IT_CC1 установлен. Счет обычный с перезапуском, режим PWM, параметры корректны. На выходе таймера, через PB4 сформирован нормальный, ожидаемый сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба У таймеров флаги статусов прерывания сбрасываются записью нуля. Есть одна тонкость, на высокоскоростных контроллерах команда очистки флага не должна быть в конце прерывания. Иначе, можно очистить флаг, выйти из прерывания, а он ещё физически не очистился и залетаем в прерывание снова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 4 hours ago, VladislavS said: У таймеров флаги статусов прерывания сбрасываются записью нуля. Так и делаю. TIM3->SR = ~TIM_FLAG_CC1; // Clear IRQ Flag Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба Если у вас всегда только по одному флагу, то можно всё сильно упростить void TIM3_IRQHandler() { TIM3->SR =0; // Полезное действие } ЗЫ: Компилятор у вас случайно не в режиме С++? А то надо extern "C" void TIM3_IRQHandler(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 4 hours ago, VladislavS said: Если у вас всегда только по одному флагу, то можно всё сильно упростить void TIM3_IRQHandler() { TIM3->SR =0; // Полезное действие } Не помогло... Флаг и в отладчике вручную не снимается - сразу перевзводится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба При остановке в отладчике таймер продолжает работать. Пока вы SR считаете заново, флаг уже запросто штатным образом установится. С какой частотой он у вас должен срабатывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 4 hours ago, VladislavS said: При остановке в отладчике таймер продолжает работать. Пока вы SR считаете заново, флаг уже запросто штатным образом установится. С какой частотой он у вас должен срабатывать? 1 МГц. Привел параметры конфигурации, может что-то не так с ними.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба Ну и что вы там отладчиком хотите на 1 МГц увидеть? Выводите на какую-нибудь ногу сигнал и смотрите осциллоглядом. А вообще, 1М прерываний в секунду это жесткач... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба В отладочном модуле (периферия DBG), установите бит "заморозки" тактирования модуля TIM3, чтобы при остановке отладчиком таймер не считал. И еще: прерывания с частотой 1 МГц, это, конечно, сильно. Не знаю, есть ли буфер записи системного уровня в STM32F7, но по-хорошему, перед выходом из прерывания нужно сделать фиктивное чтение из TIM3->SR или поставить барьер памяти DMB (если буфер записи есть в самом ядре CPU, чего мы, обычные смертные, видимо никогда не узнаем, т.к. эту инфу ST не предоставляет). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 марта, 2022 Опубликовано 16 марта, 2022 · Жалоба 4 hours ago, VladislavS said: Ну и что вы там отладчиком хотите на 1 МГц увидеть? Выводите на какую-нибудь ногу сигнал и смотрите осциллоглядом. А вообще, 1М прерываний в секунду это жесткач... На выходе таймера, через PB4 сформирован нормальный, ожидаемый сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться