上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):启用计数器开始计数。