whale 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 (изменено) · Жалоба Извеняюсь за идиотские вопросы, тк осваивать начал вчера, В проге при старте имеем меандр 1 сек, затем тишина, такое ощущение что входит в прерывание таймера и не выходит, не пойму в чем дело. void LED_toggle(void) { GPIOA->ODR ^= (1<<GPIO_ODR_OD8_Pos); } //------------------------------------------------------------------------------ void TIM3_IRQHandler(void) { TIM3->SR &= ~TIM_SR_UIF; LED_toggle(); } //------------------------------------------------------------------------------ int main(void) { RCC->IOPENR |=(0x01<<RCC_IOPENR_GPIOAEN_Pos); GPIOA->BRR |= (0x01<<GPIO_BRR_BR8_Pos); GPIOA->MODER &= ~(0x02<<GPIO_MODER_MODE8_Pos); RCC->APBENR1 |=(0x01<<RCC_APBENR1_TIM3EN_Pos); TIM3->PSC = 60000 ; TIM3->ARR = 100; TIM3->DIER |= (0x01<<TIM_DIER_UIE_Pos); TIM3->CR1 |=(0x01<<TIM_CR1_URS_Pos); TIM3->EGR |=(0x01<<TIM_EGR_UG_Pos); TIM3->CR1 &= ~TIM_CR1_URS; TIM3->CR1 |=(0x01<<TIM_CR1_CEN_Pos); __enable_irq (); NVIC_EnableIRQ(TIM3_IRQn); while (1) { // LED_toggle(); } } //------------------------------------------------------------------------------ Изменено 2 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 (изменено) · Жалоба Такое ощущение что идет в прерывание-заглушку. ps точно в прерывание для TIM3 не входит а входит куда то еще. Изменено 2 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 197 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 3 минуты назад, whale сказал: Такое ощущение что идет в прерывание-заглушку. Приобретите отладчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 18 minutes ago, whale said: ИМХО в прерывании: - остановить таймер - сбросить флаг прерывания - выполнить нужное действие (мигнуть светодиодом) - запустить таймер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 (изменено) · Жалоба 5 minutes ago, A.Lex said: ИМХО в прерывании: - остановить таймер - сбросить флаг прерывания - выполнить нужное действие (мигнуть светодиодом) - запустить таймер. Вот, в прерывании тупо поставил светодиод зажигать , он не зажигатеся, те таймер считает и по переполнению куда уходит в прерывание но не в свое ) Просто фантастика какая то Изменено 2 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 7 минут назад, whale сказал: он не зажигатеся, А почему его состояние инвертируется у вас и в прерывании и в основном цикле? Он у вас наверно переключается с высокой частотой, и вам кажется, что он не зажигается. 31 минуту назад, whale сказал: void TIM3_IRQHandler(void) { TIM3->SR &= ~TIM_SR_UIF; 31 минуту назад, whale сказал: while (1) { // LED_toggle(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 7 minutes ago, A.Lex said: ИМХО в прерывании: - остановить таймер - сбросить флаг прерывания - выполнить нужное действие (мигнуть светодиодом) - запустить таймер. Забыл. еще перед запуском таймера счетчик обнулить надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба Только что, A.Lex сказал: Забыл. еще перед запуском таймера счетчик обнулить надо А зачем сбрасывать? Ведь прерывание по переполнению. Таймер и так обнулится. 16 минут назад, whale сказал: ps точно в прерывание для TIM3 не входит а входит куда то еще. Как вы это без отладчика определили? Загляните в map-файл, посмотрите, линкуется ли ваш обработчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 (изменено) · Жалоба Не поверите, у меня осцилограф есть, 1 сек после старта идет меандр из while(), потом стоп. Entry Address Size Type Object ----- ------- ---- ---- ------ ?main 0x800'01e5 Code Gb cmain.o [3] CSTACK$$Base 0x2000'0000 -- Gb - Linker created - CSTACK$$Limit 0x2000'0400 -- Gb - Linker created - IRQ_Init 0x800'00f3 0x4 Code Gb main.o [1] LED_off 0x800'011b 0xe Code Gb main.o [1] LED_toggle 0x800'0129 0xe Code Gb main.o [1] MCU_init 0x800'00e3 0x10 Code Gb main.o [1] PortInit 0x800'00f7 0x24 Code Gb main.o [1] Region$$Table$$Base 0x0 -- Gb - Linker created - Region$$Table$$Limit 0x0 -- Gb - Linker created - TIM3_Init 0x800'013d 0x5c Code Gb main.o [1] __NVIC_EnableIRQ 0x800'0041 0x18 Code Lc main.o [1] __NVIC_SetPriority 0x800'0059 0x8a Code Lc main.o [1] __cmain 0x800'01e5 Code Gb cmain.o [3] __exit 0x800'021d 0x14 Code Gb exit.o [4] __iar_program_start 0x800'0231 Code Gb cstartup_M.o [3] __low_level_init 0x800'0203 0x4 Code Gb low_level_init.o [2] __vector_table 0x800'0000 Data Gb vector_table_M.o [3] _call_main 0x800'01f1 Code Gb cmain.o [3] _exit 0x800'0211 Code Gb cexit.o [3] _main 0x800'01fb Code Gb cmain.o [3] exit 0x800'0207 0x8 Code Gb exit.o [2] main 0x800'01d5 0x10 Code Gb main.o [1] Я так понимаю функции TIM3_IRQHandler(void) тут нет ? интересно и почему ? Изменено 2 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 2 часа назад, A.Lex сказал: - остановить таймер - сбросить флаг прерывания - выполнить нужное действие (мигнуть светодиодом) - запустить таймер. Вы меня простите, но еще бОльшую глупость придумать сложно. Таймер после переполнения отсчитал неизвестно сколько до вашего входа в прерывание, потом вы его зачем-то останавливаете и сбрасываете, в это время более приоритетные прерывания вносят еще более непредсказуемую задержку, потом вы таймер запускаете и в результате имеете совершенно непредсказуемый и нестабильный период прерываний, к тому же явно больший периода переполнения таймера. И самое главное - зачем? Чего вы пытаетесь добиться всеми этими действиями? 2 часа назад, whale сказал: интересно и почему ? Вероятно потому, что в файле векторов прерываний обработчик имеет какое-то другое название. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 41 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба Я извенюсъ, но савэтую начать с примера от ST TIMx interrupt. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 2 часа назад, whale сказал: интересно и почему ? А исходник вы каким компилятором собираете? Если Си++, то обзавите свой обработчик со словом extern extern "C" void TIM3_IRQHandler(void) { TIM3->SR &= ~TIM_SR_UIF; LED_toggle(); } Ну и проверьте, что имя функции обработчик тютелька в тютельку совпадает с тем, что у вас прописано в стартап-файле. Всякое бывает. Если не поможет, сбросте, пожалуйста исходник стартапа сюда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 (изменено) · Жалоба IAR ARM 8.50.9 на С Если бы не совпадал тюлельку в тутельку он бы не откомпелировался Где искать исходник стартапа ? Изменено 2 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cybersonner 1 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 16 минут назад, whale сказал: Если бы не совпадал тюлельку в тутельку он бы не откомпелировался Откомпилировался. Функция как функция, раз нигде не вызывается, то и компилировать не надо. Если не стартапа исходник, то весь проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 2 февраля, 2021 Опубликовано 2 февраля, 2021 · Жалоба 23 минуты назад, whale сказал: Если бы не совпадал тюлельку в тутельку он бы не откомпелировался Скомплировался бы. Почему нет? Чем название обработчика отличается от обычной функции? Ничего. Более того, с точки зрения комплиятора обработчик - и есть обычная Си-функция. Так уж кортексы (Cortex-Mx) устроены. А обработчиком ему позволяет стать "слабое" объявление функции обработчика в стартапе, где по-умолчанию это обычно замкнутый цикл. 24 минуты назад, whale сказал: Где искать исходник стартапа ? Ваш проект. Я не знаю. Ищите средствами ОС за которой работаете по имени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться