在V3.5的库中,关于系统滴答的配置是在core_cm3.h文件中,其代码如下:
static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = 0; /* 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 (0); /* Function successful */ }
关于systick,ST的STM32F10xxx_Reference_Manual文档介绍不多,没有其寄存器的描述说明,只能在Cortex-M3权威指南中找到一些描述。
有四个寄存器,控制寄存器(CTRL)、重装载值寄存器(RELOAD)、当前值寄存器(VAL)、校准值(CALIB).
控制寄存器几个bit的含义是:
第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)(与具体的芯片实现有关系)
第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零
从上面的代码可以看出,V3.5库默认是使用HCLK作为Systick时钟的。如果用Systick来计时一个比较长的值,可以选择使用HCLK/8作为Systick时钟。