久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7612|回復: 1
打印 上一主題 下一主題
收起左側

[零基礎學習STM32]第五講:SYSTICK定時器實驗—定時點亮LED

[復制鏈接]
跳轉到指定樓層
樓主
一、 概述
1、 時鐘系統簡介
(1)STM32時鐘源分以下五類:
  • 高速內部時鐘(HSI):RC振蕩器,精度不高。
  • 高速外部時鐘(HSE):可接石英/陶瓷諧振器或者接外部時鐘源。
  • 低速內部時鐘(LSI):RC振蕩器,提供低功耗時鐘。應用如WDG。
  • 低速外部時鐘(LSE):接外部低頻率石英晶體。應用如RTC。
  • 常閉不帶復位:鎖相環倍環輸出(PLL):其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻倍數可調,但是其最大輸出頻率受限數值因芯片型號而異。
(2)系統時鐘SYSCLK可來源于:HSI振蕩器時鐘、HSE振蕩器時鐘、PLL時鐘。
2、SYTICK簡介
     在STM32中,SysTick是內核CM4中的一個24位的遞減計數器,也稱系統嘀答定時器。SysTick的最大使命,就是定期地產生異常請求,作為系統的時基。操作系統需要這種“滴答”來推動任務和時間的管理。
     SysTick在設定初值并開啟后,每經一個系統時鐘周期,計數值減1,計數到0時,將從重載寄存器中自動重新裝載定時初值并繼續計數,同時內部的COUNTFLAG標志位置1,觸發中斷(中斷允許情況下),中斷響應屬于NVIC異常,異常號為15,Systick中斷優先級可設置。
3、SYTICK寄存器控制
     STM32內部有4個寄存器控制SysTick定時器。分別為:控制寄存器STK_CSR、重載寄存器STK_LOAD、當前值寄存器STK_VAL和校準值寄存器STK_CALRB。下面分別對這4個寄存器做詳細介紹。
(1)控制寄存器STK_CSR(地址:0xE000E010)
       控制寄存器STK_CSR中有4個bit具有意義,其內容如圖4_0、表4_0所示:
ENABLE(位0) Systick使能位。
0:關閉Systick功能;
1:開啟Systick功能。
TICKINT(位1) Systick中斷使能位。
0:關閉Systick中斷;
1:開啟Systick中斷,systick倒數到零時產生systick異常中斷。
CLKSOURCE(位2) Systick時鐘源選擇位。
0:使用HCLK/8作為Systick時鐘(外部時鐘);
1:使用HCLK作為Systick時鐘(內核時鐘)。
COUNTFLAG(位16) Systick計數比較標志,如果在上次讀取本寄存器后,SysTick已經數到了0,則該位為1。如果讀取該位,該位將自動清零。
           表4_0  控制寄存器STK_CSR的格式
(2)重載寄存器STK_LOAD(地址:0xE000E014)
           圖4_1 重載寄存器STK_LOAD的格式
重載寄存器STK_LOAD為24位的寄存器(0:23有效),最大計數0xFFFFFF。SysTick定時器遞減至0時,重載寄存器中的值就會被重新裝載,繼續開始遞減計數。
(3)當前值寄存器STK_VAL(地址:0xE000E018)
          圖4_2 當前值寄存器STK_VAL的格式
當前值寄存器STK_VAL為24位的寄存器,讀取時返回當前計數的值,寫它則使之清零,同時還會清除在SysTick控制及狀態寄存器中的COUNTFLAG標志。
(4)校準值寄存器STK_CALRB(地址:0xE000E01C)




       圖4_3 校準值值寄存器STK_CALRB的格式
NOREF 0:HCLK可用;
1:HCLK不可用。
SKEW 0:校準值是準確的10ms;
1:校準值不是準確的10ms。
TENMS 該值是10ms定時的重裝值。其值取決于SKEW,它可以是精確的10ms,也可以是接近10ms的值。如果該值為0,則表示無法使用校準功能,這很可能是因為時鐘是系統的一個未知輸入或者時鐘可以動態調節。
         表4_1寄存器STK_CALRB的格式
