delayInit(72);
传入的实参72是指系统时钟 72MHz,即72000000。
使用此延时函数,必须在程序开始时先调用初始化函数。才能得到延时1us需要的 SysTick->LOAD寄存器值。
由函数delayInit(uint8_t SYSCLK)可知,systick时钟是由系统时钟8分频,也就是9000000。
facUs = 72/8 = 9
?sysTick时钟每震荡1次,计数寄存器 +1,震荡9次的时间是 9(1/9000000)就是1us时间。*
?然后程序中使用延时的时候直接调用,例如 delalyUs(100) 就延时100us,阻塞式延时。
定时器的计数时钟频率是由代码中的预分频器值和自动重装值共同决定的。
如:预分频器的值为7199,自动重装值为49,因此定时器的计数时钟频率为:
计数时钟频率 = 系统时钟频率 / (预分频器 + 1) / (自动重装值 + 1)
在这里,假设系统时钟频率为72MHz,则计数时钟频率为:
计数时钟频率 = 72MHz / (7199 + 1) / (49 + 1) = 10kHz
因此,定时器的计数时钟频率为10kHz。
// 系统时钟频率为72MHz
void Timer1_Init()
{
RCC->APB2ENR|=1<<11;//TIM1时钟使能
TIM1->ARR=49; //设定计数器自动重装值
TIM1->PSC=7199; //预分频器7200,得到10Khz的计数时钟
TIM1->DIER|=1<<0; //允许更新中断
TIM1->DIER|=1<<6; //允许触发中断
TIM1->CR1|=0x01; //使能定时器
MY_NVIC_Init(1,3,TIM1_UP_IRQn,2);// TIM1_UP_IRQn:中断向量表中的中断号,其在中断向量表中的中断处理函数。
}
根据代码中的设置,定时器1的计数器自动重装值为49,预分频器为7199,因此定时器1的计数时钟频率为10kHz。每当计数器计数到49时,就会产生一次定时器更新事件,触发定时器中断处理函数。因此,定时器1的中断处理函数的执行时间为每隔5ms执行一次(1/10kHz * 50 = 5ms)。