ozforester 0 21 ноября, 2023 Опубликовано 21 ноября, 2023 (изменено) · Жалоба Добрый вечер. Разбираюсь с таймерами на STM32F030F4, столкнулся с проблемой. Согласно даташита, на нешний вход можно подавать до 24 МГц. Примерно с 5 МГц у МК сбивается тактирование. Обычно просто зависает, но иногда увеличивается частота системной шины (на совбодном таймере контрольный светодиод с интервалом в 1 сек, мигание котрого ускоряется) Конфигурация аналогична примеру mode 1 из референса. Лаба простая, контроллер не загружен. В прерывании по переполнению первого таймера просто инкрементируется переменная. С интервалом в несколько секунд таймер выключается и переменная выводится на дисплей. Грешил на электромагнитную совместимость, но до сих пор ограничивался блокировочными конденсаторами по питанию в простых лабах, и проблем не возникало. Есть, напрмер, макет частотомера на stm32f103c6 (mode 2 т.к. наружу выведен ETR), монтаж такой же простой на макетной плате, и до 30 МГц стабильно считает. Может я просто что-то не догоняю в mode1 и он не позволяет так просто считать со входа? Изменено 21 ноября, 2023 пользователем ozforester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 21 ноября, 2023 Опубликовано 21 ноября, 2023 · Жалоба 4 hours ago, ozforester said: Обычно просто зависает, но иногда увеличивается частота системной шины Такого не может быть от слова совсем. Разбирайтесь с ПО. Дело только в нём. 4 hours ago, ozforester said: Лаба простая, контроллер не загружен. В прерывании по переполнению первого таймера просто инкрементируется переменная. Вот с прерываниями и нужно разбираться. "Лаба простая" - ни о чём не говорит. Может быть у Вас там в обработчике прерывания задержка стоит, или иные, другие команды, сильно влияющие на ход выполнения программы. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 22 ноября, 2023 Опубликовано 22 ноября, 2023 · Жалоба В лабе была только проверка тактирования mode1, все вспомогательное запускалось отдельно от таймера. В любом случае, "не может быть" - звучит обнадеживающе. Попробую выбросить все кроме изучаемого таймера и вспомогательного, мигающего светодиодом. Может поведение изменится. Таймер сейчас такой: void TIM1_BRK_UP_TRG_COM_IRQHandler(void){ HFreq++; TIM1_SR &= ~1; } void tim1_init(void){ RCC_APB2ENR |= ( 1 << 11 ); // clocking TIM1 TIM1_PSC = 0; // unused TIM1_CR1 &= ~(1 << 4); // upcounter TIM1_CR1 &= ~(1 << 3); // is not stopped at update event TIM1_CCMR1 |= (0b01 << 8); // input IC2 mapped to TI2 TIM1_SMCR |= (0b111); // 111 - external clock mode 1 TIM1_SMCR |= (0b110 << 4); // Filtered Timer Input 2 (TI2FP2) TIM1_DIER |= 1; //enable interrupt NVIC_ISER0 |= (1 << 13) ; // enable TIM1 IRQn } void counter_init( void ){ // input - TIM1 CH2 PA9 (17) AF2 RCC_AHBENR |= (1<<17); // clock port A GPIOA_MODER &= ~( 0b11 << 18 ); // reset PA9 GPIOA_MODER |= ( 0b10 << 18 ); // PA9 as AF GPIOA_AFRH |= ( 0b0010 << 4 ); // PA9 AF2 = TIM1_CH2 } Есть пара лишних строк, но они здесь не мешают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 22 ноября, 2023 Опубликовано 22 ноября, 2023 · Жалоба 2 часа назад, ozforester сказал: Таймер сейчас такой: void TIM1_BRK_UP_TRG_COM_IRQHandler(void){ HFreq++; TIM1_SR &= ~1; } void tim1_init(void){ RCC_APB2ENR |= ( 1 << 11 ); // clocking TIM1 TIM1_PSC = 0; // unused TIM1_CR1 &= ~(1 << 4); // upcounter TIM1_CR1 &= ~(1 << 3); // is not stopped at update event TIM1_CCMR1 |= (0b01 << 8); // input IC2 mapped to TI2 TIM1_SMCR |= (0b111); // 111 - external clock mode 1 TIM1_SMCR |= (0b110 << 4); // Filtered Timer Input 2 (TI2FP2) TIM1_DIER |= 1; //enable interrupt NVIC_ISER0 |= (1 << 13) ; // enable TIM1 IRQn } Отучайтесь от бездумных "|=" и "&=" на всё подряд. Начните читать мануал на МК. Если бы вы его прочитали, то узнали бы почему нельзя делать TIM1_SR &= ~1; Зачем все эти: TIM1_CR1 &= ...; ? Что у вас находится в TIM1_CR1 до этой команды? Задумывались? То же самое касается и остальных регистров, к которым применяете "&=" и "|=". Почему не сделать элементарно: TIM1_CR1 = ...; ? ISR лучше построить так: void TIM1_BRK_UP_TRG_COM_IRQHandler(void) { TIM1_SR = ~1; int i = TIM1_SR; HFreq++; } Возможно и проблема пропадёт. Можно ещё __DSB() добавить в конец ISR. 17 часов назад, ozforester сказал: С интервалом в несколько секунд таймер выключается Что такое "таймер выключается"? Как выключается? И как потом включается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 24 ноября, 2023 Опубликовано 24 ноября, 2023 · Жалоба Сбой тактирования, это походило на взаимное влияние. Соседние пины, и кварц на макете далековато от мк. Уложил по другому и добавил несколько блокировочных конденсаторов по питанию. (можно ли завести сигнал на триггер иначе у этого корпуса не перепроверял, но по первости другого решения не увидел) Сам измеряемый сигнал содержал пульсации до 200 мВ, что в диапазоне неопределенного состояния входа также могло оказывать влияние на счетчик. Немного плавали показания. Отфильтровать помеху сложно. При идеальном питании и увеличении напряжения сигнала с функционального генератора до предельно допустимого, ошибка получилась в один младший разряд. Пока ставлю точку . Может сделаю в другой раз формирователь с гистерезисом на входе, а сейчас цель была простая - практическая работа с таймером. Поторопился. Нет было опыта. Работаю по трем-четырем мануалам, чаще по двум - DS и RM. Кортекс и PM реже востребованы. С трудом представляю как вообще по другому можно самому к чему-то прийти в этом мире. Хотя это лирика, главное - "ложечки нашлись" (= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться