skqepk 发表于 2018-7-16 23:47:23

跪求,我的STM32f1不能输出PWM

我是初学者,现在用STM32F1.用定时器1,PA8的口输出PWM,但怎样配置都不能有效果输出,求大神支招


int main(void)
{                        
      u16 led0pwmval=0;   
      u8 dir=1;      
      Stm32_Clock_Init(9); //系统时钟设置
      delay_init(72);             //延时初始化
      uart_init(72,9600);//串口初始化
      LED_Init();                           //初始化与LED连接的硬件接口
      TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
         while(1)
      {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                   
                LED0_PWM_VAL=led0pwmval;
               
      }
}


void LED_Init(void)               
{
      
      GPIO_InitTypeDef GPIO_InitStruct;
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
                                                |RCC_APB2Periph_GPIOD
                              |RCC_APB2Periph_GPIOC
                              |RCC_APB2Periph_AFIO, ENABLE);
      
      
      
      GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;               //推挽输出
      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;                         //选择P8口      
      GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;         //50Mhz

      GPIO_Init(GPIOA,&GPIO_InitStruct);

}

void time_Init(void)
{
      
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
      TIM_OCInitTypeDef TIM_OCInitStrue;
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //1
      

      TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
      TIM_TimeBaseInitStrue.TIM_Period      =1000;                //重装载值
      TIM_TimeBaseInitStrue.TIM_Prescaler =72;                //预分频
      TIM_TimeBaseInitStrue.TIM_ClockDivision= TIM_CKD_DIV1;
      TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStrue);
      
//      TIM_OCInitStrue.TIM_OCIdleState
      TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;
//      TIM_OCInitStrue.TIM_OCNIdleState
//      TIM_OCInitStrue.TIM_OCNPolarity
      TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;         //输出极性
//      TIM_OCInitStrue.TIM_OutputNState
      TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;
      TIM_OCInitStrue.TIM_Pulse=300;
      TIM_OC1Init(TIM1,&TIM_OCInitStrue);
      
      TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   //预重装载值(可用可不用)
      
      TIM_Cmd(TIM1,ENABLE);                        //使能定时器
      
      TIM_CtrlPWMOutputs(TIM1,ENABLE);
      
      TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
      
      TIM_ARRPreloadConfig(TIM1, ENABLE);
      
      
}

toofree 发表于 2018-7-17 00:25:06

本帖最后由 toofree 于 2018-7-17 00:30 编辑

程序仿真试过了,没问题。PA8,有0、1交替变化。



查看一下你的SystemCoreClock,是不是72M。如果不是72M的话,肯定是不行的。
但你可以把TIM1的分频系数“TIM_TimeBaseInitStrue.TIM_Prescaler =72;”改小,改小后时钟会快一些。







wenyangzeng 发表于 2018-7-17 07:28:42

本帖最后由 wenyangzeng 于 2018-7-17 07:31 编辑

ST官方代码修改一下就可以了



hzhtianshi 发表于 2018-8-22 12:33:08

正在学习STM32产生PWM波,学习学习!谢谢分享
页: [1]
查看完整版本: 跪求,我的STM32f1不能输出PWM