OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2379|回复: 1

对F103的高级定时器TIM1的部分参数进行说明

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2017-7-28
在线时间
28 小时
发表于 2019-8-6 14:24:27 | 显示全部楼层 |阅读模式
/****************************************
**对定时器的库函数中各参数进行说明
**此次将在定时器输出PWM信号的同时,启用定时器中断服务。
**没啥特别的,只是可以在必要时节省定时器资源。
**注意:此方法的定时器中断周期与PWM输出周期相同
****************************************
**个人习惯:在初始化操作中使用库函数进行操作;
**    在对时间有要求的地方,建议使用操作寄存器,操作寄存器应采用 & | << 等运算符。
**    在处理乘除法操作时,若跟2有次方关系,可采用移位运算解决,减少处理时间,
**    这样操作不会出现浮点数,先考虑清楚是否需要浮点数。
****************************************/

//pfreq为分频值=系统工作频率/目标频率,
//psc为预分频值,当pfreq的值超过u16时,使用其将系统工作频率分频
void TIM1_PWM_Init(u16 pfreq ,u16 psc)            
{  
    GPIO_InitTypeDef                   GPIO_InitStructure;    //管脚设置
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;            //定时器基本寄存器设置
    TIM_OCInitTypeDef                TIM_OCInitStructure;            //输出通道配置
    TIM_BDTRInitTypeDef           TIM_BDTRInitStructure;        //死区和刹车配置
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
   
    /*            IO口管脚配置        */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;      
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //互补通道
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    /*            定时器1配置            */
    TIM_TimeBaseStructure.TIM_Period            = pfreq;      
    TIM_TimeBaseStructure.TIM_Prescaler         = psc;     
    //时钟分频设置     
    TIM_TimeBaseStructure.TIM_ClockDivision     = TIM_CKD_DIV1;      
    //计数方式:主要分为 向上、向下、中央计数三种,是有区别的。。。
    TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;
    //重复计数器的值 主要针对PWM信号。详见STM32参考手册
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    //初始化
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

   
    /*        PWM通道配置        */
    //PWM模式 1:CNT小于CCR有效  2:CNT大于CCR有效
    TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM2;  
    //设置主/互补输出使能   
     TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;     
    //设置输出PWM占空比    ,右移一位等同于除以2。
    TIM_OCInitStructure.TIM_Pulse        = pfreq >> 1;              
    //主/互补输出高电平有效   
    TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;         
    TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCPolarity_High;  
    //设置主/互补空闲输出状态   
    TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;           
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;      
   
    //初始化定时器通道
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);                              
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);                     
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);                       

    //使能定时器外围设备预加载器
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);   
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);   
    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);      

    /*            死区与互补通道配置        */
    //运行模式下Off-State选择 = 1
    TIM_BDTRInitStructure.TIM_OSSRState       = TIM_OSSRState_Enable;
    //空闲模式下Off-State选择 = 1
    TIM_BDTRInitStructure.TIM_OSSIState       = TIM_OSSIState_Enable;
    //锁定级别为1
    TIM_BDTRInitStructure.TIM_LOCKLevel       = TIM_LOCKLevel_1;
    //死区时间
    TIM_BDTRInitStructure.TIM_DeadTime        = 0x04;     
    //关闭刹车输入
    TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Disable;
    //如开启刹车输入:刹车输入极性为低电平
    TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;
    //禁止自动输出
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
        
    /*            定时器中断                    */
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE );
    //清除中断标志位
    TIM_ClearFlag(TIM1, TIM_FLAG_Break);
    //定时器1中断标识位在stm32f10x.h文件中定义
    //定时器1的中断标识分一下四种,注:不同的版本的库函数其定义可能不同。
    //  TIM1_BRK_IRQn = 24, TIM1 Break Interrupt                                
    //    TIM1_UP_IRQn = 25,  TIM1 Update Interrupt
    //    TIM1_TRG_COM_IRQn = 26, TIM1 Trigger and Commutation Interrupt
    //    TIM1_CC_IRQn = 27, TIM1 Capture Compare
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM1_UP_IRQn;  
    //设置中断优先级、与中断通道使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;         
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 4;         
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;   
    NVIC_Init(&NVIC_InitStructure);   
   
    //使能定时器
    TIM_Cmd(TIM1, ENABLE);         
    //使能外围设备输出,即使能PWM输出
    TIM_CtrlPWMOutputs(TIM1,ENABLE);     
}

//中断函数在启动文件中已经声明
//同理定时器1的中断服务函数也有很多
void TIM1_UP_IRQHandler(void)  
{

    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  
    {            
        /*
        **具体指令
        */
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);   
    }
}


timer_pwm_out.zip

2.37 KB, 下载次数: 20

跟帖子内容一样

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10570
金钱
10570
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-8-6 15:35:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表