本帖最后由 dj狂人 于 2014-12-17 22:11 编辑
SysTick是一个24位的定时器,采用递减方式计数,作为cortex-M3的标配,SysTick是学stm32或者是RTos不得不面对的,
只要是基于cortex-M3内核的单片机都有一个SysTick这对在程序移植的时候可以省去不少功夫。今天就用SysTick小试牛刀,做了
个呼吸灯,可是折腾了半天,程序老报错,说函数没有定义,可明明是按用户手册上说明来做的,最后才发现原来是我固件库的
问题,固件库是3.5版本的,移除了一些老版本上关于SysTick的驱动函数。新版本的话只要调用SysTick_Config(uint32_t ticks)这
个函数,然后用SysTick_Handler(void) 编写中断服务程序就可以使用SysTick了。
调用SysTick_Config(uint32_t ticks)需要我们传一个计数值进去,比如系统系统位72MHz,那么机器周期就是1/72000000,这
是计一个数所花的时间,那么如果我们需要定时1S的话,需要计 1/1/72000000 也就是72000000个数,但是由于我们的SysTick
是24位的,他最大能计2的24次方 也就是 16777215 个数,所以如果我们要定时1S的话,还需在程序上再处理一下。
SysTick_Config(uint32_t ticks)定义在 core_cm3.h文件中, 他的函数原型是这样的
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); //这里是判断计数值ticks是否大于 16777215,若大于,退出
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //将计数值加载到寄存器中
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //设置systick定时器中断优先级
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; //使能systick定时器及中断
return (0);
}
|