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

 
 
> 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
 
Start new topic
Ответов
SasaVitebsk
сообщение Jul 23 2014, 05:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



biggrin.gif
Справедливости ради уже появился sth32cube и там библиотека заменена на HAL и, например, это уже через макросы осуществляется ...
__TIM3_CLK_ENABLE();
__TIM4_CLK_ENABLE();
Кроме того, хочется отметить, что некоторые драйвера написаны очень даже прилично. Я смотрел по диагонали, но всёже например USART, на мой взгляд написан достаточно прилично. Если бы всё уже без этого не работало, то можно было бы воспользоваться даже ... rolleyes.gif
Но работа с GPIO вызывает всё тот же весёлый смех ... ))
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:55
Рейтинг@Mail.ru


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