Страницы

Страницы

среда, 17 декабря 2014 г.

STM32F103 PWM init TIM1

  

  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;       // Enable GPIOB clocking  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;       // Enable GPIOA clocking  RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;       // Enable TIM1 clocking  RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;       // Enable AFIO clocking  //////////////////////////////////////////////////////////////////////////////// GPIO  GPIOB->CRL  = (GPIO_CRL_MODE0 | 
                 GPIO_CRL_CNF0_1
);    // PB0 - Output mode 50 MHz   GPIOB->CRL &= (~GPIO_CRL_CNF0_0);   // and alternate push-pull  //----------------------------------------  GPIOA->CRL |= (GPIO_CRL_MODE7 | GPIO_CRL_CNF7_1); // PA7 - Output mode 50 MHz   GPIOA->CRL &= (~GPIO_CRL_CNF7_0); // and alternate push-pull  //----------------------------------------  GPIOA->CRH |= (GPIO_CRH_MODE8 | 
                 GPIO_CRH_MODE9 
| 
                 GPIO_CRH_CNF8_1 
| 
                 GPIO_CRH_CNF9_1
); // PA8, PA9 - Output mode 50 MHz  GPIOA->CRH &= (~(GPIO_CRH_CNF8_0 | 
                   GPIO_CRH_CNF9_0
)); // and alternate push-pull  GPIOA->ODR = 0x0000;//---------------------------------------
  
AFIO->MAPR |= AFIO_MAPR_TIM1_REMAP_0;
  
AFIO->MAPR &= (~AFIO_MAPR_TIM1_REMAP_1);  //////////////////////////////////////////////////////////////////////////////// PWM Timer 1  TIM1->CR1 = TIM_CR1_ARPE;  TIM1->PSC = 8;  TIM1->ARR = 0x00FF;  
  TIM1
->CCR1 = 100;  TIM1->CCR2 = 0xFF;  TIM1->CCR3 = 0x00;  TIM1->CCR4 = 0x00;  
  TIM1
->CCMR1 = (TIM_CCMR1_OC1PE | TIM_CCMR1_OC1M |                 TIM_CCMR1_OC2PE | TIM_CCMR1_OC2M);  
  TIM1
->CCER = (TIM_CCER_CC1E | /*TIM_CCER_CC1P |*/                TIM_CCER_CC1NE | /*TIM_CCER_CC1NP |*/                TIM_CCER_CC2E | /*TIM_CCER_CC2P |*/                TIM_CCER_CC2NE /*| TIM_CCER_CC2NP*/);  
  TIM1
->BDTR = (TIM_BDTR_MOE | ((4<<5) | 10));  
  TIM1
->CR1 |= TIM_CR1_CEN;



#include "stm32f10x_lib.h"   
#include "pwm.h"   
   
TIM1_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;   
TIM1_OCInitTypeDef  TIM1_OCInitStructure;   
TIM1_BDTRInitTypeDef TIM1_BDTRInitStructure;   
extern GPIO_InitTypeDef GPIO_InitStructure;   
   
void InitPWM(void) {   
   
  // Enable GPIOA and GPIOB clock   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   
   
  // GPIOA Configuration: Channel 1   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
   
  // Enable TIM1 clock   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
   
  // TIM1 Peripheral Configuration   
  TIM1_DeInit();   
   
  // Time Base configuration   
  TIM1_TimeBaseStructure.TIM1_Prescaler = 0x0;   
  TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;   
  // TIM1_TimeBaseStructure.TIM1_Period = 0xFFF; // 12 bit   
  TIM1_TimeBaseStructure.TIM1_Period = 0x3FF; // 10 bit   
  TIM1_TimeBaseStructure.TIM1_ClockDivision = 0x0;   
  TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x0;   
  TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);   
   
   
  // Channel 1 Configuration in PWM mode   
  TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_PWM2;   
  TIM1_OCInitStructure.TIM1_OutputState = TIM1_OutputState_Enable;   
  TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable;   
  TIM1_OCInitStructure.TIM1_Pulse = 0x3FF;   
  TIM1_OCInitStructure.TIM1_OCPolarity = TIM1_OCPolarity_Low;   
  TIM1_OCInitStructure.TIM1_OCNPolarity = TIM1_OCNPolarity_Low;   
  TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Set;   
  TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;   
  TIM1_OC1Init(&TIM1_OCInitStructure);   
   
  // Automatic Output enable, Break, dead time and lock configuration   
  TIM1_BDTRInitStructure.TIM1_OSSRState = TIM1_OSSRState_Enable;   
  TIM1_BDTRInitStructure.TIM1_OSSIState = TIM1_OSSIState_Enable;   
  TIM1_BDTRInitStructure.TIM1_LOCKLevel = TIM1_LOCKLevel_1;   
  TIM1_BDTRInitStructure.TIM1_DeadTime = 0x05;   
  TIM1_BDTRInitStructure.TIM1_Break = TIM1_Break_Disable;   
  TIM1_BDTRInitStructure.TIM1_BreakPolarity = TIM1_BreakPolarity_High;   
  TIM1_BDTRInitStructure.TIM1_AutomaticOutput = TIM1_AutomaticOutput_Enable;   
  TIM1_BDTRConfig(&TIM1_BDTRInitStructure);   
   
  // TIM1 counter enable   
  TIM1_Cmd(ENABLE);   
   
  // Main Output Enable   
  TIM1_CtrlPWMOutputs(ENABLE);   
   
}   
   
void SetDutyPeriod(Int16U period) {   
   
  TIM1_OCInitStructure.TIM1_Pulse = period;   
  TIM1_OC1Init(&TIM1_OCInitStructure);   
   
}   

   

Комментариев нет:

Отправить комментарий