RR2021 0 25 ноября, 2022 Опубликовано 25 ноября, 2022 (изменено) · Жалоба требуется единичное прерывание чере 100мс (не суть важнно) сваливается в прерывание сразу после строчки nvic_irq_enable(TIMER6_IRQn, 3, 2); вот инициализация timer_parameter_struct timer_par_struc6; rcu_periph_clock_enable(RCU_TIMER6); timer_deinit(TIMER6); timer_par_struc6.prescaler = 10800-1; timer_par_struc6.alignedmode = TIMER_COUNTER_CENTER_UP; timer_par_struc6.counterdirection = TIMER_COUNTER_UP; timer_par_struc6.period = 1000-1; // configure the autoreload value TIMER_CAR timer_par_struc6.clockdivision = TIMER_CKDIV_DIV1; timer_par_struc6.repetitioncounter = 1; timer_init (TIMER6, &timer_par_struc6); timer_interrupt_enable(TIMER6, TIMER_INT_UP); timer_enable(TIMER6); timer_counter_value_config (TIMER6, 0); if(SET == timer_interrupt_flag_get(TIMER6, TIMER_INT_FLAG_UP)) timer_interrupt_flag_clear (TIMER6, TIMER_INT_UP); nvic_irq_enable(TIMER6_IRQn, 3, 2); // вот отсюда уходит в прерывание не доходя до следующей строки gpo_Line1_on(); Само прерывание вот такое void TIMER6_IRQHandler(void) { if(SET == timer_interrupt_flag_get(TIMER6, TIMER_INT_FLAG_UP)){ timer_interrupt_flag_clear (TIMER6, TIMER_INT_UP); // Clear the TIMX update interrupt logo nvic_irq_disable(TIMER6_IRQn); timer_disable(TIMER6); timer_deinit(TIMER6); gpo_Line1_off(); } } Может есть рабочий вариант у кого ?? в чём проблема вообще не могу понять Изменено 25 ноября, 2022 пользователем haker_fox Оформление кода! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба Перед nvic_irq_enable() полезно очищать флаги прерываний. Как в периферии так и в NVIC. Советую: остановиться отладчиком перед nvic_irq_enable() и посмотреть где у вас торчат активные флаги запросов прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба У него же такие же таймеры как у STM32? Как там внутри HAL-а устроено не знаю, но если вдруг где-то стоит бит preload, то перед разрешением прерываний надо сделать TIMx->EGR = TIM_EGR_UG; TIMx->SR = 0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба Вставить между timer_interrupt_flag_clear(TIMER6, TIMER_INT_UP); и nvic_irq_enable(TIMER6_IRQn, 3, 2); строчку (void)timer_interrupt_flag_get(TIMER6, TIMER_INT_FLAG_UP); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RR2021 0 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба 26 минут назад, Arlleex сказал: Вставить между timer_interrupt_flag_clear(TIMER6, TIMER_INT_UP); и nvic_irq_enable(TIMER6_IRQn, 3, 2); строчку (void)timer_interrupt_flag_get(TIMER6, TIMER_INT_FLAG_UP); СУПЕР!! СПАСИО ПОМОГЛО. а откуда это ? ну т.е. это где-то написано в даташите или ещё где? ну просто на будущее чтобы знать , я примеры смотрел всякие ничего такого не было вроде нигде Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба Проблематика слишком глубинная, чтобы описать ее на пальцах. Сейчас нет времени писать, ищите на тему барьеров синхронизации памяти (DSB, DMB, ISB), буфера записи в ARM и доменов синхронизации внутри МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RR2021 0 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба 11 минут назад, Arlleex сказал: Проблематика слишком глубинная, чтобы описать ее на пальцах. Сейчас нет времени писать, ищите на тему барьеров синхронизации памяти (DSB, DMB, ISB), буфера записи в ARM и доменов синхронизации внутри МК. ок, попробую Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 25 ноября, 2022 Опубликовано 25 ноября, 2022 · Жалоба Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 16 января, 2023 Опубликовано 16 января, 2023 · Жалоба On 11/25/2022 at 8:57 PM, Arlleex said: Здравствуйте, сразу не ответил на ваш вопрос, просто не увидел его. Процессор постоянно крутился - не выходил из прерывания, пока не установил очистку регистра состояния сразу при входе в прерывание. И еще в прерывании необходимо запускать процесс чтения АЦП ADS7886, просто формирование короткого сигнала CS и разрешения чтения по SPI, который работает в 16-ти битном режиме и запускается не так быстро. Из-за это еще пришлось снизить частоту до 720 кГц (частота вызовов таймера). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться