KLIM83 (04.04.2014 14:58 - 15:07, просмотров: 148) ответил Codavr на А поподробнее?
Нужно сконфигурировать таймер так, чтобы выходная цепь давала то, что нам нужно. При этом режим работы порта должен быть настроен на работу с соответствующей функцией. Вот кусок исходника, который инициализировал таймер, дабы он пищал динамиком.
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 12; // 1 kHz
TIM2->ARR = 255; // период ШИМ
//TIM2->DIER |= TIM_DIER_UIE;
TIM2->CCR2 = 127 ; // длительность
TIM2->CCMR1&= ~TIM_CCMR1_CC2S; // capture/compare select - compare
TIM2->CCMR1&=~TIM_CCMR1_OC2M_0; // PWM channel2
TIM2->CCMR1|= TIM_CCMR1_OC2M_1;
TIM2->CCMR1|= TIM_CCMR1_OC2M_2;
TIM2->CCMR1|= TIM_CCMR1_OC2PE;
TIM2->CCER |= TIM_CCER_CC2E|TIM_CCER_CC2P; // cc2e - enable, cc2p-polarity
TIM2->CR1 |= TIM_CR1_ARPE;
//TIM2->CR1 |= TIM_CR1_CEN;
Когда настаёт пора пищать, меняем режим порта c GPIO на альтернативную функцию.
GPIO_InitTypeDef GPIO_Config;
GPIO_Config.GPIO_Pin = GPIO_Pin_1;
GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_Config);
TIM2->CR1 |= TIM_CR1_CEN;
Когда надо прекратить пищать, меняем обратно на GPIO и переводим в требуемый логический уровень.
TIM2->CR1 &= ~TIM_CR1_CEN;
GPIOA->CRL &= ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1);
GPIOA->CRL |= GPIO_CRL_MODE1_0;
GPIO_SetBits( GPIOA, GPIO_Pin_1);
Сейчас я бы сделал иначе, но на STM уже не работаю, поэтому- как есть.