0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用STM32單片機systick來實現(xiàn)延時定時功能

電子設計 ? 來源:CSDN博主 ? 作者:hurryddd ? 2021-02-14 06:25 ? 次閱讀

1、前言

CM4內(nèi)核的處理和CM3一樣,內(nèi)部都包含了一個SysTick定時器,SysTick 是一個24 位的倒計數(shù)定時器,當計到0 時,將從RELOAD 寄存器中自動重裝載定時初值。只要不把它在SysTick 控制及狀態(tài)寄存器中的使能位清除,就永不停息。這樣可以用systick來實現(xiàn)延時定時功能,不用再占用系統(tǒng)定時器。systick也多用做系統(tǒng)的時鐘節(jié)拍,如freeRTOS等OS,再啟動調(diào)度器的時候,就會將systick配置成其系統(tǒng)時鐘,給系統(tǒng)提供心跳。systick中有4個寄存器CTRL、LOAD、VAL、CALIB

pIYBAF_9XjWAZY1uAAQTsF9Rra4795.png

2、systick配置注意事項

使用CubeMX配置生成的代碼中,會自動生成一個 SystemClock_Config() 的函數(shù),用于配置單片機時鐘,其中就會配置systick

void SystemClock_Config()
{
    ...........
    LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);
    LL_SetSystemCoreClock(32000000);
#ifndef SYSTICK_IRQ
    LL_Init1msTick(32000000); //使能systick但是不開啟systick中斷
#else
    SysTick_Config(SystemCoreClock / 1000);//使能systick同時開啟systick中斷
#endif
}

但是這里 需要注意的是,是不是需要開啟 systick 中斷?。。?!

1、如果只是想用systick來作為延時用,程序不想被中斷打斷,就只需要使能systick而不用開啟systick中斷,調(diào)用 LL_Init1msTick 即可

void LL_Init1msTick(uint32_t HCLKFrequency)
    ---> LL_InitTick(HCLKFrequency, 1000U);
        ---> __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
            {
                  /* Configure the SysTick to have interrupt in 1ms time base */
                  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */
                  SysTick->VAL   = 0UL;  /* Load the SysTick Counter Value */
                  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                   SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
            }

但是需要自己編寫延時函數(shù),不能使用HAL庫提供的HAL_Delay()。原因如下:HAL_Delay的實現(xiàn)是依靠一個uwTickFreq變量,uwTickFreq是在HAL_IncTick中累加的,需要在 SysTick_Handler中斷函數(shù)中周期調(diào)用,這樣HAL_Delay才會有一個基準

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

自定義的us延時

void my_delay_us(uint32_t nus)
{		
	uint32_t temp;	
	uint32_t fac_us = SystemCoreClock/1000000;	  //為系統(tǒng)時鐘的1/1000000  	
	SysTick->LOAD   = nus*fac_us; 			      //時間加載	  		 
	SysTick->VAL    = 0x00;        			      //清空計數(shù)器
	SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk ;	  //開始倒數(shù)	  
	do
	{
		temp = SysTick->CTRL;
	}
	while((temp & 0x01) &&! (temp&(1 << 16)));	 //等待時間到達   
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;	 //關閉計數(shù)器
	SysTick->VAL = 0X00;      					 //清空計數(shù)器	 
}

2、如果想用systick座系統(tǒng)的時鐘節(jié)拍,需要開啟systick中斷,可以直接調(diào)用 SysTick_Config 來配置,也可以使用 HAL_Init 來配置,HAL_Init 配置最終也會調(diào)用 SysTick_Config 函數(shù)

 HAL_Init(void)
    ---> HAL_InitTick(uint32_t TickPriority)
        ---> SysTick_Config(uint32_t ticks)
            {
              if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
              {
                return (1UL);                                                   /* Reload value impossible */
              }
            
              SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
              NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
              SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
              SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                               SysTick_CTRL_TICKINT_Msk   |
                               SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
              return (0UL);                                                     /* Function successful */
            }

這樣配置完成之后,還需要再systick的中斷中調(diào)用 osSystickHandler 和 HAL_IncTick

void SysTick_Handler(void)
{
	osSystickHandler();//為OS提供系統(tǒng)時鐘節(jié)拍
	HAL_IncTick();//為HAL庫提供時鐘基準
}

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6023

    文章

    44376

    瀏覽量

    628477
  • 寄存器
    +關注

    關注

    31

    文章

    5253

    瀏覽量

    119212
  • 定時器
    +關注

    關注

    23

    文章

    3218

    瀏覽量

    113695
  • STM32單片機
    +關注

    關注

    58

    文章

    549

    瀏覽量

    58476
  • Systick
    +關注

    關注

    0

    文章

    62

    瀏覽量

    13009
