• STM32 通用定时器的几种配置方式


    STM32 通用定时器的几种配置方式

    //------------------------------------------------------------------------------
    // 1、普通定时使用
    
    #include"stm32f10x.h"
    #include"time.h"
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    
    static void Time_Config( void )
    {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );
      //TIM_DeInit(TIM2);
      TIM_TimeBaseInitStructure.TIM_Prescaler = ( 10000 - 1 );      //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period = ( 7200 - 1 );       //自动重装寄存器
      TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分割,这里不涉及
    #if 0
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter; 
        //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
      TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
      TIM_ITConfig( TIMx, TIM_IT_Update, ENABLE );           //中断配置
      TIM_Cmd( TIMx, ENABLE );                //启动定时器
    }
    
    void Time_Init( void )
    {
      Time_Config( );       //定时器配置
      Time_NVIC_Config( );      //嵌套中断向量初始化
    }
    
    //------------------------------------------------------------------------------
    // 2、PWM输出
    
    #include"stm32f10x.h"
    #include"time.h"
    
    #if 1
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    #endif
    
    void Time_OUT_PWM_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
      GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               //复用推免式输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
    }
    
    static void Time_OUT_PWM_Config( void )
    {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
      TIM_DeInit( TIM2 );
      
      TIM_TimeBaseInitStructure.TIM_Prescaler = ( 100 - 1 );      //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period = ( 1000 - 1 ); //自动重装寄存器    PWM频率:72M/100/1000=720Hz
      TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
    #ifdef Time1
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
      TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
        
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式  OCx电平根据ARR与CCRx比较结果发生反转
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道1
    #ifdef Time1
        TIM_OCInitStructure.TIM_OutputNState =;
    #endif
      TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;         //占空比800/1000
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //计数器值小于CCR值时输出高电平
    #ifdef Time1
        TIM_OCInitStructure.TIM_OCNPolarity =;
        TIM_OCInitStructure.TIM_OCIdleState =;
        TIM_OCInitStructure.TIM_OCNIdleState =;
    #endif
      
      TIM_OC1Init( TIMx, &TIM_OCInitStructure );
      TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable );         //使能CCR1预装载
        
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道2
      TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
      
      TIM_OC2Init( TIMx, &TIM_OCInitStructure );
      TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable );
      
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道3
      TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
      
      TIM_OC3Init( TIMx, &TIM_OCInitStructure );
      TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable );
      
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道4
      TIM_OCInitStructure.TIM_Pulse = CCR4_VAL;
      
      TIM_OC4Init( TIMx, &TIM_OCInitStructure );
      TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
      TIM_ARRPreloadConfig( TIMx, ENABLE );            //开启ARR预装载
      TIM_Cmd( TIMx, ENABLE );                //启动定时器
    }
    
    void Time_OUT_PWM_Init( void )
    {
      Time_OUT_PWM_GPIO_Config( );
      Time_OUT_PWM_Config( );       //定时器配置
    }
    
    //------------------------------------------------------------------------------
    //  3、输出比较模式
    
    #include"stm32f10x.h"
    #include"time.h"
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    
    static void Time_OUT_PWM_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
      GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    //复用推免式输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
    }
    
    static void Time_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE );
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //通用推免式输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( GPIOD, &GPIO_InitStructure );
    }
    
    static void Time_OUT_PWM_Config( void )
    {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
      TIM_DeInit( TIM2 );
      
      TIM_TimeBaseInitStructure.TIM_Prescaler = ( 100 - 1 );      //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period = ( 1000 - 1 ); //自动重装寄存器    PWM频率:72M/100/1000=720Hz
      TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
    #ifdef Time1
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
      TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
        
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;  //ARR与CCRx相同时强制OCxREF为低
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道1
    #ifdef Time1
        TIM_OCInitStructure.TIM_OutputNState =;
    #endif
      TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OCx=!OCxREF    _High OCx=OCxREF
    #ifdef Time1
        TIM_OCInitStructure.TIM_OCNPolarity =;
        TIM_OCInitStructure.TIM_OCIdleState =;
        TIM_OCInitStructure.TIM_OCNIdleState =;
    #endif
      
      TIM_OC1Init( TIMx, &TIM_OCInitStructure );
      TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable );         //使能CCR1预装载
      TIM_ITConfig( TIMx, TIM_IT_CC1, ENABLE );            //使能OC1比较中断
        
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;    //ARR与CCRx相同时强制OCxREF为高
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道2
      TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OCx=!OCxREF    _High OCx=OCxREF     
        
      TIM_OC2Init( TIMx, &TIM_OCInitStructure );
      TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable );
      TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE );
      
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;    //ARR与CCRx比较结果对OCxREF无效
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道3
      TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
      TIM_ITConfig( TIMx, TIM_IT_CC3, ENABLE );
      
      TIM_OC3Init( TIMx, &TIM_OCInitStructure );
      TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable );
      
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //ARR与CCRx比较结果对OCxREF采用PWM1模式
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道4
      TIM_OCInitStructure.TIM_Pulse = CCR4_VAL;
      //TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE);             //PWM就没有必要设置中断 当然也可以在中断里面改变占空比
      TIM_OC4Init( TIMx, &TIM_OCInitStructure );
      TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
      TIM_ARRPreloadConfig( TIMx, ENABLE );            //开启ARR预装载
      TIM_Cmd( TIMx, ENABLE );                //启动定时器
    }
    
    void Time_OUT_PWM_Init( void )
    {
      Time_OUT_PWM_GPIO_Config( );
      Time_GPIO_Config( );
      Time_NVIC_Config( );
      Time_OUT_PWM_Config( );       //定时器配置
    }
    
    //------------------------------------------------------------------------------
    // 4、PWMI模式
    #include"stm32f10x.h"
    #include"time.h"
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    
    static void Time_IN_PWM_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
      GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;             //浮空输入模式
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
    }
    
    static void Time_IN_PWM_Config( void )
    {
    #if 0
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    #endif
      TIM_ICInitTypeDef TIM_ICInitStructure;
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
      TIM_DeInit( TIM2 );
    #if 0
      
      TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1);      //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period =(1000-1);//自动重装寄存器    PWM频率:72M/100/1000=720Hz
      TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision =0;//时钟分频,这里不涉及
    #ifdef Time1
      TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);        //配置参数
      TIM_ClearITPendingBit(TIMx,TIM_IT_Update);//清除中断标示位
    #endif
      
      TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
      TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
      TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
                                                                      // connected to IC1, IC2, IC3 or IC4, respectively */
      TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //无预分频
      TIM_ICInitStructure.TIM_ICFilter = 0x0;       //无滤波
      TIM_ICInit( TIMx, &TIM_ICInitStructure );    //初始化PWM输入模式 //参见函数体与参考手册关于PWMI说明
      TIM_PWMIConfig( TIMx, &TIM_ICInitStructure );
      TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数
        
      TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Reset ); //选择从模式控制器为复位模式,选中的TRGI上升沿重新初始化计数器
      //从模式控制器连接到TI1FP1 TI2FP2 只要两者有效为设置的电平,就会复位计数器 参见TIME结构图
      
      TIM_SelectMasterSlaveMode( TIMx, TIM_MasterSlaveMode_Enable ); //使能主从模式 ??????????????????
        
      TIM_Cmd( TIMx, ENABLE );
      
      TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE );
    }
    
    void Time_IN_PWM_Init( void )
    {
      Time_IN_PWM_GPIO_Config( );
      Time_NVIC_Config( );
      Time_IN_PWM_Config( );       //定时器配置
    }
    
    //------------------------------------------------------------------------------
    // 5、单脉冲模式
    
    #include"stm32f10x.h"
    #include"time.h"
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    
    static Time_SinglePluse_IN_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
      GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;             //浮空输入模式
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
    }
    
    static Time_SinglePluse_OUT_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
      GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //推免复用输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
    }
    
    static void Time_SinglePluse_Config( void )
    {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      TIM_ICInitTypeDef TIM_ICInitStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
      TIM_DeInit( TIM2 );
      
      TIM_TimeBaseInitStructure.TIM_Prescaler = 1;              //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period = 65535;           //自动重装寄存器
      TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
    #ifdef Time1
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
      TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
        
      TIM_ICStructInit( &TIM_ICInitStructure );
      
      TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;     //通道2为输入
      TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
      TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
                                                                      // connected to IC1, IC2, IC3 or IC4, respectively*/
      TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //无预分频
      TIM_ICInitStructure.TIM_ICFilter = 0x0;       //无滤波
      TIM_ICInit( TIMx, &TIM_ICInitStructure );           //初始化输入模式
      TIM_SelectOnePulseMode( TIMx, TIM_OPMode_Single ); //选择单脉冲模式  这样 下一次更新时间是停止计数器
      TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数
      TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Trigger ); //选择从模式控制器为触发模式 其连接到了TI2FP2  让从模式控制器启动计数器
        
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     //使能通道
    #ifdef Time1
        TIM_OCInitStructure.TIM_OutputNState =;
    #endif
      TIM_OCInitStructure.TIM_Pulse = 12345;       //CCRx里面存放的值
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //OCREF与OC实际输出相同
    #ifdef Time1
        TIM_OCInitStructure.TIM_OCNPolarity =;
        TIM_OCInitStructure.TIM_OCIdleState =;
        TIM_OCInitStructure.TIM_OCNIdleState =;
    #endif
      TIM_OC1Init( TIMx, &TIM_OCInitStructure );           //使用通道1作为单脉冲的输出通道
        
      //TIM_Cmd(TIMx, ENABLE);                //使用TI2FP1来触发定时器,不需要软件启动定时器  
    }
    
    void Time_SinglePluse_Init( void )
    {
      Time_SinglePluse_IN_GPIO_Config( );   //配置time2的通道2为输入
      Time_SinglePluse_OUT_GPIO_Config( );  //配置time2的通道1为输出
      Time_NVIC_Config( );       //可以不用
      Time_SinglePluse_Config( );     //定时器配置
    }
    
    //------------------------------------------------------------------------------
    // 6、定时器联级
    
    #include"stm32f10x.h"
    #include"time.h"
    
    static Time_NVIC_Config( void )
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
      NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init( &NVIC_InitStructure );
    }
    
    static Time_Connect_GPIO_Config( void )
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6; //time2 ch1 pin.0 time3 cha1 pin.6
      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_6;             //time4 ch1 pin.6   
      GPIO_Init( GPIOB, &GPIO_InitStructure );
    }
    
    static void Time_Connect_Config( void )
    {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;
      RCC_APB1PeriphClockCmd(
        RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE );
      TIM_DeInit( TIM2 );
      TIM_DeInit( TIM3 );
      TIM_DeInit( TIM4 );
      
      TIM_TimeBaseInitStructure.TIM_Prescaler = 0;              //时钟分频系数
      TIM_TimeBaseInitStructure.TIM_Period = 99;           //自动重装寄存器
      TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
      TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
    #ifdef Time1                  //或者Time8
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
    #endif
      TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure );        //配置参数
      TIM_ClearITPendingBit( TIM2, TIM_IT_Update );          //清除中断标示位
        
      TIM_TimeBaseInitStructure.TIM_Period = 5;
      TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
      TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
      
      TIM_TimeBaseInitStructure.TIM_Period = 5;
      TIM_TimeBaseInit( TIM4, &TIM_TimeBaseInitStructure );
      TIM_ClearITPendingBit( TIM4, TIM_IT_Update );
      
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     //使能通道
      TIM_OCInitStructure.TIM_Pulse = 49;           //CCRx里面存放的值
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //OCREF与OC实际输出相同
      TIM_OC1Init( TIM2, &TIM_OCInitStructure );           //使用通道1作为单脉冲的输出通道
      TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable );      //使能主从模式
        
      TIM_SelectOutputTrigger( TIM2, TIM_TRGOSource_Update );   //选择Time2的更新事件作为触发输出
        
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_Pulse = 3;
      
      TIM_OC1Init( TIM3, &TIM_OCInitStructure );
      TIM_OC1Init( TIM4, &TIM_OCInitStructure );
      
      TIM_SelectSlaveMode( TIM3, TIM_SlaveMode_Gated );         //从模式的输入触发选择为门控模式
      TIM_SelectInputTrigger( TIM3, TIM_TS_ITR1 ); //从模式触发源选择为内部触发1?????????????为什么是内部触发1 不是0 2 3
      //原因:ITR0 ITR1 ITR2 ITR3 对应主模式的TIM2 TIM3 TIM4 TIM5
      
      TIM_SelectSlaveMode( TIM4, TIM_SlaveMode_Gated );
      TIM_SelectInputTrigger( TIM4, TIM_TS_ITR1 );
      
      TIM_Cmd( TIM2, ENABLE );
      TIM_Cmd( TIM3, ENABLE );
      TIM_Cmd( TIM4, ENABLE );
    }
    
    void Time_Connect_Init( void )
    {
      Time_Connect_GPIO_Config( );
      Time_NVIC_Config( );      //可以不用
      Time_Connect_Config( );     //定时器配置
    }
  • 相关阅读:
    我对什么是真正的对象,以及软件中的对象在分析阶段、设计阶段、实现阶段的一些看法
    通过分析蜘蛛侠论坛中的版块管理功能来介绍该如何使用我开发出来的ROM框架
    蜘蛛侠论坛核心框架分析1 如何设计与实现当前访问用户
    关于DDD领域驱动设计的理论知识收集汇总
    分享一个简易的ORM框架源代码以及基于该框架开发的一个简易论坛源代码
    微软的一个开源项目Oxite学习后的感受
    AgileEAS.NET平台开发实例药店系统UI层分析
    AgileEAS.NET平台开发实例药店系统BLL层分析
    AgileEAS.NET平台开发实例药店系统DAL层解析
    AgileEAS.NET平台开发实例药店系统系统架构设计
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4761378.html
Copyright © 2020-2023  润新知