μC/OS-III内核实现与应用开发实战指南:基于STM32
上QQ阅读APP看书,第一时间看更新

4.2 初始化SysTick

使用SysTick非常简单,只需要一个初始化函数OS_CPU_SysTickInit()即可。此函数在os_cpu_c.c中定义,具体实现参见代码清单4-1。在这里,我们没有使用μC/OS-III官方的SysTick初始化函数,而是另外编写了一个,区别是μC/OS-III官方的OS_CPU_SysTickInit()函数中涉及SysTick寄存器时都是重新在cpu.h中定义,而我们自己编写的函数则是使用ARMCM3.h(记得在os_cpu_c.c的开头包含ARMCM3.h这个头文件)这个固件库文件中定义的寄存器。

代码清单4-1 SysTick初始化

1 #if 0/* 不用μC/OS
-III自带的 */
 2 void  OS_CPU_SysTickInit (CPU_INT32U  cnts)
 3 {
 4     CPU_INT32U  prio;
 5 
 6     /* 填写 SysTick 的重载计数值 */
 7     CPU_REG_NVIC_ST_RELOAD = cnts - 1u;
 8 
 9     /* 设置 SysTick 中断优先级 */
10     prio  = CPU_REG_NVIC_SHPRI3;
11     prio &= DEF_BIT_FIELD(24, 0);
12     prio |= DEF_BIT_MASK(OS_CPU_CFG_SYSTICK_PRIO, 24);
13 
14     CPU_REG_NVIC_SHPRI3 = prio;
15 
16     /* 启用 SysTick 的时钟源和启动计数器 */
17     CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_CLKSOURCE |
18                             CPU_REG_NVIC_ST_CTRL_ENABLE;
19     /* 启用 SysTick 的定时中断 */
20     CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_TICKINT;
21 }
22 
23 #else/* 直接使用头文件ARMCM3.h中现有的寄存器定义和函数来实现 */
24 void  OS_CPU_SysTickInit (CPU_INT32U  ms)
25 {
26     /* 设置重装载寄存器的值 */
27     SysTick->LOAD  = ms * SystemCoreClock / 1000 - 1;(1)
28 
29     /* 配置中断优先级为最低 */
30     NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);(2)
31 
32     /* 复位当前计数器的值 */
33     SysTick->VAL   = 0;(3)
34 
35     /* 选择时钟源、启用中断、启用计数器 */
36     SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |(4)
37                      SysTick_CTRL_TICKINT_Msk   |(5)
38                      SysTick_CTRL_ENABLE_Msk;(6)
39 }
40 #endif

代码清单4-1(1):配置重装载寄存器的值,我们配合函数形参ms来配置,如果需要配置为10ms产生一次中断,则将形参设置为10即可。

代码清单4-1(2):配置SysTick的优先级,这里配置为15,即最低。

代码清单4-1(3):复位当前计数器的值。

代码清单4-1(4):选择时钟源,这里选择SystemCoreClock。

代码清单4-1(5):启用中断。

代码清单4-1(6):启用计数器开始计数。