tag 标签: 通用定时器

相关博文
  • 热度 14
    2013-7-3 16:01
    1046 次阅读|
    0 个评论
      STM32通用定时器(TIM2-TIM5)是一个可编程预分频器驱动的16位自动装载计数器构成。它能测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)        使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以从几个us到几个ms之间调整。        每个定时器都是完全独立的,没有互相共享任何资源。        使用定时器需要配置控制寄存器(TIMx_CRx)、DMA/中断使能寄存器(TIMx_DIER)、预分频寄存器(TIMx _PSC)、重装载寄存器(TIMx_ARR)四个寄存器:        控制寄存器(TIMx_CRx),低10位有效。        DMA/中断使能寄存器(TIMx_DIER),这是一个16位的寄存器,我们需要使用的是第6位和第0位。第6位TIE为出发中断使能位,通过将该位置1,使能TIMx的中断触发,注意:只要是TIMx需要使用中断,该位必须为1。而第0位,是与徐更新中断位,通过置1,来允许由于更新事件而产生的中断。       预分频寄存器(TIMx_PSC),改寄存器用来设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。而时钟来源是:     1)内部时钟(CK_INT);      2)外部时钟模式1:外部输出脚(TIx);      3)外部时钟模式2:外部触发输入(ETR);      4内部触发输出(ITRx):使用A定时器作为B定时器的预分频器(A为B提供时钟)。       重装载寄存器(TIMx_ARR),该寄存器在物理上实际对应着2个寄存器,一个是程序员可以直接操作的寄存器,另一个是不能直接操作的影子寄存器。       使用通用定时器,需要进行以下几个步骤的设置:       1)TIMx时钟使能;       2)设置TIMx_ARR和TIMx_PSC的值(通过这两个寄存器,设置自动重装载的值,以及分频系数。这两个参数加上时钟分频就决定了定时器的溢出时间);       3)设置TIMx_DIER允许更新中断(使用TIMx的更新中断,要设置DIER的UIE位,并使能触发中断);       4)允许TIMx工作(通过TIMx_CRx的CEN位来设置,开启定时器);       5)TIMx中断分组设置(设置NVIC相关寄存器,使能TIMx中断);       6)编写中断服务参数。 现在分享一下程序大家一起参考: /*================================================================== * Function : Timerx_Init * Description : Init  MSTimer * Input Para : arr: autio reload value.    *                     psc: time prescaler * Output Para : void * Return Value: void * Author: penny * Date: 2013/06/21 ==================================================================*/   void Timerx_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; NVIC_InitTypeDef  NVIC_InitStructure;   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler = (7200-1); //设置用来作为TIMx时钟频率除数的预分频值      10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数模式 TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);       //根据TIM_TimeBaseInitStructure中指定的参数初始化TIMx的时间基数单位   TIM_ITConfig(TIM3, TIM_IT_Update|TIM_IT_Trigger, ENABLE);   //使能触发中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;       //中断分组 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStructure);   TIM_Cmd(TIM3, ENABLE);        //使能定时器   }   void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) !=RESET ) { TIM_ClearITPendingBit(TIM3,  TIM_IT_Update); LED1 = !LED1; } }
  • 热度 17
    2013-6-26 20:20
    1661 次阅读|
    0 个评论
    PWM——Pulse Width Modulation(脉冲宽度调制)。STM32除了基本定时器TIM6和TIM7不能产生PWM,其他定时器都能产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出,通用定时器TIM2-TIM5每个都能同时产生4路PWM输出。      使用通用定时器产生PWM,除了使用到DMA/中断使能寄存器(TIMx_DIER),预分频寄存器(TIMx_PSC),重装载寄存器(TIMx_ARR)还需要用到捕获/比较模式寄存器(TIMx_CCMR1/2),捕获/比较使能寄存器(TIMx_CCER),捕获/比较寄存器(TIMx_CCR1/2/3/4).      捕获/比较模式寄存器(TIMx_CCMR1/2),一个16位寄存器,其中TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。设置OCxM,三位可以配置7种模式,使用PWM模式,这三位必须置为110(PWM模式1)/111(PWM模式2),这两种模式区别在于输出电平的极性相反。      捕获/比较使能寄存器(TIMx_CCER),改寄存器控制着各个输入输出通道的开关,一个16位寄存器。     捕获/比较寄存器(TIMx_CCR1~4),16位寄存器,在输出模式下该寄存器的值与CNT的值比较,根据比较结果产生相应动作,利用这点,我们通过修改这个寄存器的值,就可以控制PWM的输出脉宽。        所以,要实现PWM输出需要一下方法配置端口:        1)开启TIMx时钟,配置相应端口为复用输出;        2)设置TIMx的ARR和PSC。(设置ARR和PSC的值来控制输出PWM的周期);        3)设置TIMx_CHx的PWM模式;        4)使能TIMx的CHx输出,使能TIMx.。(设置TIMx_CCER1和TIMx_CR1来控制开关);        5)修改TIMx_CCRx来控制占空比。       分享一下我调试时的程序: /*================================================================== * Function : PWM_Init * Description : Init  PWM * Input Para : arr: autio reload value.    *                     psc: time prescaler * Output Para : void * Return Value: void * Author: penny * Date: 2013/06/24 ==================================================================*/ void PWM_Init (u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO 复用功能模块时钟使能                                                                                  //用于TIM3的CH4输出的PWM通过该LED显示       //设置PB.1为复用输出功能,输出TIM3_CH4的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0;   //TIM_CH4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure);   TIM_TimeBaseStructure.TIM_Period = arr;     //设置在下一个更新事件装入活动的自动重装载寄存器周期的值   TIM_TimeBaseStructure.TIM_Prescaler = psc;  //设置用来作为TIMx时钟频率除数的预分频值    不分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //TIM向上计数模式 TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);       //根据TIM_TimeBaseInitStruct 中指定的参数初始化TIMx的时间基数单位   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;     //选择定时器模式:TIM脉冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0;      //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //输出极性:TIM输出比较级性高 TIM_OC3Init(TIM3, TIM_OCInitStructure);     //根据TIM_OCInitStruct中指定的参数初始化外设TIM3 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);    //使能TIMx在CCR1上的预装载寄存器   // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;     //选择定时器模式:TIM脉冲宽度调制模式2 // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //比较输出使能 // TIM_OCInitStructure.TIM_Pulse = 0;      //设置待装入捕获比较寄存器的脉冲值 // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //输出极性:TIM输出比较级性高 TIM_OC4Init(TIM3, TIM_OCInitStructure);     //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);    //使能TIMx在CCR2上的预装载寄存器   TIM_ARRPreloadConfig(TIM3, ENABLE);      //使能TIMx在ARR上的预装载寄存器   TIM_Cmd(TIM3, ENABLE);   //使能TIMx外设   }
相关资源
  • 所需E币: 0
    时间: 2021-4-21 02:25
    大小: 603.89KB
    上传者: LiuSirSZ
    STM32F1通用定时器示例详解_OnePulse.pdf
  • 所需E币: 0
    时间: 2021-3-17 17:00
    大小: 6.13MB
    上传者: Argent
    arm公司设计的内核在电子产品MCU中仍占据主流,其设计的armcortex内核有多个系列,根据产品设计需求选择相应的类型,而Cortex-M系列是面向具有确定性的微控制器应用的成本敏感型解决方案,分享关于Cortex-M3的综合性讲解资料,欢迎下载阅读。