基于stm32 f103 pwm 的理解,完成了stm32 f373 pwm 波的配置

与 f103 pwm 配置不同(也就是引脚复用)

 源码:PA0 TIM19_CH1

int main(void)
{
    
    u16 led0pwmval=0;    
    u8 dir=1;
      
    TIM4_PWM_Init(899,0);     //不分频。PWM频率=72000000/900=80Khz  函数名可以随便设,此处不想改了

    while(1)
    {
        Delay_ms(10);
        if(dir)
            led0pwmval++;        
        else 
            led0pwmval--;         
        if(led0pwmval>300)
            dir=0;        
        if(led0pwmval==0)
            dir=1;                     
        TIM_SetCompare1(TIM19,led0pwmval);        
    }
}

 

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE); 
  //端口初始化
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    // 复用推挽输出      
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_11);//配置端口为某个复用功能

/* GPIO_PinAFConfig();把这个函数单独列出来,是因为只是看函数的话,按F12,会容易把 GPIO_AF_11写成 GPIO_AF_2了,此处一定要去看下数据手册*/


    
  //定时器初始化
    TIM_TimeBaseStructure.TIM_Period =arr;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = psc;         //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;    //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
  TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
    //设置定时器的工作模式
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       //配置定时器为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
  //TIM_OCInitStructure.TIM_Pulse = 12000;       //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  TIM_OC1Init(TIM19, &TIM_OCInitStructure);     //使能通道1
  TIM_OC1PreloadConfig(TIM19, TIM_OCPreload_Enable);
    //使能定时器
    TIM_ARRPreloadConfig(TIM19, ENABLE);             // 使能TIM5重载寄存器ARR
  TIM_Cmd(TIM19, ENABLE);                   //使能定时器5
    

}

 源码:PA1 TIM19_CH2

int main(void)
{
    
    u16 led0pwmval=0;    
    u8 dir=1;
      
    TIM4_PWM_Init(899,0);     //不分频。PWM频率=72000000/900=80Khz

    while(1)
    {
        Delay_ms(8);        //变了
        if(dir)
            led0pwmval++;        
        else 
            led0pwmval--;         
        if(led0pwmval>300)
            dir=0;        
        if(led0pwmval==0)
            dir=1;                     
        TIM_SetCompare2(TIM19,led0pwmval);           //变了
    }
}

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE); 
  //端口初始化
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;                     //变了
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    // 复用推挽输出      
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_11);//配置端口为某个复用功能

                                                                 //可能
    
  //定时器初始化
    TIM_TimeBaseStructure.TIM_Period =arr;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = psc;         //设置预分频:不预分频,即为72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;    //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
  TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
    //设置定时器的工作模式
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       //配置定时器为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
  //TIM_OCInitStructure.TIM_Pulse = 12000;       //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //当定时器计数值小于CCR1_Val时为高电平  

                  // 见 f103 ch1 与 ch2  ch1是cnt<ccrx 为有效电平  ch2是cnt>ccrx 为有效电平

                 // ccrx 是TIM_SetCompare2(TIM19,led0pwmval);    不断变化,cnt 是由时钟不断+1,

                // 中断触发 是由  TIM4_PWM_Init(899,0);   899决定,一旦 cnt + 到 899,cnt 被清0 ,重新计数,此处未写中断触发
  TIM_OC2Init(TIM19, &TIM_OCInitStructure);     //使能通道1  变了
  TIM_OC2PreloadConfig(TIM19, TIM_OCPreload_Enable); //使能定时器 变了
    TIM_ARRPreloadConfig(TIM19, ENABLE);             // 使能TIM5重载寄存器ARR
  TIM_Cmd(TIM19, ENABLE);                   //使能定时器5
    

}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值