1、参考资料

     《STM32F1开发指南-库函数版本》-第14章 PWM输出实验

     《STM32中文参考手册V10》-第14章  通用定时器


2、STM32 PWM工作过程

   

python pwm音频输出 pwm输出函数_初始化


    

    ·STM32 PWM工作过程(通道1为例)
      

python pwm音频输出 pwm输出函数_初始化_02


      CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

            CCMR1: OC1M[2:0]位:

                   对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

            CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

            CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。



3、PWM模式1&PWM模式2

    寄存器TIMx_CCMR1的OC1M[2:0]位来分析:
      

python pwm音频输出 pwm输出函数_python pwm音频输出_03


    ·STM32PWM工作过程

      

python pwm音频输出 pwm输出函数_python pwm音频输出_04


    ·STM32 PWM

      

python pwm音频输出 pwm输出函数_引脚_05

     

    ·自动重载的预装载寄存器      

python pwm音频输出 pwm输出函数_python pwm音频输出_06

       

    ·STM32定时器3输出通道引脚
     

python pwm音频输出 pwm输出函数_python pwm音频输出_07

     


4、PWM输出库函数

      void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);    

    typedef struct

        {

          uint16_t TIM_OCMode;  //PWM模式1或者模式2

          uint16_t TIM_OutputState; //输出使能 OR失能

          uint16_t TIM_OutputNState;

          uint16_t TIM_Pulse; //比较值,写CCRx

          uint16_t TIM_OCPolarity; //比较输出极性

          uint16_t TIM_OCNPolarity;

          uint16_t TIM_OCIdleState;  

          uint16_t TIM_OCNIdleState;

        } TIM_OCInitTypeDef;

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

        TIM_OCInitStructure. TIM_Pulse=100;

        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2


     ·设置比较值函数

        void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

     ·使能输出比较预装载:

        void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

     ·使能自动重装载的预装载寄存器允许位

        void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);


    ·要求:

       使用定时器3的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED[PB5]亮度由暗变亮,         又从亮变暗,如此循环。

         

    ·PWM输出配置:

    ①   使能定时器3和相关IO口时钟。

         使能定时器3时钟:RCC_APB1PeriphClockCmd();

         使能GPIOB时钟:RCC_APB2PeriphClockCmd();

        ②     初始化IO口为复用功能输出。函数:GPIO_Init();

                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      

        ③  这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,

               所以需要开启AFIO时钟。同时设置重映射。

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

                GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

        ④    初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

        ⑤    初始化输出比较参数:TIM_OC2Init()

        ⑥   使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

        ⑦   使能定时器。TIM_Cmd();

        ⑧   不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();