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

 找回密碼
 注冊
搜索

stm32的精確延時利用系統滴答systick

[復制鏈接]
樓主
coolice 發表于 2021-8-13 17:51:33 | 只看該作者 |倒序瀏覽 |閱讀模式
利用系統滴答定時器來實現精確延時,需要以下五步:
1、設置滴答定時器的時鐘,通過設置其控制寄存器,選擇外部時鐘,即為系統時鐘的八分之一,若系統時鐘為72M,則滴答定時器時鐘為9M。即定時一秒需要9M個時鐘周期。
2、設置滴答定時器的重裝載寄存器的數值,即需要延時的時鐘周期數。如:若需要延時20微秒,則重裝載值為20*9.若要延時20毫秒,則設置重裝載值為20*9000.
3、清空滴答定時器當前值寄存器的值,使之為零,以便使能計數時能夠從設定值開始倒數計時。
4、設置滴答定時器的控制寄存器,開始倒計數。
5、查詢滴答定時器的狀態位,定時時間到,關閉定時器,清空定時器當前值。
  1. void delay_init(u8 SYSCLK)
  2. {
  3.    SysTick->CTRL&=0xfffffffb;//控制寄存器,選擇外部時鐘即系統時鐘的八分之一(HCLK/8;72M/8=9M)
  4.    fac_us=SYSCLK/8;    //定義全局變量,即延時一微秒所需的的時鐘周期數(72/8=9,單位為微妙)
  5.    fac_ms=(u16)fac_us*1000; //一毫秒所需的時鐘周期數(9000)
  6. }
  7. void Delay_us(u32 nus)
  8. {
  9.   u32 temp;   
  10.   SysTick->LOAD=nus*fac_us; //時間加載(即延時多少個時鐘周期)  
  11.   SysTick->VAL=0x00;        //清空計數器
  12.   SysTick->CTRL=0x01 ;      //開始倒數
  13. do
  14. {
  15.   temp=SysTick->CTRL;
  16. }
  17.   while(temp&0x01&&!(temp&(1<<16)));//等待時間到達  
  18.   SysTick->CTRL=0x00;       //關閉計數器
  19.   SysTick->VAL =0X00;       //清空計數器
  20. }
  21. 或者
  22. void Delay_us(u32 Nus)   
  23. {   
  24. SysTick->LOAD=Nus*9;          //時間加載    72M主頻     
  25. SysTick->CTRL|=0x01;             //開始倒數      
  26. while(!(SysTick->CTRL&(1<<16))); //等待時間到達   
  27. SysTick->CTRL=0X00000000;        //關閉計數器   
  28. SysTick->VAL=0X00000000;         //清空計數器        
  29. }
復制代碼


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

本版積分規則

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

GMT+8, 2026-5-26 01:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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