STM32f4 使用高级定时器输出PWM波(含代码)

高级定时器概念

高级定时器、通用定时器和普通定时器的区别:

高级定时器

TIM1和TIM8主要特性TIM1和TIM8定时器的功能包括:
● 16位向上、向下、向上/下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 
● 死区时间可编程的互补输出
● 使用外部信号控制定时器和定时器互联的同步电路 
● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 
● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 ─ 输出比较 ─ 刹车信号输入 
● 支持针对定位的增量(正交)编码器和霍尔传感器电路 
● 触发输入作为外部时钟或者按周期的电流管理

通用定时器
TIMx主要功能通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: 
● 16位向上、向下、向上/向下自动装载计数器 
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值 
● 4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 
● 使用外部信号控制定时器和定时器互连的同步电路 
● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 ─ 输出比较 
● 支持针对定位的增量(正交)编码器和霍尔传感器电路 
● 触发输入作为外部时钟或者按周期的电流管理

普通定时器
TIM6和TIM7的主要特性TIM6和TIM7定时器的主要功能包括: 
● 16位自动重装载累加计数器 
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频 
● 触发DAC的同步电路   注:此项是TIM6/7独有功能.
● 在更新事件(计数器溢出)时产生中断/DMA请求


高级定时器配置

这里我使用的TIM1 的2通道,在stm32f4上面 对应的管脚是PB0

void TIM1_CH2N_PWM_Init(u32 arr,u32 psc)
{             

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);      //TIM9时钟使能    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTA时钟    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;//上拉
    GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA3
 
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM1); //GPIOA3复用位定时器9 AF3
    TIM_DeInit(TIM1);
    TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器9

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;//正向输出失能  CH2--失能
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//反向输出使能 CH2N--使能
  TIM_OCInitStructure.TIM_Pulse = 0;
  
    
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM9 OC2
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR2上的预装载寄存器
    TIM_CCxCmd(TIM1,  TIM_Channel_2,  TIM_CCx_Disable);//禁止TIM1-CH2 输出   需要单独使用 TIM1-CH2 时 此处因设置为 禁止TIM1-CH2N 输出
    TIM_ARRPreloadConfig(TIM1,ENABLE);//ARPE使能     
    TIM_Cmd(TIM1, ENABLE);  //使能TIM1
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    TIM_SetCompare2(TIM1, 100);                                      
}  

之后我们在main函数里面调用TIM1_CH2N_PWM_Init就可以了

和普通定时器的设置方法一样,具体如何设置arr和psc大家可以参考stm32f4 生成PWM波_居安士的博客-CSDN博客_stm32产生pwm波

你可能感兴趣的:(stm32,单片机,蓝桥杯)