新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F051應(yīng)用筆記-系統(tǒng)時間選擇及PLL倍頻設(shè)

        STM32F051應(yīng)用筆記-系統(tǒng)時間選擇及PLL倍頻設(shè)

        作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
        對于廣大初次接觸STM32的讀者朋友(甚至是初次接觸ARM器件的讀者朋友)來說,在熟悉了開發(fā)環(huán)境的使用之后,往往“栽倒”在同一個問題上。這問題有個關(guān)鍵字叫:時鐘樹。
        眾所周知,微控制器(處理器)的運(yùn)行必須要依賴周期性的時鐘脈沖來驅(qū)動——往往由一個外部晶體振蕩器提供時鐘輸入為始,最終轉(zhuǎn)換為多個外部設(shè)備的周期性運(yùn)作為末,這種時鐘“能量”擴(kuò)散流動的路徑,猶如大樹的養(yǎng)分通過主干流向各個分支,因此常稱之為“時鐘樹”。在一些傳統(tǒng)的低端8位單片機(jī)諸如51,AVR,PIC等單片機(jī),其也具備自身的一個時鐘樹系統(tǒng),但其中的絕大部分是不受用戶控制的,亦即在單片機(jī)上電后,時鐘樹就固定在某種不可更改的狀態(tài)(假設(shè)單片機(jī)處于正常工作的狀態(tài))。比如51單片機(jī)使用典型的12MHz晶振作為時鐘源,則外設(shè)如IO口、定時器、串口等設(shè)備的驅(qū)動時鐘速率便已經(jīng)是固定的,用戶無法將此時鐘速率更改,除非更換晶振。
        而STM32微控制器的時鐘樹則是可配置的,其時鐘輸入源與最終達(dá)到外設(shè)處的時鐘速率不再有固定的關(guān)系,而不同的外設(shè)也對應(yīng)有不同的時鐘,使用任何一個外設(shè)都必須打開相應(yīng)的時鐘。這樣的好處就是,如果不使用一個外設(shè)的時候,就把它的時鐘關(guān)掉,從而可以降低系統(tǒng)的功耗,達(dá)到節(jié)能,實(shí)現(xiàn)低功耗的效果。
        1、啟動代碼分析—SystemInit (void)系統(tǒng)時鐘初始化
        SystemInit (void)是系統(tǒng)初始化函數(shù),很多新手不知其在何處調(diào)用,小肖馬上為你解惑。
        startup_stm32f0xx.s文件中匯編代碼為STM32啟動代碼。
        啟動代碼步驟一般為:
        1)堆和棧的初始化;
        2)向量表定義;
        3)地址重映射及中斷向量表的轉(zhuǎn)移;
        4)設(shè)置系統(tǒng)時鐘頻率;
        5)中斷寄存器的初始化;
        6)進(jìn)入主程序。
        廢話太多,估計(jì)也看煩了。現(xiàn)在挑重點(diǎn)講,重點(diǎn)在第4個步驟。(第5、6一般編程時在用戶代碼中執(zhí)行)。
        Reset_Handler
        PROC;標(biāo)記一個函數(shù)的開始,也就是復(fù)位入口。
        IMPORT
        __main ; 通知編譯器要使用的標(biāo)號在其他文件
        IMPORT
        SystemInit; 同上
        關(guān)鍵在這里了,
        LDR
        R0, =SystemInit;
        這里的“=”表示LDR目前是偽指令不是標(biāo)準(zhǔn)指令。這里是把SystemInit的地址給RO。也就是說SystemInit (void)在這里被調(diào)用編譯。所以用戶編在寫程序時無需編寫PLL配置程序。
        BX
        R0;BX是ARM指令集和THUMB指令集之間程序的跳轉(zhuǎn)。
        其他省略。詳情如下圖所示:
        SystemInit初始化RCC之后調(diào)用SetSysClock(void)系統(tǒng)時鐘設(shè)置函數(shù)
        代碼如下:
        void SystemInit (void)
        {
        RCC->CR |= (uint32_t)0x00000001;
        RCC->CFGR &= (uint32_t)0xF8FFB80C;
        RCC->CR &= (uint32_t)0xFEF6FFFF;
        RCC->CR &= (uint32_t)0xFFFBFFFF;
        RCC->CFGR &= (uint32_t)0xFFC0FFFF;
        RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
        RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
        RCC->CR2 &= (uint32_t)0xFFFFFFFE;
        RCC->CIR = 0x00000000;
        SetSysClock();
        }
        2、SetSysClock()設(shè)置系統(tǒng)時鐘
        由于之前選擇定義了PLL_SOURCE_HSE,執(zhí)行條件編譯。
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使能HSE,如下圖所示:
        等待HSE設(shè)置完畢,代碼如下。
        do
        {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }
        設(shè)置完成,HSEStatus賦值1,代碼如下:
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }
        HSEStatus HSE==1表示HSE狀態(tài)正常,啟用緩沖區(qū)和設(shè)置FLASH延遲、HCLKPCLK。PLL倍頻如下圖紅線所示,修改RCC_CFGR_PLLMULL實(shí)現(xiàn)倍頻(默認(rèn)6倍頻)。



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 汽车| 曲阜市| 克山县| 汝南县| 百色市| 和政县| 云和县| 房产| 广平县| 新密市| 九台市| 上蔡县| 昌都县| 古浪县| 岗巴县| 黔西县| 同德县| 渭南市| 商南县| 阳朔县| 铜鼓县| 杭州市| 长海县| 乌鲁木齐市| 镇江市| 靖州| 社旗县| 日照市| 灵寿县| 万山特区| 玉门市| 铜陵市| 海晏县| 大石桥市| 延川县| 彭阳县| 衡水市| 黎川县| 中江县| 西乡县| 昆明市|