1、STM32F103

1.1、初始化函数

  1. #include "bsp_pwm.h"
  2. void BSP_PWM_INIT(uint16_t arr,uint16_t psc)
  3. {
  4. //打开时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  6. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  7. //引脚初始化
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
  11. //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  16. }
  17. //定时器初始化
  18. {
  19. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  20. TIM_TimeBaseStructure.TIM_Period = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  21. TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //设置用来作为TIMx时钟频率除数的预分频值
  22. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  23. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  24. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  25. }
  26. //PWM初始化
  27. {
  28. TIM_OCInitTypeDef TIM_OCInitStructure;
  29. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  30. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  31. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  32. TIM_OCInitStructure.TIM_Pulse = 0;
  33. TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
  34. }
  35. //使能定时器和预装载值
  36. {
  37. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  38. TIM_Cmd(TIM3, ENABLE); //使能TIM3
  39. }
  40. }

1.2、使用方法

2、STM32F407

2.1、初始化函数

  1. #include "bsp_pwm.h"
  2. void BSP_TIM14_PWM_INIT(uint32_t arr,uint32_t psc)
  3. {
  4. //时钟打开
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
  6. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
  7. //引脚初始化
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
  14. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  15. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  16. GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
  17. }
  18. //定时器初始化
  19. {
  20. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  21. TIM_TimeBaseStructure.TIM_Period=arr-1; //自动重装载值
  22. TIM_TimeBaseStructure.TIM_Prescaler=psc-1; //定时器分频
  23. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  24. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  25. TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
  26. }
  27. //PWM初始化
  28. {
  29. TIM_OCInitTypeDef TIM_OCInitStructure;
  30. //初始化TIM14 Channel1 PWM模式
  31. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  32. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  33. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
  34. TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
  35. }
  36. //使能定时器
  37. {
  38. TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
  39. TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
  40. TIM_Cmd(TIM14, ENABLE); //使能TIM14
  41. }
  42. }

2.2、使用方法