2.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) 首先,我们需要有一个72M的systick系统时钟,那么,使用下面这个时钟OK就 ! SystemInit(); 这个函数可以让主频运行到72M。可以把它作为systick的时钟源。 接着开始配置systick,实际上配置systick的严格过程如下: 1、调用SysTick_CounterCmd() --失能SysTick计数器 2、调用SysTick_ITConfig() --失能SysTick中断 3、调用SysTick_CLKSourceConfig() --设置SysTick时钟源。 4、调用SysTick_SetReload() --设置SysTick重装载值。 5、调用SysTick_ITConfig() --使能SysTick中断 6、调用SysTick_CounterCmd() --开启SysTick计数器 这里大家一定要注意,必须使得当前寄存器的值VAL等于0! SysTick->VAL = (0x00);只有当VAL值为0时,计数器自动重载RELOAD。 接下来就可以直接调用Delay();函数进行延迟了。延迟函数的实现中,要注意的是,全局变量TimingDelay必须使用volatile,否则可能会被编译器优化。 下面我们来做一下程序分析: (1)系统时钟进配置 首先我们对系统时钟进行了配置并且SetSysClock(void)函数使用72M作为系统时钟; 为了方面看清代码我选择截图:
|