標(biāo)題: [零基礎(chǔ)學(xué)習(xí)STM32]第五講:SYSTICK定時(shí)器實(shí)驗(yàn)—定時(shí)點(diǎn)亮LED [打印本頁(yè)]

作者: kkhkbb    時(shí)間: 2018-3-7 15:06
標(biāo)題: [零基礎(chǔ)學(xué)習(xí)STM32]第五講:SYSTICK定時(shí)器實(shí)驗(yàn)—定時(shí)點(diǎn)亮LED
一、 概述
1、 時(shí)鐘系統(tǒng)簡(jiǎn)介
(1)STM32時(shí)鐘源分以下五類:
(2)系統(tǒng)時(shí)鐘SYSCLK可來(lái)源于:HSI振蕩器時(shí)鐘、HSE振蕩器時(shí)鐘、PLL時(shí)鐘。
2、SYTICK簡(jiǎn)介
     在STM32中,SysTick是內(nèi)核CM4中的一個(gè)24位的遞減計(jì)數(shù)器,也稱系統(tǒng)嘀答定時(shí)器。SysTick的最大使命,就是定期地產(chǎn)生異常請(qǐng)求,作為系統(tǒng)的時(shí)基。操作系統(tǒng)需要這種“滴答”來(lái)推動(dòng)任務(wù)和時(shí)間的管理。
     SysTick在設(shè)定初值并開啟后,每經(jīng)一個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值減1,計(jì)數(shù)到0時(shí),將從重載寄存器中自動(dòng)重新裝載定時(shí)初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的COUNTFLAG標(biāo)志位置1,觸發(fā)中斷(中斷允許情況下),中斷響應(yīng)屬于NVIC異常,異常號(hào)為15,Systick中斷優(yōu)先級(jí)可設(shè)置。
3、SYTICK寄存器控制
     STM32內(nèi)部有4個(gè)寄存器控制SysTick定時(shí)器。分別為:控制寄存器STK_CSR、重載寄存器STK_LOAD、當(dāng)前值寄存器STK_VAL和校準(zhǔn)值寄存器STK_CALRB。下面分別對(duì)這4個(gè)寄存器做詳細(xì)介紹。
(1)控制寄存器STK_CSR(地址:0xE000E010)
       控制寄存器STK_CSR中有4個(gè)bit具有意義,其內(nèi)容如圖4_0、表4_0所示:
ENABLE(位0) Systick使能位。
0:關(guān)閉Systick功能;
1:開啟Systick功能。
TICKINT(位1) Systick中斷使能位。
0:關(guān)閉Systick中斷;
1:開啟Systick中斷,systick倒數(shù)到零時(shí)產(chǎn)生systick異常中斷。
CLKSOURCE(位2) Systick時(shí)鐘源選擇位。
0:使用HCLK/8作為Systick時(shí)鐘(外部時(shí)鐘);
1:使用HCLK作為Systick時(shí)鐘(內(nèi)核時(shí)鐘)。
COUNTFLAG(位16) Systick計(jì)數(shù)比較標(biāo)志,如果在上次讀取本寄存器后,SysTick已經(jīng)數(shù)到了0,則該位為1。如果讀取該位,該位將自動(dòng)清零。
           表4_0  控制寄存器STK_CSR的格式
(2)重載寄存器STK_LOAD(地址:0xE000E014)
           圖4_1 重載寄存器STK_LOAD的格式
重載寄存器STK_LOAD為24位的寄存器(0:23有效),最大計(jì)數(shù)0xFFFFFF。SysTick定時(shí)器遞減至0時(shí),重載寄存器中的值就會(huì)被重新裝載,繼續(xù)開始遞減計(jì)數(shù)。
(3)當(dāng)前值寄存器STK_VAL(地址:0xE000E018)
          圖4_2 當(dāng)前值寄存器STK_VAL的格式
當(dāng)前值寄存器STK_VAL為24位的寄存器,讀取時(shí)返回當(dāng)前計(jì)數(shù)的值,寫它則使之清零,同時(shí)還會(huì)清除在SysTick控制及狀態(tài)寄存器中的COUNTFLAG標(biāo)志。
(4)校準(zhǔn)值寄存器STK_CALRB(地址:0xE000E01C)




       圖4_3 校準(zhǔn)值值寄存器STK_CALRB的格式
NOREF 0:HCLK可用;
1:HCLK不可用。
SKEW 0:校準(zhǔn)值是準(zhǔn)確的10ms;
1:校準(zhǔn)值不是準(zhǔn)確的10ms。
TENMS 該值是10ms定時(shí)的重裝值。其值取決于SKEW,它可以是精確的10ms,也可以是接近10ms的值。如果該值為0,則表示無(wú)法使用校準(zhǔn)功能,這很可能是因?yàn)闀r(shí)鐘是系統(tǒng)的一個(gè)未知輸入或者時(shí)鐘可以動(dòng)態(tài)調(diào)節(jié)。
         表4_1寄存器STK_CALRB的格式
