Осваиваю работу с АРМ на STM32VL-Discovery.
Использую 6 таймеров (1,2,3,15,16,17) в режиме ШИМ. Инициализация:
CODE
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_BaseConfig;
TIM_OCInitTypeDef TIM_OCConfig;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_
AFIO, ENABLE);
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_11;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_PinRemapConfig(GPIO_Remap_TIM15, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16|RCC_APB2Periph_TIM17, ENABLE);
TIM_BaseConfig.TIM_Prescaler = (uint16_t)(24000000 / 2000000) - 1;
TIM_BaseConfig.TIM_Period = 400;
TIM_BaseConfig.TIM_ClockDivision = 0;
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_BaseConfig);
TIM_TimeBaseInit(TIM2, &TIM_BaseConfig);
TIM_TimeBaseInit(TIM3, &TIM_BaseConfig);
TIM_TimeBaseInit(TIM15, &TIM_BaseConfig);
TIM_TimeBaseInit(TIM17, &TIM_BaseConfig);
TIM_TimeBaseInit(TIM16, &TIM_BaseConfig);
TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_Pulse = TIM_BaseConfig.TIM_Period/2;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM1, &TIM_OCConfig); //pa11
TIM_OC1Init(TIM2, &TIM_OCConfig); //pa0
TIM_OC3Init(TIM3, &TIM_OCConfig); //pb0
TIM_OC2Init(TIM15, &TIM_OCConfig); //pb15
TIM_OC1Init(TIM16, &TIM_OCConfig); //pb8
TIM_OC1Init(TIM17, &TIM_OCConfig); //pb9
TIM1->BDTR |= TIM_BDTR_MOE;
TIM15->BDTR |= TIM_BDTR_MOE;
TIM16->BDTR |= TIM_BDTR_MOE;
TIM17->BDTR |= TIM_BDTR_MOE;
TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM15, ENABLE);
TIM_Cmd(TIM16, ENABLE);
TIM_Cmd(TIM17, ENABLE);
В данном случае ШИМ присутствует на всех инициализированных выводах. Но если строку RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16|RCC_APB2Periph_TIM17, ENABLE); заменить двумя последовательными инициализациями для таймеров 16 и 17, то на их выходах ШИМ отсутствует. Также, если, например, заменить инициализацию для таймеров 1 и 2 сложением:
Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB1Periph_TIM2, ENABLE);
то отключается ШИМ на выходе таймера 2.
При этом регистры TIMx_CNT инкрементируются для всех таймеров верно. Почему так происходит и что, возможно, я не учитываю?
Сообщение отредактировал IgorKossak - Jul 22 2014, 08:19
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!