官术网_书友最值得收藏!

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):啟用計數器開始計數。

主站蜘蛛池模板: 徐州市| 图木舒克市| 新和县| 安龙县| 寻甸| 河池市| 萝北县| 鸡泽县| 元江| 平武县| 醴陵市| 绥芬河市| 紫阳县| 亳州市| 理塘县| 澄迈县| 临城县| 麦盖提县| 缙云县| 浪卡子县| 丹棱县| 仲巴县| 和硕县| 三都| 修水县| 轮台县| 乐清市| 玛纳斯县| 芜湖县| 蒙山县| 抚州市| 南城县| 阆中市| 汾西县| 黑水县| 射洪县| 陆河县| 遂平县| 柳林县| 南康市| 甘洛县|