二、實(shí)驗(yàn)原理
     通過(guò)STM32的三個(gè)GPIO口驅(qū)動(dòng)三色LED的三個(gè)通道;設(shè)定GPIO為推挽輸出;采用灌電流的方式與LED連接,輸出高電平LED滅,輸出低電平LED亮。通過(guò)系統(tǒng)定時(shí)器實(shí)現(xiàn)1s定時(shí),每秒變換一次LED顏色。
           圖4_4 驅(qū)動(dòng)示意圖
三、源代碼
1.主函數(shù)
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         static int work_status = 0;
  17.         led.initialize();
  18.         systick.initialize();
  19.         //每隔一秒三色燈進(jìn)行交替循環(huán)閃爍
  20.         while(1){
  21. if(systick.second_flag == 1){ //每隔一秒標(biāo)志位置1,執(zhí)行一次
  22.                         systick.second_flag = 0;
  23.                         work_status += 1;
  24.                         if(work_status > 2)work_status = 0;
  25.                 }
  26.                 switch (work_status){
  27.                         case 0 :
  28.                                 LED_RED_ON;
  29.                                 LED_GREEN_OFF;
  30.                                 LED_BLUE_OFF;
  31.                                 break;

  32.                         case 1 :
  33.                                 LED_RED_OFF;
  34.                                 LED_GREEN_ON;
  35.                                 LED_BLUE_OFF;
  36.                                 break;

  37.                         case 2:
  38.                                 LED_RED_OFF;
  39.                                 LED_GREEN_OFF;
  40.                                 LED_BLUE_ON;
  41.                                 break;

  42.                         default:
復(fù)制代碼
2.Systick初始化
   以下是Systick初始化及中斷設(shè)置函數(shù),主要實(shí)現(xiàn)定標(biāo)志位的時(shí)1s,改變一次標(biāo)志位,使用LED顯色狀態(tài)變換一次。
  1. /*
  2. * Name               : initialize
  3. * Description        : ---
  4. * Author             : ysloveivy.
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         //定時(shí)1ms
  17.         if(SysTick_Config(SystemCoreClock / 1000)){
  18.                 while(1);
  19.         }
  20.         return 0;
  21. }
  22. /*
  23. * Name               : SysTick_Handler
  24. * Description        : ---
  25. * Author             : ysloveivy.
  26. * History
  27. * -------------------
  28. * Rev                : 0.00
  29. * Date               : 11/21/2015
  30. *
  31. * create.
  32. * -------------------
  33. */
  34. void SysTick_Handler(void)
  35. {
  36.         static int counter = 0;

  37.         if((counter ++ % 1000) == 0){ //每次中斷counter自加1,判斷是否整秒
  38.                 systick.second_flag = 1;
  39.         }
  40. }
復(fù)制代碼
3.小知識(shí)
   在上面有兩個(gè)重要的函數(shù)
   1.SysTick_Confing(uint32_t ticks)
    該函數(shù)的作用是初始化systick,時(shí)鐘為HCLK(CM3一般為72M,CM4一般為168M),并開啟中斷。
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  2. {
  3.   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)  //大于重載寄存器最大值0xFFFFFF
  4.   {
  5. return (1UL);                                //重新加載值不可能,返回錯(cuò)誤           
  6. }
  7.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);      //計(jì)數(shù)范圍0到ticks-1                  
  8. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
  9. //設(shè)置優(yōu)先級(jí)
  10. SysTick->VAL   = 0UL;                              //當(dāng)前值初始化為0   
  11.   //接下來(lái)設(shè)置控制寄存器,以位與的方式實(shí)現(xiàn)三個(gè)控制位的設(shè)置。
  12.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | //選擇時(shí)鐘源
  13.                       SysTick_CTRL_TICKINT_Msk   |  //開啟中斷
  14.                       SysTick_CTRL_ENABLE_Msk;      //使能定時(shí)器               
  15.   return (0UL);                                       //初始化成功返回         
  16. }
復(fù)制代碼
     回頭看看程序中的SysTick_Config(SystemCoreClock / 1000)語(yǔ)句,該函數(shù)中的SystemCoreClock為時(shí)鐘頻率已在庫(kù)函數(shù)中宏定義。如在iCore3雙核心板ARM的HCLK為168M(每秒168M次計(jì)數(shù)),則程序中SystemCoreClock / 1000即意味每1ms中斷一次。
    2.void SysTick_Handler(void)
    該函數(shù)是中斷函數(shù),即每次SysTick中斷產(chǎn)生時(shí)運(yùn)行一次函數(shù),其在啟動(dòng)文件中已有設(shè)置,在驅(qū)動(dòng)文件中使用時(shí)無(wú)需再次聲明。
四、 實(shí)驗(yàn)現(xiàn)象
      iCore3的雙核心板上與ARM相連的三色LED(PCB上標(biāo)示為ARM·LED),紅色、綠色、藍(lán)色每秒交替點(diǎn)亮。
五、 代碼包下載鏈接
     網(wǎng)盤:http://pan.baidu.com/s/1eQsKcEY

iCore3_5_SYSTICK.rar

956.4 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5


作者: cmxgx    時(shí)間: 2019-1-21 21:29
為什么沒(méi)有同時(shí)亮




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1