在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

Systick定時器延時原理與HAL_Delay()延時函數的使用

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-04-26 09:09 ? 次閱讀

代碼的書寫過程中經常用到延時,這里主要講述一下HAl延時,HAL庫之HAL_Delay()函數在72M主頻,STM32CUBEMX自動生成情況下,默認為延時1ms單位,即HAL_Delay(500)表示500ms延時,這是因為在默認狀態下,SysTick()默認設置為1ms中斷,下面就原理進行敘述。

Systick 定時器延時原理

Systick(滴答時鐘)是一個24位,向下計數的定時器,當倒計時完成后,定時器可以產生一個中斷,所以,當頻率一定,計數個數一定時,這個中斷就會以一定的時間間隔發生,如果每個中斷發送后調用的中斷函數中給一個變量累加,這樣我們就可以獲得一個與時間相關的變量。

HAL_Delay()延時函數的使用

如果你使用STM32CubeMx來生成一個工程,那么使用Systick來延時是非常方便的,你只需要調用HAL庫的一個虛函數,它的原型如下:

__weak void HAL_Delay(__IO uint32_t Delay)

可以看到,HAL_Delay()是一個虛函數,這表明用戶可以在其它的位置重定義,如果這樣,新的函數將會取代它,編譯 過程中也不會出現重定義的錯誤。該函數只有一個32位的參數,明顯的,這個形參指定了延時的時間,它的單位是毫秒(ms)。

214344dcweern3lcl5n0n3.jpg硬件延時

關于osDELAY函數可以看一下CMSIS_OS2.h里面的定義,我也是在網上查到具體的定義函數,如下,但是我在官方提供的函數中未找到相關的函數內容。實際使用中就是調用Free-RTOS函數,然后直接使用 OSdelay(5);含義就是延時50ms。

實際上系統OSdelay就是一種程序阻塞的狀態,在阻塞態下,其他資源函數進行工作,時間到從阻塞態變為就緒態,再到運行態。

214159vzr15eiii9ibx898.jpg系統延時

軟件延時就是大家用的最多的,讓程序運行計算來延時,這就很多了,直接上代碼。

