|
参照野火的程序实现PWM波输出,TIM3的定时没有问题,但是依样画葫芦将程序改写成TIM8则无法输出PWM波。我所做的更改是将GPIO配置中APB1改为APB2,由PA口改为PC6,7,8,9,在配置定时器最后的时候增加了TIM_CtrlPWMOutputs(TIM8 ,ENABLE ); 其余没有变动。 如果有任何建议都感激不尽,附文本代码与代码截图。 void TIM8_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* ÉèÖÃTIM8CLK Ϊ 72MHZ */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); /* GPIOC clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /*GPIOC Configuration: TIM8 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ¸´ÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } /** * @brief ÅäÖÃTIM8Êä³öµÄPWMÐźŵÄģʽ£¬ÈçÖÜÆÚ¡¢¼«ÐÔ¡¢Õ¼¿Õ±È * @param ÎÞ * @retval ÎÞ */ /* * TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT ÖØÐ¼ÆÊý * TIMx_CCR(µçƽ·¢Éú±ä»¯) * ÐźÅÖÜÆÚ=(TIMx_ARR +1 ) * ʱÖÓÖÜÆÚ * Õ¼¿Õ±È=TIMx_CCR/(TIMx_ARR +1) */ void TIM8_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //TIM_DeInit(TIM8); // /* PWMÐÅºÅµçÆ½Ìø±äÖµ */ u16 CCR1_Val = 500; u16 CCR2_Val = 375; u16 CCR3_Val = 250; u16 CCR4_Val = 125; /* ----------------------------------------------------------------------- TIM8 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR+1)* 100% = 50% TIM8 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR+1)* 100% = 37.5% TIM8 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR+1)* 100% = 25% TIM8 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR+1)* 100% = 12.5% ----------------------------------------------------------------------- */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 999; //µ±¶¨Ê±Æ÷´Ó0¼ÆÊýµ½999£¬¼´Îª1000´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ TIM_TimeBaseStructure.TIM_Prescaler = 1800; //ÉèÖÃÔ¤·ÖƵ£º1800·ÖƵ£¬¼´Îª40KHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //ÉèÖÃʱÖÓ·ÖÆµÏµÊý£º²»·ÖƵ(ÕâÀïÓò»µ½) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //ÅäÖÃΪPWMģʽ1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //ÉèÖÃÌø±äÖµ£¬µ±¼ÆÊýÆ÷¼ÆÊýµ½Õâ¸öֵʱ£¬µçƽ·¢ÉúÌø±ä TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR1_ValʱΪ¸ßµçƽ TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC1Init(TIM8, &TIM_OCInitStructure); //ʹÄÜͨµÀ1 TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //ÉèÖÃͨµÀ2µÄµçÆ½Ìø±äÖµ£¬Êä³öÁíÍâÒ»¸öÕ¼¿Õ±ÈµÄPWM TIM_OC2Init(TIM8, &TIM_OCInitStructure); //ʹÄÜͨµÀ2 TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //ÉèÖÃͨµÀ3µÄµçÆ½Ìø±äÖµ£¬Êä³öÁíÍâÒ»¸öÕ¼¿Õ±ÈµÄPWM TIM_OC3Init(TIM8, &TIM_OCInitStructure); //ʹÄÜͨµÀ3 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //ÉèÖÃͨµÀ4µÄµçÆ½Ìø±äÖµ£¬Êä³öÁíÍâÒ»¸öÕ¼¿Õ±ÈµÄPWM TIM_OC4Init(TIM8, &TIM_OCInitStructure); //ʹÄÜͨµÀ4 TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM8, ENABLE); // ʹÄÜTIM3ÖØÔØ¼Ä´æÆ÷ARR /* TIM3 enable counter */ TIM_Cmd(TIM8, ENABLE); //ʹÄܶ¨Ê±Æ÷8 TIM_CtrlPWMOutputs(TIM8 ,ENABLE ); |
GPIO_Config
TIM8_Mode_Config
微信公众号
手机版
这个方法不错,每次多赚一分
这个也是借鉴别人的