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

发布者:初入茅庐最新更新时间:2015-10-30 来源: eefocus关键字: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 0

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);
}

[page]

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();     //定时器配置
}

 

    以上,结束。

关键字:STM32  通用定时器  配置方式 引用地址:STM32 通用定时器的几种配置方式

上一篇:STM32 RS485 收发
下一篇:STM32 SPI W25X16驱动

推荐阅读最新更新时间:2024-03-16 14:38

轻松掌握stm32直流电机驱动与测速
  说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了这些大家都懂要不然也不会学习stm32的人那么多!!!   进入我们今天的主题,今天给大家介绍的是stm32中一个很小但是比较实用的stm32直流电机驱动与测速,话不多说先给大家上一段直流电机控制的代码。   void pwm_ARRPreloadConfig(void)   {   PrescalerValue = (uint16_t) (SystemCoreClock /TIM2_rate) - 1; //设定的是定时器的频率,要设定pwm的频率为50hz
[单片机]
STM32之AFIO
也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配,所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。 先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办? 1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图 只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来
[单片机]
<font color='red'>STM32</font>之AFIO
结构体在STM32串口接收中的妙用
结构体C程序中在STM32单片机串口接收的妙用之一 结构体是一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,即tab ={x,x,x,x,x......},i 有多大,数组内元素就有多少.那么我们这时候如果我们用这个数组来接收串口接收信息,信息的格式是: 数据头 数据长度 数据区 数据校验 数据尾. 假设数据区为 身高-体重-性别-年龄-学历 那么我们用数组接收时,提取数据时就需要计算出数据格式中每个单元所对应的位置,即数组中第i个元素对应的内容.这样显然是很麻烦的,效率很低.这就相当于先织了一个大网,捕捉到一网鱼,还得过下称,才能按照重量分类开来一样. 那么如
[单片机]
STM32(五)IIC通信原理及IO口软件模拟编程
一、IIC概述 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机I2C总线系统结构: 二、I2C协议 1、空闲状态 I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 2、开始信号
[单片机]
<font color='red'>STM32</font>(五)IIC通信原理及IO口软件模拟编程
stm32外部中断进入不了的原因分析
最近几天折腾stm32,遇见了很郁闷的问题,外部中断进入不了,最后找到解决方法的时候觉得 唉,下面总结几条原因以便于大家少走弯路。 1.切记打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 2.最好加上一个EXTI_GenerateSWInterrupt(EXTI_LineX);产生软件中断便于判断是不是本来就配置错误; 3.开启硬件仿真: 4.正确设置中断向量地址: #if defined (VECT_TAB_RAM) /* Set the Vector Table base location at 0x20000000 */ NVIC_Se
[单片机]
<font color='red'>stm32</font>外部中断进入不了的原因分析
STM32生态系统工具和软件介绍
STM32能被这么多开发者认可,它的强大生态系统起了关键作用。本文围绕STM32生态各软件工具进行相关描述,其中包含一些技术细节。 一、STM32生态系统总预览STM32提供了全套开发工具,以及开发所需的软件包,下面看一张图,从全局来了解STM32生态系统工具和软件: 主要分为两大类:1.软件工具:即左边部分的STM32CubeMX、 CubeIDE、 CubeProgrammer、 CubeMontor等。 2.嵌入式软件包:STM32CubeMCU Packages 和 扩展软件包CubeExpansions. STM32Cube生态系统几个特点: 免费自由使用; 接口一致,方便移植 可裁剪、可扩展 易使用和理解 节约
[单片机]
<font color='red'>STM32</font>生态系统工具和软件介绍
stm32 iap 程序跳转进入硬件异常 hex合并
工作多年,常常觉得自己遇到的问题及解决办法,时间稍长,就容易遗忘,且没地方查。再者,经常看别人的文章,受益匪浅,自己也有些经验,却从来没有分享出来,深感惭愧。工作忙不是好借口,今日开始开博,不为别的,只为记录、备忘,以及解决其他人可能遇到的相同问题顺利找到解决办法。 问题: stm32f103ret6上做的IAP,仿真调试阶段没有遇到过问题,外场使用就发现不能跳转到app,且不同板子、不同isp等都可能出现这种问题 解决: 直觉上是有规律的,一直找规律,经过一天试验、跟踪、bin代码对比,终于发现bin的最后一部分代码没有成功写入flash。 进一步分析iap的bootloader程序,果然最后不够整页的代码写
[单片机]
应用笔记 | 关闭SPI会导致WRPERR错误的问题分析
01 引言 在STM32的应用中,SPI算是用的比较多的外设了,也是单片机最常见外设之一。客户说它执行了关闭SPI的代码,竟然会导致Flash中的WRPERR标志置位,致使应用碰到一些问题。这就奇怪了,SPI和内部Flash看起来是风马牛不相及的事情,为什么会发生这种事呢?一起来看看吧。 02 问题 2.1 问题起源 客户在使用STM32L072RBT6的时候,使用STM32 CubeL0库,在程序编写时,发现执行关闭SPI代码时,会导致Flash的写保护错误标志WRPERR置位,导致其后面准备写EEPROM的时候,就无法对EEPROM写入了。 客户使用两个标志flag1和flag2,来观察WRPERR标志的变
[单片机]
应用笔记 | 关闭SPI会导致WRPERR错误的问题分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved