Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F100 ШИМ на PA0

Чт июл 11, 2013 00:02:54

Пытаюсь сгенерировать ШИМ STM32F100 на вывод PA0
Подскажите, что делаю не так ?

Код:
  /*Инициализация GPIOA.
  Вывод PA0 настраивается для работы с выходом TIM2_CH2*/
  RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN); // Тактирование порта GPIOA и альтернативных функций
  GPIOA->CRL |= GPIO_CRL_MODE0;  // Максимальная скорость порта = 50 MHz
  GPIOA->CRL &= ~GPIO_CRL_CNF0;  // Очистка бит CNF[1:0] для PA0 (поскольку после сброса мк задан режим "Input Floating")
  GPIOA->CRL |= GPIO_CRL_CNF0_1; // PA0 - выход Push-Pull в режиме альтернативной функции

  /*Инициализация таймера TIM2
  Для формирования сигнала ШИМ используется канал 2 (TIM2_CH2)*/
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;  // Тактирование таймера TIM2
  TIM2->CR1 |= TIM_CR1_ARPE; //  Включен режим предварительной записи регистра автоперезагрузки
  TIM2->CCMR1 |= TIM_CCMR1_OC1PE;  //  Включен режим предварительной загрузки регистра сравнения
  TIM2->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);  // 110 - PWM mode 1
  TIM2->ARR = 380;//Период выходного сигнала
  TIM2->CCR2 = 100;//Длительность импульса
  TIM2->CCER |= TIM_CCER_CC1E;  // Выход канала захвата/сравнения включен
  TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 05:26:44

может в этом!

GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); //PA0 подключаем к TIM2

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 06:50:19

TIM2->BDTR |= TIM_BDTR_MOE;

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 11:01:26

Вот выдержка из даташита STM32F100xx pin definitions
Код:
PA0-WKUP I/O PA0 WKUP / USART2_CTS/ADC1_IN0 / TIM2_CH1_ETR
PA1 I/O  PA1 USART2_RTS/ ADC1_IN1 /  TIM2_CH2

попробуйте связать pa1 с 2 каналом, или pa0 с 1 каналом

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 11:15:21

HHIMERA писал(а):TIM2->BDTR |= TIM_BDTR_MOE;

А этот регистр есть у таймера 2? Он же вроде есть только у TIM1, TIM8, TIM15, TIM16 и TIM17
И кстати действительно PA0 - это первый канал Tim2, но в коде он и включен TIM2->CCER |= TIM_CCER_CC1E;.
И ремапа никакого не надо, это альтернативная функция.
Можно попробовать без делителей с минимальными настройками:
Код:
TIM2->CCER |= TIM_CCER_CC1E; //Разрешаем таймеру использовать ноги PA0 для ШИМа
TIM2->CCMR1|=(TIM_CCMR1_OC1M_0| TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2); // задаем инверсный ШИМ.
TIM2->CR1 |= TIM_CR1_CEN; //Запускаем таймер!
//После этого пишем данные в TIM2->CCRx - и яркость светодиодов меняется
uint32_t pwm_arr[]={0,0,6553,13107,19660,26214,32768,
39321,45875,52428,58982,65535};
uint8_t i;
while(1){
for (i=1;i<=11;i++) {
TIM2->CCR1=pwm_arr[i];
delay();
}
for (i=11;i>=1;i--) {
TIM2->CCR1=pwm_arr[i];
delay();
}
как в этом примере http://easystm32.ru/for-beginners/35-pwm-in-stm32

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 12:39:31

amv2000 писал(а):
HHIMERA писал(а):TIM2->BDTR |= TIM_BDTR_MOE;

А этот регистр есть у таймера 2? Он же вроде есть только у TIM1, TIM8, TIM15, TIM16 и TIM17

Сорри... точно нету... издержки злокопипаста...

Re: STM32F100 ШИМ на PA0

Чт июл 11, 2013 15:48:25

спасибо. Так заработало:
Код:
  // настроика порта PA0
  GPIOA->CRL |= GPIO_CRL_MODE0;   // максимальная скорость порта = 50 MHz
  GPIOA->CRL &= ~GPIO_CRL_CNF0;   // очистка бит CNF [1:0] для PA0. поскольку после сброса мк задан режим "Input Floating"
  GPIOA->CRL |= GPIO_CRL_CNF0_1;  // PA0 - выход Push-Pull в режиме альтернативной функции

  // инициализация таимера TIM2. используется канал 1
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;  // тактирование таимера TIM2
  TIM2->CCER |= TIM_CCER_CC1E;  // использование порта PA0 для ШИМ
  TIM2->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);  // 110 - PWM mode 1
  TIM2->ARR = 1000;  // период выходного сигнала
  TIM2->CCR1 = 100;  // длительность
  TIM2->CR1 |= TIM_CR1_CEN;  // запуск таимера
Ответить