在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32延時(shí)函數(shù)分析

            STM32延時(shí)函數(shù)分析

            作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
            Cortex-M3內(nèi)核處理器有個(gè)systick 24位倒計(jì)時(shí)定時(shí)器,當(dāng)計(jì)數(shù)到0時(shí),重新裝載初值.


            delay_init(u8 SYSCLK) //定時(shí)初始化函數(shù)分析
            {
            Systick->CTRL&=0xfffffffb; //bit2清空,選擇外部時(shí)鐘 HCLK/8
            fac_us=SYSCLK/8;
            fac_ms=(u16)fac_us*1000;
            }

            摘自STM32手冊(cè)
            6.2.6

            本文引用地址:http://www.biyoush.com/article/201611/323874.htm
            系統(tǒng)時(shí)鐘(SYSCLK)選擇
            系統(tǒng)復(fù)位后,HSI振蕩器被選為系統(tǒng)時(shí)鐘。當(dāng)時(shí)鐘源被直接或通過(guò)PLL間接作為系統(tǒng)時(shí)鐘時(shí),它將不能被停止。
            只有當(dāng)目標(biāo)時(shí)鐘源準(zhǔn)備就緒了(經(jīng)過(guò)啟動(dòng)穩(wěn)定階段的延遲或PLL穩(wěn)定),從一個(gè)時(shí)鐘源到另一個(gè)時(shí)鐘源的切換才會(huì)發(fā)生。在被選擇時(shí)鐘源沒(méi)有就緒時(shí),系統(tǒng)時(shí)鐘的切換不會(huì)發(fā)生。直至目標(biāo)時(shí)鐘源就緒,才發(fā)生切換。
            在時(shí)鐘控制寄存器(RCC_CR)里的狀態(tài)位指示哪個(gè)時(shí)鐘已經(jīng)準(zhǔn)備好了,哪個(gè)時(shí)鐘目前被用作系統(tǒng)時(shí)鐘。

            Systick時(shí)鐘那里來(lái)?



            Systick時(shí)鐘由系統(tǒng)時(shí)鐘8分頻后決定.

            解析delay_us(u32 nus)函數(shù)

            void delay_us(u32 nus)
            {
            u32 temp;
            Systick->LOAD=nus*fac_us; //裝入定時(shí)值
            Systick->VAL=0x00; //清空計(jì)數(shù)器值
            Systick->CTRL=0x01; //開(kāi)啟倒計(jì)時(shí)定時(shí)器
            do
            {
            temp=Systick->CTRL; //定時(shí)器狀態(tài)賦給變量
            }while((temp&0x01)&&(temp&(1<<16))); //判斷開(kāi)啟和是否計(jì)數(shù)到了0 (到達(dá)設(shè)定值)
            Systick->CTRL=0x00; //關(guān)閉定時(shí)
            Systick->VAL=0x00; //清空計(jì)數(shù)值

            }




            定時(shí)1us分析:
            由于Systick時(shí)鐘設(shè)置為是系統(tǒng)時(shí)鐘的8分頻 ,假設(shè)SYSCLK=72M 則Systick=9MHZ

            因?yàn)閒ac_us是基數(shù)無(wú)單位

            fac_us=SYSCLK/8; 即72/8=9 則Systick->LOAD=nus*fac_us, 假設(shè)定時(shí)1us 則Systick->LOAD=9.
            因?yàn)镾ystick是9M的速度倒計(jì)時(shí) 所以9個(gè)計(jì)數(shù)時(shí)間為9*(1/9M) 就是1us

            必須保證nus<=(2^24)/fac_us

            編程實(shí)例: I/O口輸出500us方波

            #include
            #include "sys.h"
            #include "delay.h"
            #include "usart.h"

            #define LED0 PBout(0)
            #define LED1 PBout(1)


            void led_init(void)
            {
            RCC->APB2ENR|=1<<3;
            GPIOB->CRL&=0xffffff00;
            GPIOB->CRL|=0x00000033; //推挽輸出
            GPIOB->ODR|=0xffff;

            }


            int main(void)
            {
            Stm32_Clock_Init(9);
            delay_init(72);
            led_init();
            while(1)
            {
            LED0=0;
            delay_us(500);
            LED0=1;
            delay_us(500);
            }
            }





            delay_ms(u16 nms)函數(shù)分析:
            void delay_ms(u16 nms)
            {
            u32 temp;
            SysTick->LOAD=(u32)nms*fac_ms;//時(shí)間加載(SysTick->LOAD為24bit)
            SysTick->VAL =0x00; //清空計(jì)數(shù)器
            SysTick->CTRL=0x01 ; //開(kāi)始倒數(shù)
            do
            {
            temp=SysTick->CTRL;
            }
            while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)
            SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
            SysTick->VAL =0X00; //清空計(jì)數(shù)器
            }

            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: STM32延時(shí)函

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