收藏 人收藏

    評論

    相關推薦

    stm32單片機引腳介紹及功能

    特點,廣泛應用于工業(yè)控制、消費電子、醫(yī)療設備、智能家居等領域。本文將介紹STM32單片機的引腳及其功能。 1. 引腳概述 STM32單片機
    的頭像 發(fā)表于 09-02 09:38 ?893次閱讀

    揭秘:單片機硬件與軟件延時之大不同!

    普及一下延時相關概念和分類。硬件延時:指利用具有計數(shù)功能的硬件進行延時。比如:定時器(Timer)、實時時鐘(RTC)、系統(tǒng)滴答
    的頭像 發(fā)表于 07-25 08:11 ?507次閱讀
    揭秘:<b class='flag-5'>單片機</b>硬件與軟件<b class='flag-5'>延時</b>之大不同!

    Systick到底是用作延時好還是用作定時好?都有什么優(yōu)缺點?

    功能,作基礎定時用,而不建議用作延時功能,方便后面程序移植. 最好有個定論,方便后面程序的移植,不能各自玩各自的,一個公司里面寫程序的風格和標準需要統(tǒng)一。 想問下各位,
    發(fā)表于 04-08 07:37

    單片機定時器的用法

    本章以CW32通用定時器為例介紹單片機定時器的用法。
    的頭像 發(fā)表于 01-04 10:37 ?1165次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>定時</b>器的用法

    STM32單片機的特點和功能是什么

    STM32單片機是一款基于ARM Cortex-M內(nèi)核的32位閃存微控制器,由STMicroelectronics公司(意法半導體)生產(chǎn)。STM32單片機具有高性能、低功耗、豐富的外設
    的頭像 發(fā)表于 01-03 15:33 ?1.1w次閱讀

    51單片機定時定時1秒程序流水燈結(jié)果分析

    51單片機是一種廣泛應用的嵌入式微控制器,具有高性能、低功耗、易擴展等優(yōu)勢。在實際應用中,定時器常用于定時操作,如控制程序運行時間、生成精確的時間延時等。本文將詳細介紹51
    的頭像 發(fā)表于 12-26 14:57 ?5307次閱讀

    AvR單片機1us延時函數(shù)數(shù)怎么寫

    在編寫AvR單片機的1us延時函數(shù)之前,我們首先需要了解幾個關鍵概念。 單片機延時函數(shù)是通過控制器在特定的時間間隔內(nèi)執(zhí)行一系列的指令
    的頭像 發(fā)表于 12-26 14:02 ?856次閱讀

    stm32delay函數(shù)怎么寫

    STM32延時函數(shù)可以使用SysTick定時實現(xiàn)。Sy
    的頭像 發(fā)表于 12-21 17:53 ?1843次閱讀

    STM32單片機常用的引腳及功能

    STM32單片機是由意法半導體公司(STMicroelectronics)推出的一種高性能、低功耗的微控制器。它具有豐富的外設功能和強大的處理能力,廣泛應用于各種嵌入式系統(tǒng)的開發(fā)中。 在STM
    的頭像 發(fā)表于 12-07 16:22 ?2w次閱讀

    systick_handler無法進入怎么解決

    種情況下,我們需要采取一些措施解決這個問題。 在解決這個問題之前,我們需要了解一下SysTick模塊和其相關概念。 首先,SysTick是一個與外設模塊時鐘頻率相對應的計數(shù)器,它通過加載一個初始值和遞減計數(shù)來
    的頭像 發(fā)表于 12-01 15:36 ?3376次閱讀

    利用單片機技術實現(xiàn)功能出租車計價器設計

    電子發(fā)燒友網(wǎng)站提供《利用單片機技術實現(xiàn)功能出租車計價器設計.doc》資料免費下載
    發(fā)表于 11-08 14:31 ?0次下載
    利用<b class='flag-5'>單片機</b>技術<b class='flag-5'>來</b><b class='flag-5'>實現(xiàn)</b>多<b class='flag-5'>功能</b>出租車計價器設計

    STM32如何使用定時實現(xiàn)微秒(us)級延時?

    STM32如何使用定時實現(xiàn)微秒(us)級延時? 在STM32微控制器中,可以使用定時
    的頭像 發(fā)表于 11-06 11:05 ?5240次閱讀

    單片機定時器中斷應用案例

    定時器中斷,顧名思義就是在規(guī)定的時間內(nèi)發(fā)送中斷請求,要實現(xiàn)定時器中斷,單片機需要能夠正確地計算時間,單片機是如何進行計時的呢?
    發(fā)表于 10-31 14:49 ?1307次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>定時</b>器中斷應用案例

    STM32基于HAL庫實現(xiàn)微秒延時

    HAL只提供了ms級的延時,但有些特殊場景,比如與通信速率較慢的設備通信時,會需要用到us級延時STM32標準庫一般是使用系統(tǒng)嘀嗒定時
    的頭像 發(fā)表于 10-25 15:31 ?4468次閱讀
    <b class='flag-5'>STM32</b>基于HAL庫<b class='flag-5'>實現(xiàn)</b>微秒<b class='flag-5'>延時</b>

    單片機定時/計數(shù)器工作于定時和計數(shù)方式時有何異同點?

    單片機定時/計數(shù)器工作于定時和計數(shù)方式時有何異同點? 單片機中的定時/計數(shù)器是一項常見的功能,它
    的頭像 發(fā)表于 10-25 11:50 ?3356次閱讀