Перейти к содержанию
    

STM32F030F4 Timer external clock source mode 1

Добрый вечер.

Разбираюсь с таймерами на STM32F030F4, столкнулся с проблемой. Согласно даташита, на нешний вход можно подавать до 24 МГц.

Screenshot_2023-11-21_1.thumb.png.02a5f0e8db41b59db29fd9731f955bbb.png

Примерно с 5 МГц у МК сбивается тактирование. Обычно просто зависает, но иногда увеличивается частота системной шины (на совбодном таймере контрольный светодиод с интервалом в 1 сек, мигание котрого ускоряется) Конфигурация аналогична примеру mode 1 из референса.

Screenshot_2023-11-21_2.thumb.png.18a65009bfb755786acb19748820ac43.png

 Лаба простая, контроллер не загружен. В прерывании по переполнению первого таймера просто инкрементируется переменная. С интервалом в несколько секунд таймер выключается и переменная выводится на дисплей.

Грешил на электромагнитную совместимость, но до сих пор ограничивался блокировочными конденсаторами по питанию в простых лабах, и проблем не возникало. Есть, напрмер, макет частотомера на stm32f103c6 (mode 2 т.к. наружу выведен ETR), монтаж такой же простой на макетной плате, и до 30 МГц стабильно считает. Может я просто что-то не догоняю в mode1 и он не позволяет так просто считать со входа?

Изменено пользователем ozforester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, ozforester said:

Обычно просто зависает, но иногда увеличивается частота системной шины

Такого не может быть от слова совсем. Разбирайтесь с ПО. Дело только в нём.

4 hours ago, ozforester said:

Лаба простая, контроллер не загружен. В прерывании по переполнению первого таймера просто инкрементируется переменная.

Вот с прерываниями и нужно разбираться. "Лаба простая" - ни о чём не говорит. Может быть у Вас там в обработчике прерывания задержка стоит, или иные, другие команды, сильно влияющие на ход выполнения программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лабе была только проверка тактирования 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
}

Есть пара лишних строк, но они здесь не мешают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 сказал:

С интервалом в несколько секунд таймер выключается

Что такое "таймер выключается"? Как выключается? И как потом включается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сбой тактирования, это походило на взаимное влияние. Соседние пины, и кварц на макете далековато от мк. Уложил по другому и добавил несколько блокировочных конденсаторов по питанию. (можно ли завести сигнал на триггер иначе у этого корпуса не перепроверял, но по первости другого решения не увидел) Сам измеряемый сигнал содержал пульсации до 200 мВ, что в диапазоне неопределенного состояния входа также могло оказывать влияние на счетчик. Немного плавали показания. Отфильтровать помеху сложно. При идеальном питании и увеличении напряжения сигнала с функционального генератора до предельно допустимого, ошибка получилась в один младший разряд. Пока ставлю точку . Может сделаю в другой раз формирователь с гистерезисом на входе, а сейчас цель была простая - практическая работа с таймером. Поторопился. Нет было опыта. Работаю по трем-четырем мануалам, чаще по двум - DS и RM. Кортекс и PM реже востребованы. С трудом представляю как вообще по другому можно самому к чему-то прийти в этом мире. Хотя это лирика, главное - "ложечки нашлись" (=
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...