写了一个TIM8输出互补85KHz PWM,RCC配置后出来的波形为42.5KHz,不写RCC配置,直接调用SystemInit(),可以正常输出85KHz。
RCC配置有问题吗?请各位大神帮忙看看,谢谢!
还有问题:当我不写RCC_Configuration,也不调用SystemInit(),输出的PWM也是对的85KHz。这种方式与调用SystemInit()以及RCC_Configuration有什么区别?
#include "pwm_85k.h" #include "stm32f10x.h"
#define PWM_Rate 90;//Duty Rate = x % #define InitValue 847;// PWM_clk = £®1/72MHz£©* 847 = 1/85K
u16 TIM_Clk = InitValue; u16 TIM_Rate = PWM_Rate;
void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //∂®“Â√∂柿‡–ÕHSEStartUpStatus RCC_DeInit();//Reset system clk configuration RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp();//wait for HSE startup if(HSEStartUpStatus == SUCCESS) {
FLASH_SetLatency(FLASH_Latency_2);//set flash memory latency 2 cycle FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//enable flash prefetch buffer RCC_HCLKConfig(RCC_SYSCLK_Div1);//option HCLK(AHB) = SYSCLK RCC_PCLK2Config(RCC_SYSCLK_Div1);//set PCLK2(APB2) = SYSCLK RCC_PCLK1Config(RCC_SYSCLK_Div2);//set PCLK1(APB1) = SYSCLK/2 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//set ADC_clk = SYSCLK /6
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//PLL source from HSE, PLL clk = HSE * 9 = 8*9 = 72MHz RCC_PLLCmd(ENABLE);// enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );//waiting for PLL CLK stable RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//set SYSCLK = PLLCLK = 72MHz while(RCC_GetSYSCLKSource() != 0x08);//waiting for SYSCLK = PLLCLK RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_TIM8, ENABLE); //RCC_APB1PeriphClockCmd(); } RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
}
//config TIM1 GPIO void TIM8_GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;//Config TIM1 CH1,CH1N
/* GPIOA and GPIOB clock enable */
/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);
/*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void TIM8_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM8);
/* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = TIM_Clk - 1; TIM_TimeBaseStructure.TIM_Prescaler = 0;//TIM1_CLK = APB2_clk = 72MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00; TIM_TimeBaseInit(TIM8, & TIM_TimeBaseStructure); TIM_ARRPreloadConfig(TIM8, ENABLE); /* PWM1 Mode configuration: TIM1 Channel_1*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = ((float)TIM_Rate/100)*TIM_Clk; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC2Init(TIM8, & TIM_OCInitStructure);//channel 2 timer8 OC init
TIM_Cmd(TIM8, ENABLE); /* TIM1 counter enable */ TIM_CtrlPWMOutputs(TIM8, ENABLE);/* TIM1 Main Output Enable */
}
|