void delay_ms(u16 nms)
{	
	if(delay_osrunning&&delay_osintnesting==0)	//如果OS已經在跑了,并且不是在中斷里面(中斷里面不能任務調度)	    
	{		 
		if(nms>=fac_ms)							//延時的時間大于OS的最少時間周期 
		{ 
   			delay_ostimedly(nms/fac_ms);		//OS延時
		}
		nms%=fac_ms;							//OS已經無法提供這么小的延時了,采用普通方式延時    
	}
	delay_us((u32)(nms*1000));					//普通方式延時  
}
void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; 					//時間加載	  		 
	SysTick->VAL=0x00;        					//清空計數器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	//開始倒數	  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));		//等待時間到達   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//關閉計數器
	SysTick->VAL =0X00;      					 //清空計數器	 
}
//延時nms
//注意nms的范圍
//SysTick->LOAD為24位寄存器,所以,最大延時為:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK單位為Hz,nms單位為ms
//對72M條件下,nms<=1864 
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;				//時間加載(SysTick->LOAD為24bit)
	SysTick->VAL =0x00;							//清空計數器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	//開始倒數  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));		//等待時間到達   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//關閉計數器
	SysTick->VAL =0X00;       					//清空計數器	  	    
} 

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 定時器
    +關注

    關注

    23

    文章

    3289

    瀏覽量

    117354
  • 延時函數
    +關注

    關注

    0

    文章

    25

    瀏覽量

    10171
  • Systick
    +關注

    關注

    0

    文章

    63

    瀏覽量

    13504
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32 SYSTICK定時器常見問題

    我們知道,STM32庫函數里通常使用來自內核的系統定時器SYSTICK作為時基,實現計數延時。一般來講,ST公司提供的庫函數里將
    發表于 09-13 16:20 ?3448次閱讀

    Systick定時器是如何去實現delay延時

    Systick定時器是什么?Systick定時器是如何去實現delay延時的?
    發表于 11-17 06:02

    如何用Systick定時器去實現delay延時函數

    什么是SysTick定時器SysTick定時器有何作用?如何用Systick定時器去實現
    發表于 11-24 06:34

    SysTick定時器的相關資料推薦

    SysTick定時器來實現延時,可以不占用系統定時器,節約資源。由于SysTick是在CPU核內部實現的,跟MCU外設無關,因此它的代碼可
    發表于 02-09 06:50

    STM32單片機使用定時器中斷方式實現毫秒級延時的設計

    因為STM32 HAL庫中僅有對HAl_Delay()毫秒級的延時,為實現精確的微秒級延時,就不得不修改Systick,但由于
    發表于 06-04 14:55 ?1.1w次閱讀
    STM32單片機使用<b class='flag-5'>定時器</b>中斷方式實現毫秒級<b class='flag-5'>延時</b>的設計

    【STM32單片機-庫函數SysTick延時delay

    : SysTick延時函數頭文件 /* --------------------------------------------------------- */#ifndef _DELA
    發表于 11-24 19:06 ?13次下載
    【STM32單片機-庫<b class='flag-5'>函數</b>】<b class='flag-5'>SysTick</b><b class='flag-5'>延時</b>—<b class='flag-5'>delay</b>

    【野火指南者】STM32F103延時函數及其系統定時器SysTick

    學習目的:1、學習STM32的系統定時器及其相關的寄存2、使用STM32的系統定時器來配置延時函數內容介紹:一、
    發表于 11-24 20:06 ?7次下載
    【野火指南者】STM32F103<b class='flag-5'>延時</b><b class='flag-5'>函數</b>及其系統<b class='flag-5'>定時器</b>—<b class='flag-5'>SysTick</b>

    STM32F4: Systick滴答定時器-延時函數講解(五)

    Systick定時器基礎知識講解Systick相關寄存函數講解delay
    發表于 12-01 15:21 ?15次下載
    STM32F4: <b class='flag-5'>Systick</b>滴答<b class='flag-5'>定時器</b>-<b class='flag-5'>延時</b><b class='flag-5'>函數</b>講解(五)

    SysTick 定時器

    SysTick定時器來實現延時,可以不占用系統定時器,節約資源。由于SysTick是在CPU核內部實現的,跟MCU外設無關,因此它的代碼可
    發表于 12-05 14:51 ?9次下載
    <b class='flag-5'>SysTick</b> <b class='flag-5'>定時器</b>

    STM32學習心得九:Systick滴答定時器延時函數解讀

    記錄一下,方便以后翻閱~主要內容:1) Systick定時器及相關寄存;2) Systick相關函數及延遲
    發表于 01-13 10:15 ?6次下載
    STM32學習心得九:<b class='flag-5'>Systick</b>滴答<b class='flag-5'>定時器</b>和<b class='flag-5'>延時</b><b class='flag-5'>函數</b>解讀

    stm32之HAL庫實現us延時方法

    stm32之HAL庫實現us延時方法HAL_Delay()源碼為ms級別的延時如下:/** * @brief This function provides accurate
    發表于 01-17 09:32 ?5次下載
    stm32之<b class='flag-5'>HAL</b>庫實現us<b class='flag-5'>延時</b>方法

    STM32 HAL延時函數 HAL_Delay 解析

    HAL 庫有提供延時函數,只不過它只能實現簡單的毫秒級別延時,沒有實現 us 級別延時。下面我們列出HA
    發表于 01-17 09:48 ?8次下載
    STM32 <b class='flag-5'>HAL</b> 庫<b class='flag-5'>延時</b><b class='flag-5'>函數</b> <b class='flag-5'>HAL_Delay</b> 解析

    【STM32】SysTick滴答定時器delay延時函數講解)

    Systick定時器,是一個簡單的定時器,對于CM3、CM4內核芯片,都有Systick定時器Syst
    發表于 02-10 10:35 ?13次下載
    【STM32】<b class='flag-5'>SysTick</b>滴答<b class='flag-5'>定時器</b>(<b class='flag-5'>delay</b><b class='flag-5'>延時</b><b class='flag-5'>函數</b>講解)

    HAL庫中用定時器實現自定義延時函數delay_us()

    STM32程序從標準庫移植到HAL庫的時候,會發現HAL庫中只有一個毫秒級延時函數HAL_Delay(),而沒有微秒級
    的頭像 發表于 09-21 10:33 ?1.2w次閱讀

    SysTickHAL_Delay的關系與注意事項

    本文將介紹SysTickHAL_Delay()函數之間的關系,以及使用HAL_Delay()函數的注意事項;
    的頭像 發表于 04-21 11:32 ?2548次閱讀
    主站蜘蛛池模板: 性8sex亚洲区入口 | 91天天操| 四虎海外在线永久免费看 | 超薄肉色丝袜精品足j福利 超黄视频在线观看 | 欧美交片| 四虎影院视频 | 成人亚洲视频 | 色视频在线免费观看 | 三级网站免费看 | 成人国产在线视频 | 成人av.com | 亚洲国产成人久久午夜 | 天天干夜夜曰 | 亚洲精品网站日本xxxxxxx | 黄色网址中文字幕 | 操久在线| 三级毛片在线播放 | 国产精品免费久久久免费 | 69xxxxx日本护士 | 国产性夜夜性夜夜爽91 | 日夜夜操| 99热热热 | 午夜视频日本 | 亚洲午夜久久久精品影院 | 色婷婷精品视频 | 亚洲精品456人成在线 | 国产精品国产三级国快看 | 免费色站| 久久久久女人精品毛片九一 | 深夜视频在线观看免费 | 簧片免费视频 | 婷婷亚洲综合 | 韩国免费特一级毛片 | 天天操天天干天天射 | 亚洲黄色网址大全 | 婷婷久久综合九色综合98 | 黄色午夜网站 | 免费国产成高清人在线视频 | 麻豆蜜桃| avtt天堂网永久资源 | 国产真实野战在线视频 |