Янв 302013
 

Для предыдущей статьи сделал небольшое дополнение – добавил код формирования PWM сигнала таймером для платы STM32L-DISCOVERY. Отличия здесь совсем небольшие, в инициализации вывода порта, да еще частота тактирования другая – здесь по дефолту используется источник MSI с частотой 2.097 МГц.

#include "stm32l1xx.h" 

int main()
 {
  /*Инициализация GPIOA. Вывод PA1 настраивается для работы с выходом TIM2_CH2*/
  RCC->AHBENR |=RCC_AHBENR_GPIOAEN;//Тактирование GPIOA
  GPIOA->MODER |= GPIO_MODER_MODER1_1;//PA1 - output AF
  GPIOA->OTYPER &= ~GPIO_OTYPER_OT_1;//PA1 - Push-Pull
  GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR1;//PA1 - Nopull
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;//PA1 - 40MHz
  GPIOA->AFR[0] = 0x00000010;//PA1 - AFIO1 (TIM2_CH2)

  /*Инициализация таймера TIM2
  Для формирования ШИМ используется канал захвата/сравнения 2 (TIM2_CH2)*/
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;//Тактирование TIM2
  TIM2->CR1 |= TIM_CR1_ARPE;//Включен режим предварительной записи регистра автоперезагрузки
  TIM2->CCMR1 |= TIM_CCMR1_OC2PE;//Включен режим предварительной загрузки регистра сравнения
  TIM2->CCMR1 |= (TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1);//OC2M = 110 - PWM mode 1
  TIM2->ARR = 2096;//Период выходного сигнала T = 1mS
  TIM2->CCR2 = 1677;//Длительность импульса (в данном случае Duty cycle = 80%)
  //TIM2->CCER |= TIM_CCER_CC2P;//Полярность выходного сигнала
  TIM2->CCER |= TIM_CCER_CC2E;//Выход канала захвата/сравнения включен
  TIM2->CR1 |= TIM_CR1_CEN;//Старт счета таймера

  while(1);
 }

pwm_10

pwm_80

Другие статьи: