Добрый день!
Появилась у меня необходимость задействовать One Pulse Mode на TIM1. (PA9,PA8)
В общем два дня бился бился и никак не смог реализовать. Начитался интернетов, RM , AN4013(STM32 cross-series timer overview)
,но в итоге ничего не добился.
Заглянул в StdPeriph , в примеры и сделал все на TIM4. Работает , как и должно быть. Переписал для TIM1 - не работает. Как не бился, так и не смог запустить. TIM1 ведь более навороченный, может есть какие то нюансы ?
Ну так как здесь не очень любят StdPeriph , то приведу два код(TIM1 и TIM4) на CMSIS и один код(TIM4) на StdPeriph. Вдруг кому пригодиться.
TIM1 - не работает , почему то...
void TIM4_Init_One_Pulse_Mode(void) { uint16_t PrescalerValue = 0; uint16_t Pulse=200; RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // тактирование тамера TIM4 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Тактирование порта B GPIOB->CRL &= !(GPIO_CRL_CNF6_0 | GPIO_CRL_CNF6_1|GPIO_CRL_CNF7_0 | GPIO_CRL_CNF7_1); GPIOB->CRL |= GPIO_CRL_MODE6|GPIO_CRL_CNF6_1; // альтернативная функция 50мГц GPIOB->CRL |= GPIO_CRL_CNF7_0; //плавающий вход PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1; TIM4->ARR =355; TIM4->PSC =PrescalerValue; TIM4->RCR =0; TIM4->CCMR1 |= (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ); // PWM Mode2 TIM4->CCMR1 |= TIM_CCMR1_CC2S_0; //TI TIM4->CCER |= TIM_CCER_CC1E|TIM_CCER_CC2E; // polarity TIM4->SMCR |= (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2); // trig & slave mode TIM4->CCR1 |= Pulse; //pulse TIM4->CR1 |= TIM_CR1_OPM; // Select One-pulse mode }
void TIM1_Init_One_Pulse_Mode(void) { uint16_t PrescalerValue = 0; uint16_t Pulse=200; RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // тактирование тамера TIM1 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Тактирование порта A GPIOA->CRH &= !(GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1|GPIO_CRH_CNF9_0 | GPIO_CRH_CNF9_1); GPIOA->CRH |= GPIO_CRH_MODE8|GPIO_CRH_CNF8_1; // альтернативная функция 50мГц GPIOA->CRH |= GPIO_CRH_CNF9_0; //плавающий вход PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1; TIM1->ARR =355; TIM1->PSC =PrescalerValue; TIM1->RCR =0; TIM1->CCMR1 |= (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ); // PWM Mode2 TIM1->CCMR1 |= TIM_CCMR1_CC2S_0; //TI TIM1->CCER |= TIM_CCER_CC1E|TIM_CCER_CC2E; // polarity TIM1->SMCR |= (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2); // trig & slave mode TIM1->CCR1 |= Pulse; //pulse TIM1->CR1 |= TIM_CR1_OPM; // Select One-pulse mode }
void TIM4_Start(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; uint16_t PrescalerValue = 0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); /* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* TIM4_CH1 pin (PB.06) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* TIM4_CH2 pin (PB.07) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / 72000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 455; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* TIM4 PWM2 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 300; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM4, &TIM_OCInitStructure); /* TIM4 configuration in Input Capture Mode */ TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM4, &TIM_ICInitStructure); /* One Pulse Mode selection */ TIM_SelectOnePulseMode(TIM4, TIM_OPMode_Single); /* Input Trigger selection */ TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2); /* Slave Mode selection: Trigger Mode */ TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger); }
Отредактировано Atomic-dm (2018-05-12 18:05:00)