STM32 ONE PULSE MODE.
В одном из проектов использовал следующий механизм для управления бузером, включал его вручную, запускал таймер и выключал в прерывании, которое возникало при переполнении таймера. Со временем количество прерываний в проекте выросло и часто другие прерывания не давали сработать прерыванию, в котором выключался бузер. В результате чего, бузер всегда издавал разный по длительности звуковой сигнал. Для решения этой проблемы необходимо было отказаться от прерывания и аппаратно подавать импульс определенной длительности. Ниже приведен код который это делает.
Количество импульсов можно изменить, установив например 5.
//Включаем тактирование 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.
Похожие статьи