请问定时器的重装值要不要和分频系数一样,在目标值的基础上-1?
实测发现,时钟分频7200时,
自动重装载寄存器周期的值如果是10,实测定时器中断周期1.1ms.
自动重装载寄存器周期的值如果是9, 实测定时器中断周期1.0ms.
下面直接上代码、测试结果:
(引用火哥的TIM Base)
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 设置TIM2CLK 为 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//TIM_DeInit(TIM2);
/* 自动重装载寄存器周期的值(计数值) */
TIM_TimeBaseStructure.TIM_Period = 10;
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
/* 时钟预分频数为7200 */
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
/* 对外部时钟进行采样的时钟分频,这里没有用到 */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /*先关闭等待使用*/
}
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
LED1_TOGGLE;
}
}
/* 直接操作寄存器的方法控制IO */
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(GPIOB,GPIO_Pin_0)
|