用 stm32f407 的 TIM1 和 TIM8 级联组成 32 位计数器,TIM1 作为主计数器,TIM8 作为从计数器配置代码如下
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB2PeriphClockCmd (STD_TIM1_CLK, ENABLE); /// 使能标准频率时钟 1
RCC_APB2PeriphClockCmd (STD_TIM2_CLK, ENABLE); /// 使能标准频率时钟 2
// 标准频率定时器 1 配置
TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; // 自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = 0; // 定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(STD_TIM1, &TIM_TimeBaseInitStructure);
TIM_SetCounter (STD_TIM1, 0); // 清零计数器 CNT
TIM_SelectOutputTrigger (STD_TIM1, TIM_TRGOSource_Update);//Tim1 更新输出作为触发信号
// 标准频率定时器 2 配置
TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; // 自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = 0; // 定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(STD_TIM2, &TIM_TimeBaseInitStructure);
TIM_SetCounter (STD_TIM2, 0); // 清零计数器 CNT
TIM_SelectMasterSlaveMode (STD_TIM2, TIM_MasterSlaveMode_Enable);// 主从模式 MSM
TIM_SelectSlaveMode (STD_TIM2, TIM_SlaveMode_External1);// 从模式外部触发模式
TIM_SelectInputTrigger (STD_TIM2, TIM_TS_ITR0);// 触发选择,ITR0 即 TIM1
TIM_Cmd(STD_TIM2, ENABLE);
其中 STD_TIM1 是 TIM1,STD_TIM2 是 TIM8.
我在 main 函数中启动 TIM1 后,用另一定时器 TIM2 定时 1 秒,在 TIM2 中断中用 TIM_GetCounter (STD_TIM2) * 65536 + TIM_GetCounter (STD_TIM1) 语句读出的数据是 4217116,
但是 TIM1 和 TIM8 的时基都应该是 168M,并且我没有配置分频,请问这个的原因是什么?
我用 TIM_GetCounter (STD_TIM2) * 65536 * 4 + TIM_GetCounter (STD_TIM1) 才能得到 168000000 的计数值。
经我仔细测试,发现只要TIM1计数不超过65535,也就是没有UEV更新事件时,计数值是正确的 |