目录
1. 参考文献
《Cortex-M3内核编程手册》;
《Cortex-M3权威指南》。
2. systick简介
Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。
除了个别异常的优先级被定死外,其它异常的优先级都是可编程的(所有能打断正常执行的事件统称异常);
systick(系统定时器)是属于 CM3 内核中的一个外设(内核外设),内嵌在 NVIC(嵌套向量中断控制器) 中;
它和普通片上外设的中断优先级有区别,它没有抢占优先级和子优先级;
在F103中,内核外设的中断优先级是通过SHPRX(x=1/2/3)来配置,systick优先级默认配置为15;
NVIC控制着芯片中断相关的功能,是内核的一个外设;
NVIC的中断优先级分组功能不仅对片上外设有效,也对内核外设有效;
3. systick寄存器
3.1 控制及状态寄存器
systick control and status register(STK_CTRL);
3.2 重装载数值寄存器
systick reload value register(STK_LOAD);
3.3 当前数值寄存器
systick current value register(STK_VAL);
读取时,返回当前计数值;写该寄存器则使之清零,同时清除在STK_CTRL中的COUNTFLAG标志。
3.4 校准数值寄存器
systick calibration value register(STK_CALIB);
这个寄存器在定时试验中用不到。
4. systick中断时间计算
此处计数器是向下计数,计数一次的时间 = 1 / 系统时钟;
当重装载寄存器中的数值计数到0时,将产生中断,进入void SysTick_Handler(void)(中断服务函数);
举例:
系统时钟72MHZ,A = 计数一次时间 = 1 / 72 000 000 秒
B = 设置的计数值
中断时间 = A * B
5. systick配置库函数
SysTick_Config(7200000ul);
//该函数的形参决定中断的时间
//SysTick_Config() 库函数主要配置了 SysTick 中的三个寄存器:LOAD、VAL 和 CTRL
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//由于是24位计数器,所以不能超过
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//设置重装载寄存器
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//设置中断优先级
SysTick->VAL = 0;
//设置当前数值寄存器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
//设置系统时钟时钟源AHBCLK=72M
//使能定时器中断
//使能定时器
return (0); /* Function successful */
}