国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

利用stm32 systic定時器用作時鐘基線實現多個定時器定時

[復制鏈接]
樓主
路漫漫 發表于 2020-5-20 23:52:54 | 只看該作者 |倒序瀏覽 |閱讀模式
systick時鐘基線運用,充分利用cpu性能,拒絕延時等浪費cpu時間行為
完整源碼: systick時鐘基線運用.7z (453.11 KB, 售價: 1 E幣)
代碼片段:
  1. /*****************************************************************************************************/

  2. SOFT_TMR g_Tmr[COUNT_TIM];

  3. /* cpu運行時間,單位ms */
  4. __IO uint32_t g_iRunTime = 0;

  5. static void Soft_TimerDec(SOFT_TMR *_tmr);

  6. /*
  7. *********************************************************************************************************
  8. *    函 數 名:Systick_Init
  9. *    功能說明:初始化Systick定時器
  10. *    形    參:無
  11. *    返 回 值:無
  12. *********************************************************************************************************
  13. */
  14. void Systick_Init(void)
  15. {   
  16.     /* 清零所有的軟件定時器 */
  17.     memset(g_Tmr,0,COUNT_TIM * sizeof(g_Tmr));

  18.     /*
  19.         配置systic中斷周期,并啟動systick中斷。
  20.         這個函數在 \Libraries\CMSIS\CM3\CoreSupport\core_cm3.h
  21.         
  22.         Systick中斷向量在(\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\
  23.             startup_stm32f10x_hd.s 文件中定義為 SysTick_Handler。
  24.         SysTick_Handler函數的實現在stm32f10x_it.c 文件。
  25.         SysTick_Handler函數調用了SysTick_ISR()函數,在本文件末尾。
  26.     */   
  27.     SysTick_Config(SystemCoreClock / 1000 * Systick_tim);
  28. }

  29. /*
  30. *********************************************************************************************************
  31. *    函 數 名: SysTick_ISR
  32. *    功能說明:SysTick中斷服務程序,在SysTick_Handler中調用
  33. *    形    參:無
  34. *    返 回 值: 無
  35. *********************************************************************************************************
  36. */
  37. void SysTick_ISR(void)
  38. {
  39.     static uint8_t s_count = 0;
  40.     uint8_t i;

  41.     for (i = 0; i < COUNT_TIM; i++)
  42.     {
  43.         Soft_TimerDec(&g_Tmr[ i]);
  44.     }

  45.     g_iRunTime += Systick_tim;        /* cpu運行時間增Systick_tim*/
  46.     if (g_iRunTime >= 0x9A7EC800)    /* 30天清零 */
  47.     {
  48.         g_iRunTime = 0;
  49.     }
  50.         
  51.     s_count += Systick_tim;
  52.     if (s_count >= 10)
  53.     {
  54.         s_count = 0;

  55.         /*
  56.             此處可加入按鍵的檢測。按鍵檢測每隔10ms一次就行了,一般做40ms的濾波處理就可以
  57.             有效過濾掉機械動作造成的按鍵抖動。
  58.         */
  59. //        Key_Scan();
  60.     }
  61. }
  62. /*
  63. *********************************************************************************************************
  64. *    函 數 名: delay_ms
  65. *    功能說明: ms級延遲,延遲精度為正負1ms
  66. *    形    參:n : 延遲長度,單位 ms。
  67. *    返 回 值: 無
  68. *********************************************************************************************************
  69. */
  70. void Delay_Ms(int32_t n)
  71. {
  72. //    /* 避免 n = 1 出現主程序死鎖 */
  73. //    if (n <= 1)
  74. //    {
  75. //        n = 2;
  76. //    }
  77.    
  78.     __set_PRIMASK(1);          /* 關中斷 */
  79.     g_Tmr[DELAY_TIM].count = n;
  80.     g_Tmr[DELAY_TIM].flag = 0 ;
  81.     __set_PRIMASK(0);          /* 開中斷 */

  82.     while (1)
  83.     {
  84.         CPU_IDLE();    /* 此處是空操作。用戶可以定義,讓CPU進入IDLE狀態,以降低功耗;或實現喂狗 */

  85.         /* 等待延遲時間到 */
  86.         if (g_Tmr[DELAY_TIM].flag == 1)
  87.         {
  88.             return;
  89.         }
  90.     }
  91. }

  92. systick.h中的代碼
  93. /*********************************************************************************************/
  94. #define SYSTICK_MODE    0    //0中斷模式,1查詢模式

  95. /* 軟件延時 */
  96. void SoftDelay_Ms(uint16_t nms);
  97. void SoftDelay_Us(uint16_t nus);

  98. /**********************************************中斷模式**********************************************/
  99. #if SYSTICK_MODE == 0   

  100. /* 目前是空操作,用戶可以定義讓CPU進入IDLE狀態的函數和喂狗函數 */
  101. #define CPU_IDLE()

  102. #define Systick_tim        1        //Systic中斷時間(時鐘基線),單位:ms

  103. /*
  104.     可在此處枚舉中增加若干個軟件定時器
  105.     注意:變量在中斷和主程序中同時被訪問,有可能造成編譯器錯誤優化,必須增加__IO 即 volatile。
  106. */
  107. enum enum_tim_id{
  108.     DELAY_TIM = 0,    //第1個保留給Delay_Ms()使用
  109.     USER_TIM1,
  110.     USER_TIM2,
  111.     USER_TIM3,
  112.     COUNT_TIM        //軟件定時器的個數
  113. };

  114. /* 定時器結構體 */
  115. typedef struct
  116. {
  117.     volatile int32_t count;    //計數器
  118.     volatile uint8_t flag;    //定時到達標志
  119. }SOFT_TMR;


  120. /* 供外部調用的函數聲明 */
  121. void Systick_Init(void);
  122. void SysTick_ISR(void);
復制代碼


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

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 04:10

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表