реклама на сайте
подробности

 
 
> STM32F100 - инициализация таймеров
Veg@
сообщение Jul 21 2014, 15:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Осваиваю работу с АРМ на 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] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016