STM32 ONE PULSE MODE.

STM32 ONE PULSE MODE.

В одном из проектов использовал следующий механизм для управления бузером, включал его вручную, запускал таймер и выключал в прерывании, которое возникало при переполнении таймера. Со временем количество прерываний в проекте выросло и часто другие прерывания не давали сработать прерыванию, в котором выключался бузер. В результате чего, бузер всегда издавал разный по длительности звуковой сигнал. Для решения этой проблемы необходимо было отказаться от прерывания и аппаратно подавать импульс определенной длительности. Ниже приведен код который это делает.
	
                //Включаем тактирование  GPIOA_2  и TIM15
		RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
		RCC->APB2ENR |= RCC_APB2ENR_TIM15EN;
		//PA2 push-pull альтернативная функция 
		GPIOA->MODER |= GPIO_MODER_MODER2_1;
		GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;
		GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR2;

		GPIOA->AFR[0] |= (0x09<<2*4);//TIM15_CH1
		
		TIM15->PSC  = 7200 -1; //частота работы таймера 10kHz
                TIM15->ARR  = 350 - 1; //значение перезагрузки
		TIM15->CCR1 = 35;// длительность импульса
		TIM15->RCR = 1 - 1; //количество повторений
		TIM15->EGR = TIM_EGR_UG; //необходимо установить для установки прескалера

                TIM15->CR1 &= ~TIM_CR1_DIR; //считаем вверх
                TIM15->CR1 |= TIM_CR1_OPM; //счетчик остановится досчитав до arr
		TIM15->CCMR1 = TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE;// выбираем режим PWM и разрешаем предзагрузку  
			
		TIM15->SMCR = RESET; //тактирование от внутреннего источника
		TIM15->CCER |= TIM_CCER_CC1E;/ / включаем Compare output channel 1 
		TIM15->BDTR |= TIM_BDTR_MOE;//разрешаем использовать выводы таймера как выходы 
                TIM15->CR1  |= TIM_CR1_CEN;//запускаем таймер

Количество импульсов можно изменить, установив например 5.
STM32 ONE PULSE MODE.
комментарии
0