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