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

Синхронизация работы таймеров STM32. Не работает slave.

Здравствуйте!
Пытаюсь сделать так, чтобы один таймер STM32f407 TIM2 периодически запускал другой TIM1 и чтобы тот другой на лапке мк формировал импульс заданной длительности. Соответственно у таймера TIM2 взял настроил на выход канал CH1 и соединил его с каналом таймера TIM1 СH2, который настроил на вход, у TIM1 так же канал СH1 настроил на выход.  
С таймером TIM2 проблем нет. На его CH1 вижу периодически меняющийся сигнал.  Проблемы с таймером TIM1 на его канале CH1 импульсов нет, хотя в отладчике вижу, что он считает хотя и как то странно (мне нужен 1 импульс, а он переполняется несколько раз) за время переполнения TIM2. Инициализацию TIM1 приложил. Подскажите пожалуйста что я делаю не так? Вроде всё должно быть просто, а уже столько времени потратил..  

static void MX_SLAVE_TIM1_INIT(void)
{
	//Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика).
	/* set the Timer prescaler to get 1MHz as counter clock */
	RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
	/* configure the Timer prescaler */
	 TIM1->PSC = 9;
	/* configure the period */
	 TIM1->ARR = 500-1;
	/* configure the repetition counter */
//	TIM1->RCR = 1;
	/* configure pulse width */
	 TIM1->CCR1 = 250 ;
	/* Select the Clock Division to 1*/
	// TIM1->CR1 |= TIM_CLOCKDIVISION;
	/* Reset clock Division bit field */
	 TIM1->CR1 &= ~ TIM_CR1_CKD;

	//Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1.
	 TIM1->CCMR1 &=~(0x3UL << (8U));
	 TIM1->CCMR1 |=(0x1UL << (8U));
	 //TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5
	 TIM1->CCER &=~(0x1UL << (5U));
	 TIM1->CCER &=~(0x1UL << (7U));
	 //Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR
	 TIM1->SMCR &=~(0x7UL << (4U));
	 TIM1->SMCR |=(0x6UL << (4U));
	 //TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера).
	 TIM1->SMCR &=~(0x7UL << (0U));
	 TIM1->SMCR |=(0x6UL << (0U));
	 //разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1
	 TIM1->CCMR1 &=~(0x7UL << (4U));
	 TIM1->CCMR1 |=(0x7UL << (4U));
	 //Пользователь может опционально разрешить регистры предзагрузки записью OC1PE=1 в регистре TIMx_CCMR1 и ARPE в регистре TIMx_CR1
	 //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0.
	 TIM1->CR1 &=~(0x1UL << (4U));
	 TIM1->CR1 &=~(0x3UL << (5U));
	 // Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode)
	 TIM1->CR1 &=~(0x1UL << (3U));

	 /*
	  *  Если пользователь хочет вывести сигнал с минимальной задержкой,
	  *  то должен быть установлен бит OCxFE в регистре TIMx_CCMRx.
	  *  Тогда OCxRef (и OCx) принудительно будут установлены в ответ
	  *   на сигнал стимула, без обращения внимания на сравнение.
	  *   Новый уровень такой же, как если бы произошло совпадение сравнения.
	  *   OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2.
	  *
	  */
	 TIM1->CCMR1 &=~(0x1UL << (2U));
	 TIM1->CCMR1 |=(0x1UL << (2U));//Output compare 1 fast enable

	 /* Enable the TIM Counter */
	 // TIM1->CR1 |= TIM_CR1_CEN;

}
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	    ch1=TIM1->CNT ;//тот что slave
	  	ch2= TIM2->CNT ; // мастер
	  	ch5=TIM1->SMCR;
	  	if(ch1==251){
	  		ch3=ch3+1;//сколько раз slave


	  	}
	  	if(ch2==999){
	  		  		ch4=ch4+1;//сколько раз master


	  		  	}
  }

 

1.jpg

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


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

Ой, навряд ли кто помнит на память позиции битов в регистрах. Есть же текстовые дефайны - ими и пишите. Иначе чтобы разобраться в вашем тексте, надо открывать документацию и пальчиком прослеживать все эти циферки.

Я оставлю вот эту картинку, а вы сверьтесь со значениями битов у себя:
2024-02-21201933.jpg.ed6303008744426a89dd532fe8884f1a.jpg
2024-02-21202555.jpg.0adcfd5d76fd09e902c4e5ead9c8e013.jpg

