为什么说systick简单?
int main(void) { APM_MINI_LEDInit(LED2); SysTick_Config(SystemCoreClock / 1000); while(1) { APM_MINI_LEDToggle(LED2); Delay(); } }
systick也不简单
从定义范围来讲,systick的功能并不是由厂商设计实现的,而是ARM公司的Cortex-M3内核中规范要求的。理论上,每一颗基于Cortex-M3内核的MCU一定会带有Systick功能外设。咱们的APM32F103也不例外!
也正是由于其由内核负责,APM32F103的驱动库并没有它的身影。其它,在APM32F103的技术手册中也没有谈及到它。
systick的实现函数SysTick_Config()
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { 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 */ }
1. 第3行,systick为24位计数器,所以配置值不能大于24bit长度
2. 第8行,配置tick的值与常规的Timer的计数值相同。注意函数中已减1处理了,所以我们在传参时,无需减1;
3. 第9行,配置systick中断的优先级最低;
4. 第10行,使能中断,使能systick