之前使用SysTick滴答定时器都是通过查找内核编程手册配置寄存器让SysTick滴答定时器工作的。其实在内核相关的头文件core_cm4.h中已经有SysTick滴答定时器的相关配置了。
条件__Vendor_SysTickConfig == 0成立,配置函数才能使用。
刚好在stm32f4xx.h中定义了__Vendor_SysTickConfig = 0,所以可以使用该配置函数。
观察函数__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks),其中的寄存器和我们在Systick查询定时中用到的寄存器其实是一样的。
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//SysTick_LOAD_RELOAD_Msk为24,如果装载值超过24位,返回错误信息
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */
SysTick- >LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
//设中断端优先级
NVIC_SetPriority (SysTick_IRQn, (1UL < < __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick- >VAL = 0UL; /* Load the SysTick Counter Value */
SysTick- >CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0UL); /* Function successful */
}
这种方式没有分频,时钟速度为168Mhz,每秒可计数168000000次,每毫秒可计数168000次,每微秒计数168次。装载值为24位,最大为16777215,可以算得最大延时时间为100ms。
这次的程序不需要上次写的delay文件了,只要在主文件加入SysTick配置函数的头文件core_cm4.h,根据想要定时的时间,计算相应的数值,初始化SysTick配置函数。再调用中断接口封装中断函数,就可以实现SysTick中断了。
如果中断函数像之前那样可能会看不到现象,因为定时时间过短,人眼可能识别不出led灯在闪烁,这里可以添加个计数,相当于定时更长时间才执行想要的程序。
#include "stm32f4xx.h"
#include "led.h"
#include "core_cm4.h"
int main()
{
LED_Init(); //初始化LED灯
SysTick_Config(8400000);//延时50ms 168000000/8400000=20 1000/20=50
while(1)
{
}
}
void SysTick_Handler()
{
static u8 cnt = 0;
SysTick- >CTRL &=~ (1< < 16); //清计数标志位
cnt++;
if(cnt == 10)
{
LED_Toggle(DS0); //LED灯闪烁
cnt = 0;
}
}