二、實驗原理
     通過STM32的三個GPIO口驅動三色LED的三個通道;設定GPIO為推挽輸出;采用灌電流的方式與LED連接,輸出高電平LED滅,輸出低電平LED亮。通過系統定時器實現1s定時,每秒變換一次LED顏色。
           圖4_4 驅動示意圖
三、源代碼
1.主函數
  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.         //每隔一秒三色燈進行交替循環閃爍
  20.         while(1){
  21. if(systick.second_flag == 1){ //每隔一秒標志位置1,執行一次
  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:
復制代碼
2.Systick初始化
   以下是Systick初始化及中斷設置函數,主要實現定標志位的時1s,改變一次標志位,使用LED顯色狀態變換一次。
  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.         //定時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. }
復制代碼
3.小知識
   在上面有兩個重要的函數
   1.SysTick_Confing(uint32_t ticks)
    該函數的作用是初始化systick,時鐘為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);                                //重新加載值不可能,返回錯誤           
  6. }
  7.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);      //計數范圍0到ticks-1                  
  8. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
  9. //設置優先級
  10. SysTick->VAL   = 0UL;                              //當前值初始化為0   
  11.   //接下來設置控制寄存器,以位與的方式實現三個控制位的設置。
  12.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | //選擇時鐘源
  13.                       SysTick_CTRL_TICKINT_Msk   |  //開啟中斷
  14.                       SysTick_CTRL_ENABLE_Msk;      //使能定時器               
  15.   return (0UL);                                       //初始化成功返回         
  16. }
復制代碼
     回頭看看程序中的SysTick_Config(SystemCoreClock / 1000)語句,該函數中的SystemCoreClock為時鐘頻率已在庫函數中宏定義。如在iCore3雙核心板ARM的HCLK為168M(每秒168M次計數),則程序中SystemCoreClock / 1000即意味每1ms中斷一次。
    2.void SysTick_Handler(void)
    該函數是中斷函數,即每次SysTick中斷產生時運行一次函數,其在啟動文件中已有設置,在驅動文件中使用時無需再次聲明。
四、 實驗現象
      iCore3的雙核心板上與ARM相連的三色LED(PCB上標示為ARM·LED),紅色、綠色、藍色每秒交替點亮。
五、 代碼包下載鏈接

iCore3_5_SYSTICK.rar

956.4 KB, 下載次數: 18, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89134 發表于 2019-1-21 21:29 | 只看該作者
為什么沒有同時亮
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 草草精品 | 日本亚洲一区 | 在线一区视频 | 中文在线视频 | 久久久久久99 | 亚洲人成网亚洲欧洲无码 | 在线午夜 | 午夜电影网| 欧美精品久久久 | 国产美女h视频 | 欧美日韩三级 | 成人国产一区二区三区精品麻豆 | 国产草草视频 | 在线观看av网站永久 | 中文字幕免费在线 | 色综合激情 | 综合久久av | 激情网站在线观看 | 日韩蜜桃视频 | 免费超碰 | 亚洲av毛片 | 亚洲欧洲综合av | 97视频免费 | 精品亚洲一区二区三区四区五区高 | 99成人在线视频 | 91污在线| 日韩免费视频一区二区 | 国产免费一二三区 | 日日夜夜免费精品视频 | 国产中文字幕在线观看 | 亚洲欧美日韩一区二区 | 91久久精品日日躁夜夜躁欧美 | 狼色网 | 嫩草研究影院 | 久久99精品久久久久久 | 国产一区二区在线免费视频 | 亚洲欧美另类在线观看 | 欧美精品久久久久久久久老牛影院 | 欧美综合一区二区三区 | 久久久久久蜜桃一区二区 | 黄在线|