一:系统滴答定时器SysTick
现在我们想通过Systick定时器做一个精确的延迟函数,比如让LED精确延迟1秒钟闪亮一次。
思路:利用systick定时器为递减计数器,设定初值并使能它后,它会每个1系统时钟周期计数器减,计数到 0时,SysTick计数器自动重装初值并继续计数,同时触发中断。
那么每次计数器减到0,时间经过了:系统时钟周期 *计数器初值。我们使用72M作为系统时钟,那么每次计数器减1所用的时间是1/72M,计数器的初值如果是72000,那么每次计数器减到0,时间经过(1/72M)*72000= 0.001,即1ms。(简单理解:用72M的时钟频率,即1s计数72M=72000000次,那1ms计数72000次,所以计数值为72000)
系统滴答定时器的配置可调用库函数:
SysTick_Config(72000000 / 1000); // 设置计数个数:1/1000s = nTick * 1/72M
// 编写延时函数
void Delay_nMS(u32 nMS)
{
TimingDelay = nMS;
while(TimingDelay != 0);
}
// 在滴答定时器中断中调用
void SysTick_Interrupt_Service(void)
{
if(TimingDelay != 0)
{
TimingDelay--;
}
}
注意:使用时要开总中断:
void Driver_OpenEA(void)
{
// 开总中断
__enable_irq();
}