定时器和PWM学习笔记

1.初始化

定时器初始化.采用STM32F105的PC6配置TIM3, PD12配置TIM4

TIM3部分

(1)根据STM32F105数据手册发现,PC6需要重映射,开启定时器功能

(2)TIM_Period:这个参数代表的是定时器的自动重装载值(Auto-reload value)。当定时器的计数值达到这个值时,定时器就会产生一个中断或更新事件。

(3)TIM_Prescaler:这个参数代表的是定时器的预分频值(Prescaler value)。它决定了定时器的时钟频率被分频的倍数。例如,如果设置TIM_Prescaler为9,那么定时器的时钟频率将被除以9,从而降低定时器的计数速度。
定时器中断时间(ms)=(TIM_Prescaler + 1)* (TIM_Period +1) * 1000 / 时钟频率

(4)TIM_ClockDivision :定时器的时钟频率通常是由外部时钟源提供的,而通过 TIM_Prescaler 预分频器设置后,时钟频率会进一步分频以得到最终的定时器时钟频率。TIM_ClockDivision 可以进一步调整这个分频比例,以满足不同的需求。

  • TIM_CKD_DIV1: 不分频,定时器时钟与输入时钟频率相同。
  • TIM_CKD_DIV2: 时钟频率除以 2。
  • TIM_CKD_DIV4: 时钟频率除以 4。

(5)TIM_CounterMode :定时器的计数模式,包括向上计数、向下计数和中央对齐计数等模式。

(6)TIM_OCMode_PWM2: 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电

(7)TIM_OCPolarity :置有效极性,也就是设置比较输出的有效电平。设置为低电平有效。

(8)TIM_OCIdleState : 空闲时输出的电平

(9)TIM_OutputState: 使能状态

(10) TIM_Pulse :占空比.置定时器的比较寄存器的值,当定时器的计数器值达到比较寄存器的值时,就会触发输出比较事件,从而改变定时器的输出状态

(11) 初始化TIM3的通道1 使能等操作

#define TIM_3_RCC_DIV  (72)                         // 时钟分频
#define TIM_3_RCC_FREQ (72000000 / TIM_3_RCC_DIV)   // 时钟频率
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);   // 配置重映射模式为部分重映射

    TIM_TimeBaseStructure.TIM_Period        = (TIM_3_RCC_FREQ / DRV8711_FREQ_MIN) - 1;   // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler     = TIM_3_RCC_DIV - 1;                         // 设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                         // 设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;                        // TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                      // 根据Struct中指定的参数初始化TIMx的时间基数单位

    TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM2;           //
    TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_Low;        // 输出极性
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;       // 在空闲时输出
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;   // PWM输出使能
    TIM_OCInitStructure.TIM_Pulse       = 100;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);   // 根据T指定的参数初始化外设TIM3 OC1
    TIM_CCxCmd(TIM3, TIM_Channel_1, TIM_CCx_Disable);

    NVIC_InitStructure.NVIC_IRQChannel                   = TIM3_IRQn;   // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;           // 设置主优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;           // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_ClearFlag(TIM3, TIM_FLAG_Update);   // 清除计数器中断标志位

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);   // 开启计数器中断

    TIM_ARRPreloadConfig(TIM3, ENABLE);   // 使能TIMx在ARR上的预装载寄存器

    TIM_Cmd(TIM3, DISABLE);   // 使能TIM

2.常用函数

给自动重装器(TIM_Period)写一个值,想手动给一个重装,就可以用这个函数。

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  /* Set the Autoreload Register value */
  TIMx->ARR = Autoreload;
}

使能/失能定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  
  if (NewState != DISABLE)
  {
    /* Enable the TIM Counter */
    TIMx->CR1 |= TIM_CR1_CEN;
  }
  else
  {
    /* Disable the TIM Counter */
    TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
  }
}

使能/失能PWM输出

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)
{
  uint16_t tmp = 0;

  /* Check the parameters */
  assert_param(IS_TIM_LIST8_PERIPH(TIMx));
  assert_param(IS_TIM_CHANNEL(TIM_Channel));
  assert_param(IS_TIM_CCX(TIM_CCx));

  tmp = CCER_CCE_Set << TIM_Channel;

  /* Reset the CCxE Bit */
  TIMx->CCER &= (uint16_t)~ tmp;

  /* Set or reset the CCxE Bit */ 
  TIMx->CCER |=  (uint16_t)(TIM_CCx << TIM_Channel);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值