新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于stm32的精確延時利用系統滴答systick

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

        作者: 時間:2016-11-27 來源:網絡 收藏
        利用系統滴答定時器來實現精確延時,需要以下五步:

        1、設置滴答定時器的時鐘,通過設置其控制寄存器,選擇外部時鐘,即為系統時鐘的八分之一,若系統時鐘為72M,則滴答定時器時鐘為9M。即定時一秒需要9M個時鐘周期。

        本文引用地址:http://www.104case.com/article/201611/322267.htm

        2、設置滴答定時器的重裝載寄存器的數值,即需要延時的時鐘周期數。如:若需要延時20微秒,則重裝載值為20*9.若要延時20毫秒,則設置重裝載值為20*9000.

        3、清空滴答定時器當前值寄存器的值,使之為零,以便使能計數時能夠從設定值開始倒數計時。

        4、設置滴答定時器的控制寄存器,開始倒計數。

        5、查詢滴答定時器的狀態位,定時時間到,關閉定時器,清空定時器當前值。

        void delay_init(u8 SYSCLK)

        {

        SysTick->CTRL&=0xfffffffb;//控制寄存器,選擇外部時鐘即系統時鐘的八分之一(HCLK/8;72M/8=9M)

        fac_us=SYSCLK/8; //定義全局變量,即延時一微秒所需的的時鐘周期數(72/8=9,單位為微妙)

        fac_ms=(u16)fac_us*1000; //一毫秒所需的時鐘周期數(9000)

        }

        void Delay_us(u32 nus)

        {

        u32 temp;

        SysTick->LOAD=nus*fac_us; //時間加載(即延時多少個時鐘周期)

        SysTick->VAL=0x00; //清空計數器

        SysTick->CTRL=0x01 ; //開始倒數

        do

        {

        temp=SysTick->CTRL;

        }

        while(temp&0x01&&!(temp&(1<<16)));//等待時間到達

        SysTick->CTRL=0x00; //關閉計數器

        SysTick->VAL =0X00; //清空計數器

        }

        或者

        void Delay_us(u32 Nus)

        {

        SysTick->LOAD=Nus*9; //時間加載 72M主頻

        SysTick->CTRL|=0x01; //開始倒數

        while(!(SysTick->CTRL&(1<<16))); //等待時間到達

        SysTick->CTRL=0X00000000; //關閉計數器

        SysTick->VAL=0X00000000; //清空計數器

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 奈曼旗| 西乌| 兴安盟| 三原县| 惠来县| 通辽市| 古田县| 喜德县| 黔东| 锡林浩特市| 原平市| 海伦市| 洛川县| 邛崃市| 赫章县| 罗江县| 旺苍县| 梅州市| 烟台市| 兴山县| 休宁县| 芜湖市| 云林县| 奉节县| 讷河市| 易门县| 长岛县| 祁连县| 安阳县| 横山县| 固镇县| 山丹县| 柘荣县| 封开县| 双柏县| 且末县| 吴桥县| 高碑店市| 如东县| 本溪市| 哈尔滨市|