А значения регистров можете смотреть прямо вон там, на вкладке SFRs, там весь список всех регистров и всех битов.

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


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

Добавлю.

В показанном коде есть только инициализация слейвного TIM1 (в нем выбирается источник сигнала для TRGI (ITR1) - мастер-таймер TIM2). Но требуется еще инициализировать TIM2 - выбрать источник сигнала (TRGO) который будет подключен к TRGI слейвного таймера

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


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

54 минуты назад, EdgeAligned сказал:

А значения регистров можете смотреть прямо вон там, на вкладке SFRs, там весь список всех регистров и всех битов.

Честно говоря я так и не догнал где во вкладке SFRs брать названия отдельных битов, группы битов там видел например CC2S.

Как записать например вот эти строчки с помощью того, что есть в той вкладке?

//Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1.
	 TIM1->CCMR1 &=~(0x3UL << (8U));
	 TIM1->CCMR1 |=(0x1UL << (8U));

 

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


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

Принцип обозначения битов простой - сначала базовое имя модуля, (только без номера), например TIM, затем через _ имя регистра, например SMCR, затем через _  имя бита или битовой маски для группы битов: TS, TS_0. Итого,   TIM_SMCR_TS0

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


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

1 час назад, EdgeAligned сказал:

Принцип обозначения битов простой - сначала базовое имя модуля, (только без номера), например TIM, затем через _ имя регистра, например SMCR, затем через _  имя бита или битовой маски для группы битов: TS, TS_0. Итого,   TIM_SMCR_TS0

Переписал, если я правильно понял принцип то оно должно выглядеть так:  

static void MX_SLAVE_TIM1_INIT(void)
{
	//Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика).
	/* set the Timer prescaler to get 1MHz as counter clock */
	RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
	/* configure the Timer prescaler */
	 TIM1->PSC = 9;
	/* configure the period */
	 TIM1->ARR = 500-1;
	/* configure the repetition counter */
//	TIM1->RCR = 1;
	/* configure pulse width */
	 TIM1->CCR1 = 250 ;
	/* Select the Clock Division to 1*/
	// TIM1->CR1 |= TIM_CLOCKDIVISION;
	/* Reset clock Division bit field */
	 TIM1->CR1 &= ~ TIM_CR1_CKD;


//Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1

TIM1->CCMR1 |=TIM_CCMR1_CC2S_0;
 
//TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5

TIM1->CCMR1 &=~(TIM_CCER_CC2P|TIM_CCER_CC2NP);


//Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR
//TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера).

TIM1->SMCR |=(TIM_SMCR_TS_2|TIM_SMCR_TS_1|TIM_SMCR_SMS_2|TIM_SMCR_SMS_1);

//разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1
TIM1->CCMR1 |=(TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_0);

 //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0.
TIM1->CR1 &=~(TIM_CR1_DIR|TIM_CR1_CMS);

// Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode)
TIM1->CR1 &=~(TIM_CR1_OPM);

/*
	  *  Если пользователь хочет вывести сигнал с минимальной задержкой,
	  *  то должен быть установлен бит OCxFE в регистре TIMx_CCMRx.
	  *  Тогда OCxRef (и OCx) принудительно будут установлены в ответ
	  *   на сигнал стимула, без обращения внимания на сравнение.
	  *   Новый уровень такой же, как если бы произошло совпадение сравнения.
	  *   OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2.
	  *
	  */
TIM1->CCMR1 |=TIM_CCMR1_OC1FE;

}	
	 

 

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


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

Взять Keil, выбрать процессор STM32F217IG и в симуляторе посмотреть как работают таймеры в нужных режимах.

Без взякого железа.

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


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

3 часа назад, EdgeAligned сказал:

 

Я оставлю вот эту картинку, а вы сверьтесь со значениями битов у себя:
2024-02-21201933.jpg.ed6303008744426a89dd532fe8884f1a.jpg
2024-02-21202555.jpg.0adcfd5d76fd09e902c4e5ead9c8e013.jpg

 

Я пытаюсь это через внешний вход  сделать TI2FP2 у TIM1 , но т.к. на рисунке написано тоже пробовал и тоже не получилось

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


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

Заработало, не понял только почему 1-й  импульс Tim1 длительностью меньше, чем все остальные..

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


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

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

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

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

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

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

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

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

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

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