Добрый день!
Появилась у меня необходимость задействовать 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)