SysTick配置函数:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible,ticks过大 */
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 */
}
说明:
//@LQH,20121229
/************************SySTick寄存器说明***********************/
/* LOAD :当系统时钟减数至0后,下一个时钟重新装载的值*******************/
/* CTRL :BIT0-ENABLE, 0:禁止使能SysTick,1:使能SysTick
BIT1-TICKINT,0:禁止SysTick减数至零时产生异常(中断),1:使能SysTick减数至零时产生异常(中断),
BIT2-CLKSOURCE,0:externalCLK,1:intrinsic CLK
这里 SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
刚好是bit0 = bit1 =bit2 =1;即=3
这里的内核时钟(intrinsic CLK)等于FCLK = AHB CLK
external CLK 外部时钟 = AHB的时钟/8
那么如果选择的是FCLK,假如内核时间是72MHz,那么1s就可以计数72*10^6。
*******************/
/* VAL :读取的时候,是当前计数器的值,写他则是对计数器清零*******************/
/*********time的计算********************/
/*定时时间time = (ticks/9000000)(s),这里的9000000=9MHz,是以72MHz为AHB的值,然后8分频给systick*/
/*每隔time时间就会执行一次SysTick_Handler()这个中断函数*/
//这个函数式在STM32启动文件(***.s)里面定义了的