Cortex 序列内核系统都提供1个24位Sys tick定时器、可以作为普通的定时器使用,在有 RTOS的系统,一般都用它来做TICK时钟。SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常。 Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是: STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器 1,STK_CSR寄存器
第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零 2,STK_LOAD 重载寄存器:
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。 3,STK_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。 4,STK_CALRB 校准值寄存器:
这个寄存器,一般不使用,如果需要深入的研究,可以去查阅资料。上述资料在网上查阅的,放在这里跟大家分享。 下面我使用它来做普通的定时器。初始化为1MS定时器中断。通过LED周期性变化来验证结果。 1,LED初始化参照前面章节。 2,SysTick初始化:
HAL_NVIC_SetPriority这个函数是修改中断优先级的,一般默认就可以。
这里就初始化了SysTick时钟,使能了中断。
这个是中断处理函数。 初始化完成,到验证的时候了。 通过HAL_GetTick()函数读取uwTick计数值,实现led闪烁。 |