STM32定时器产生事件TIM_GenerateEvent

  1. 涉及到的寄存器TIMx_EGR,TIMx_SR具体见手册

 

TIMx_EGR产生事件,TIMx_SR读取对应事件的标志位

2.产生事件函数void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);

TIM_EventSource类型:

TIM_EventSource_Update :更新事件,相当于计数到最大值/最小值后产生的更新 

TIM_EventSource_CC1    : 捕获比较事件

TIM_EventSource_CC2    : 捕获比较事件

TIM_EventSource_CC3    : 捕获比较事件

TIM_EventSource_CC4    : 捕获比较事件

TIM_EventSource_COM   : 只有高级定时器有 ,

TIM_EventSource_Trigger :

TIM_EventSource_Break  :  只有高级定时器有,刹车事件,电机控制中使用 

具体哪些定时器可以用到以上的哪些功能,请看数据手册或这个函数的参数说明,我贴一段

3.具体说明每个事件的功能

(1) TIM_EventSource_Update:重新初始化计数器,并产生一个更新事件,具体见下图

一般在定时器初始化时用这个,例如TIM_GenerateEvent(TIM1, TIM_EventSource_Update);

(2)TIM_EventSource_CCx: x=1/2/3/4 捕获比较事件

输出一般是比较PWM输出,若开启对应的中断是指TIM_ITConfig()和一些基本配置;当然也可以触发DMA,比如ADC+DMA模式中,使用外部触发,也可以触发中断(自身比较中断TIM_IT_CC4)

输入一般要读取定时器计数器值(等价于TIMx_CCR1=TIMx_CNT,读取之后TIMx_CNT自动清0),可以一用在BLDC换相60度时间;CC1IF是中断标记,CC1OF是指重复捕获标记 看TIMx_SR状态寄存器可知;也可以触发DMA(比如ADC+DMA模式的外部触发)但用的少,一般也就是触发中断(自身比较中断TIM_IT_CC4)

(3)TIM_EventSource_COM:高级定时器,转为电机控制使用

产生COM事件时,COMG置1,手册中说当CCPC=1时才允许…,我们看一下CCPC在TIMx_CR2中如下

CCPC=1就是使能了预装载(大部分都要使用预装载),所以CCPC=1条件是成立的;那接下来看允许更新CCxE、CCxNE、OCxM位:一般用于电机控制中,CCxE、CCxNE就是一对互补通道使能输出(详细见TIMx_CCER), OCxM是输出比较模式(就是常见的PWM1mode  PWM2Mode等),这个应用详细见另一篇文章。

(4)TIM_EventSource_Trigger:

看以上说明配置TIM_ITConfig(TIM8, TIM_IT_Trigger,ENABLE);则可以触发对应的中断

下图红色框TRGI就是选择触发事件,触发事件有多种,就要选择哪一种了

触发事件类型如下:使用函数TIM_SelectInputTrigger();来选择下面触发类型

比如HALL信号读取使用  TIM_SelectInputTrigger(TIMx, TIM_TS_TI1F_ED); //TI1边沿检测

当然这里还涉及到主从模式配置的问题,后面再写

5)TIM_EventSource_Break:刹车事件,失能定时器输出,输出失能,无刷直流电机控制时,使得3对PWM全部输出低电平(失能后低电平),当然也可以下半桥输出全高,锁定电机,快速停止;当然也可以触发对应的中断和DMA如果使能刹车中断的话 如TIM_ITConfig(TIM8, TIM_IT_Break,ENABLE);,对应中断服务函数TIM8_BRK_TIM12_IRQHandler(),当然还需要相关其他的中断配置;关于触发DMA很少用到

4.使用示例

由以上可以知道,这些事件是软件产生不是硬件产生,说明TIM_GenerateEvent()是设计者由于逻辑关系需要而是产生的事件,这些事件可以设计者软件实现,也可以硬件自动实现(大多时候),只不过有时就是因某种逻辑关系需要软件在某一处产生事件

示例1:

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//中央对齐模式1

  TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD;//设置周期

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;//2倍

  TIM_TimeBaseStructure.TIM_RepetitionCounter = REP_COUNTER;//重复计数器值

