用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz。APB1域的最大允许频率是36MHz。
定时器时钟频率分配由硬件按以下2种情况自动设置:
- 如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
- 否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。
可以看到定时器2在APB1上,二分频,频率为72MHz,(一分频,重新装载值等设置)
则实现72000000/7200/10000 = 1s的计时
void timer_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1. 开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//2. 开启定时器2内部时钟
TIM_InternalClockConfig(TIM2);
//3. 初始化定时器
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器使用
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
****
}
ConfigCpuTimer(&CpuTimer0,Freq,Period);的三个参数。这里简单注释一下,函数原型为
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
其中Timer的可选参数有三个,就是分别对应的三个定时器
&CpuTimer0 、 &CpuTimer1 、 &CpuTimer2 ;
Freq 为系统时钟单位MHZ,我用的系统时钟为150MHz,所以我在这里填 150;
Period 为期望的定时周期,单位为us 。我的目标是100us,所以我这里填100 ;
分频器的值为150,周期值为100, (150*100)/150MHZ,最后等于100us。
Note:1/100MHz = 1us;
可能有朋友会像我一样疑惑为什么没有涉及到预分频的设置。通过阅读源文件,我发现TI公司直接是对系统时钟不分频CpuTimer0.RegsAddr->TPR.all = 0; CpuTimer0.RegsAddr->TPRH.all = 0; 凭借着自己是个32位的计数器,通过肆意改变定时周期的自动装载值来实现不同时间的定时,超霸气,超简便,超赞。
原文链接:【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)_stm32 外部时钟-CSDN博客
原文链接:DSP28335笔记 —— 定时器_28335 定时器-CSDN博客