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);
}
Комментариев нет:
Отправить комментарий