TIM_GenerateEvent(TIM8, TIM_EventSource_Update);//相当于TIMx_CNT=0;

示例2:

  /* Time Base configuration */

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//中央对齐模式1

  TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD;//设置周期

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;//2

  TIM_TimeBaseStructure.TIM_RepetitionCounter = REP_COUNTER;//重复计数器值

   

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

   

  /* Channel 1 PWM mode */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

………//中断配置

  TIM_Cmd(TIM8, ENABLE);

   TIM_ITConfig(TIM8, TIM_IT_CC1,ENABLE);

在代码的某一处(设计者根据逻辑功能而定)

TIM_GenerateEvent(TIM8, TIM_EventSource_CC1);//触发CC1中断

//中断服务函数,中断除了程序软件产生,正常来说是有输出比较产生中断(硬件自动)

Void TIM8_CC_IRQHandler(void)

{

if(TIM_GetITStatus(TIMx, TIM_IT_CC1)==SET)

{

}

}

示例3:COM事件 见另一篇文章

示例4:这里我们选择hall信号读取

Hall所在IO口初始化

//定时器初始化

TIM_TimeBaseStructure.TIM_Prescaler = HALL_TIM_PRESCALER_1M;//时钟频率为1MHZ

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseStructure.TIM_Period = HALL_TIM_PERIOD;

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  TIM_SelectInputTrigger(TIM4, TIM_TS_TI1F_ED); //TI1边沿检测 ,选择输入触发

TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset); //从模式选择

在代码的某一处(设计者根据逻辑功能而定)

TIM_GenerateEvent(TIM8, TIM_EventSource_Trigger);//产生触发事件

这个不写中断服务函数了,输入触发类型选择-从模式 配置

一般硬件自动触发,触发时TIMx_CCER=TIMx_CNT(硬件自动),然后TIMx_CNT=0(硬件自动)

示例5:BLDC控制中的刹车功能

Break的基本IO口初始化

    //刹车配置

    /* GPIOA Configuration */

  GPIO_InitStructure.GPIO_Pin = M1_PWM_BRAKE_Pin;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

 

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 

  GPIO_Init(M1_PWM_BRAKE_GPIO_Port, &GPIO_InitStructure);

刹车极性使能配置

  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

……….//对应中断配置

   TIM_ITConfig(TIM8, TIM_IT_Break,ENABLE);//使能刹车中断

在代码的某一处(设计者根据逻辑功能而定)

TIM_GenerateEvent(TIM8, TIM_EventSource_Break);//触发刹车中断

产生事件后,3对PWM输出复位电平

//中断服务函数,中断除了程序软件产生,正常来说是有输出比较产生中断(硬件自动)

Void TIM8_BRK_TIM12_IRQHandler(void)

{

if(TIM_GetITStatus(TIMx, TIM_IT_Break)==SET)

{

}

}

  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在STM32F103单片机中使用TIM1触发TIM_TRGO_RESET的示例代码: ``` // 定义TIM1初始化结构体变量 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 定义TIM1输出比较初始化结构体变量 TIM_OCInitTypeDef TIM_OCInitStructure; // 定义GPIO初始化结构体变量 GPIO_InitTypeDef GPIO_InitStructure; // 使能TIM1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIOA.8为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置TIM1基本参数 TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置TIM1输出比较参数 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 499; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 配置TIM1触发输出 TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Reset); // 启动定时器TIM1 TIM_Cmd(TIM1, ENABLE); ``` 在上述代码中,首先使用`RCC_APB2PeriphClockCmd`函数使能TIM1和GPIOA的时钟。然后,配置GPIOA.8为复用推挽输出,并初始化TIM1的基本参数和输出比较参数。接着,使用`TIM_SelectOutputTrigger`函数配置TIM1的触发输出为TIM_TRGO_RESET。最后,启动TIM1定时器。 需要注意的是,TIM1的输出比较通道1(TIM_OC1)对应的是GPIOA.8引脚。在使用TIM_TRGO_RESET触发时,需要将GPIOA.8设置为复用推挽输出模式。此外,需要根据具体的应用场景和需求,调整TIM1的基本参数和输出比较参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值