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

ELEOK

標(biāo)題: stm32的精確延時(shí)利用系統(tǒng)滴答systick [打印本頁(yè)]

作者: coolice    時(shí)間: 2021-8-13 17:51
標(biāo)題: stm32的精確延時(shí)利用系統(tǒng)滴答systick
利用系統(tǒng)滴答定時(shí)器來(lái)實(shí)現(xiàn)精確延時(shí),需要以下五步:
1、設(shè)置滴答定時(shí)器的時(shí)鐘,通過(guò)設(shè)置其控制寄存器,選擇外部時(shí)鐘,即為系統(tǒng)時(shí)鐘的八分之一,若系統(tǒng)時(shí)鐘為72M,則滴答定時(shí)器時(shí)鐘為9M。即定時(shí)一秒需要9M個(gè)時(shí)鐘周期。
2、設(shè)置滴答定時(shí)器的重裝載寄存器的數(shù)值,即需要延時(shí)的時(shí)鐘周期數(shù)。如:若需要延時(shí)20微秒,則重裝載值為20*9.若要延時(shí)20毫秒,則設(shè)置重裝載值為20*9000.
3、清空滴答定時(shí)器當(dāng)前值寄存器的值,使之為零,以便使能計(jì)數(shù)時(shí)能夠從設(shè)定值開(kāi)始倒數(shù)計(jì)時(shí)。
4、設(shè)置滴答定時(shí)器的控制寄存器,開(kāi)始倒計(jì)數(shù)。
5、查詢滴答定時(shí)器的狀態(tài)位,定時(shí)時(shí)間到,關(guān)閉定時(shí)器,清空定時(shí)器當(dāng)前值。
  1. void delay_init(u8 SYSCLK)
  2. {
  3.    SysTick->CTRL&=0xfffffffb;//控制寄存器,選擇外部時(shí)鐘即系統(tǒng)時(shí)鐘的八分之一(HCLK/8;72M/8=9M)
  4.    fac_us=SYSCLK/8;    //定義全局變量,即延時(shí)一微秒所需的的時(shí)鐘周期數(shù)(72/8=9,單位為微妙)
  5.    fac_ms=(u16)fac_us*1000; //一毫秒所需的時(shí)鐘周期數(shù)(9000)
  6. }
  7. void Delay_us(u32 nus)
  8. {
  9.   u32 temp;   
  10.   SysTick->LOAD=nus*fac_us; //時(shí)間加載(即延時(shí)多少個(gè)時(shí)鐘周期)  
  11.   SysTick->VAL=0x00;        //清空計(jì)數(shù)器
  12.   SysTick->CTRL=0x01 ;      //開(kāi)始倒數(shù)
  13. do
  14. {
  15.   temp=SysTick->CTRL;
  16. }
  17.   while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)  
  18.   SysTick->CTRL=0x00;       //關(guān)閉計(jì)數(shù)器
  19.   SysTick->VAL =0X00;       //清空計(jì)數(shù)器
  20. }
  21. 或者
  22. void Delay_us(u32 Nus)   
  23. {   
  24. SysTick->LOAD=Nus*9;          //時(shí)間加載    72M主頻     
  25. SysTick->CTRL|=0x01;             //開(kāi)始倒數(shù)      
  26. while(!(SysTick->CTRL&(1<<16))); //等待時(shí)間到達(dá)   
  27. SysTick->CTRL=0X00000000;        //關(guān)閉計(jì)數(shù)器   
  28. SysTick->VAL=0X00000000;         //清空計(jì)數(shù)器        
  29. }
復(fù)制代碼







歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0