STM32高级定时器 time1
  pbfHt7yP3Hym 2023年11月02日 59 0

高级定时器和基本定时器通用定时器有较大区别。

基本定时器就只能进行定时操作。且CNT只能加。

基本定时器能进行定时,PWM的生产,输入捕获啥的

高级定时器能定时/PWM。输入捕获,输出互补和死区刹车的生产。

高级定时器定时器1有4个中断函数/含中断源。

中断源:

TIM1_BRK_IRQn  //打破中断             = 24,     /*!< TIM1 Break Interru   TIM1_UP_IRQn   更新中断//定时            = 25,     /*!< TIM1 Update Inte  TIM1_TRG_COM_IRQn     定时器触发器交换中断      = 26,     /*!< TIM1  TIM1_CC_IRQn    CCR寄存器中断

中断函数:

TIM1_BRK_IRQHandler        ; TIM1 Break

TIM1_UP_IRQHandler         ; TIM1 Update

TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation

IM1_CC_IRQHandler


正常定时使用和其他没什么区别,就中断函数,中断源不同

使用:

1:开启相关时钟

2:初始化定时器

3:初始化NVIC

4:选择定时器中断源

5:CMD定时器 开启

时钟计算看参考前面文章

#include "time.h"

/*

函数名:void rgb_init(void)

功能:初始化GPIOB

形参:

*/

void rgb_init(void)

{

 GPIO_InitTypeDef GPIOB_InitStruct;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GBIOB的时钟

 GPIOB_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO模式 推挽

 GPIOB_InitStruct.GPIO_Pin|=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;//引脚选择

 GPIOB_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速度

 GPIO_Init(GPIOB,&GPIOB_InitStruct);

GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);//初始化时电平置高//电路驱动默认不启动

}

/*

函数名:void nvic_init(void)

功能:初始化nvic

形参:

*/

void nvic_init(void)

{

NVIC_InitTypeDef NVIC_tim1_InitStruct;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组

NVIC_tim1_InitStruct.NVIC_IRQChannel=TIM1_UP_IRQn;//NVIC中断源选择   //  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    CCR寄存器中断

NVIC_tim1_InitStruct.NVIC_IRQChannelCmd=ENABLE;//开启定时器1的中断

NVIC_tim1_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//分组强

NVIC_tim1_InitStruct.NVIC_IRQChannelSubPriority=2;//子优先

NVIC_Init(&NVIC_tim1_InitStruct);

}

/*

函数名:void time2_init(void)

功能:初始化定时器2

形参:

*/

void time1_init(void)

{

 TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//开启定时器2的时钟

 TIM1_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//定时器不分频  分频 系统时钟/分频

 TIM1_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计时模式 向上

 TIM1_TimeBaseInitStruct.TIM_Period=719;//per 预分系数    决定频率  

 TIM1_TimeBaseInitStruct.TIM_Prescaler=9999;//arr 重载值   实际计算 定时器时钟/arr+1/per+1=时间    1/时间=

 TIM1_TimeBaseInitStruct.TIM_RepetitionCounter=0;

 TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);

 TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE);//开启定时器2的中断

 TIM_Cmd(TIM1,ENABLE);//定时器开始定时

}

/*

函数名:TIM2_IRQHandler(void)

功能:定时器2中断 0.1S进入中断

形参:

*/

u16 temp=0;

void TIM1_UP_IRQHandler(void)  //有4个不同的中断函数

{  


 if(TIM_GetITStatus(TIM1,TIM_IT_Update))

 {

 temp++;

 if(temp<10)

 {

  GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);

 }

 else if(temp>10&&temp<=20)

 {

  GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);

  if(temp>=20)

  {

   temp=0;

  }

 }


 }

 TIM_ClearITPendingBit(TIM1,TIM_IT_Update);

}

MAIN使用

NVIC在定时器初始化前就好了。





【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  tprTMCWDkFAR   2023年12月07日   31   0   0 头文件#include初始化
pbfHt7yP3Hym