久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > STM32F030 Nucleo-讓MCU全速點(dian)燈,其中隱藏的含義

STM32F030 Nucleo-讓(rang)MCU全速點燈,其(qi)中隱藏的含義 時(shi)間:2018-08-16      來(lai)源:未(wei)知

只要(yao)是有點(dian)基礎的(de)騷友,點(dian)個燈(deng)就是個小KS!但是,我卻發(fa)現一些貓膩!!!先看(kan)程序:

從(cong)牛卡(ka)板卡(ka)的硬件原(yuan)理圖得知LD1為(wei)ST-Link的RGB指示燈(deng),LD3為(wei)牛客(ke)板卡(ka)的電源指示燈(deng),那么只剩下LD2了,LD2為(wei)有主控(kong)MCU(STM32F030)控(kong)制的LED燈(deng),

如下圖:

I/O:LD2--------GPIOA5

條件(jian):SB21、SB42焊接或短路

點(dian)亮LD2條件:GPIOA5輸出高電平

以上(shang)是從原理圖(tu)中(zhong)得(de)到的(de)信息,在(zai)檢查牛卡板卡!OK!SB21、SB42已經用(yong)0歐電阻(zu)連(lian)接了!那么(me)硬(ying)件電路(lu)沒問(wen)題了!(其(qi)實(shi)板卡一(yi)上(shang)電,默認的(de)程序就(jiu)使(shi)LD2閃爍(shuo)了,我(wo)在(zai)這里主要只是表現(xian)一(yi)下分析(xi)思路(lu)。

那么我的程序如下:

Led_Divice.c

Led_Divice.h

Main.c

程序寫好后!嗨(hai)!跑的(de)蠻(man)快(kuai)啊!牛客板(ban)卡中STM32F030沒(mei)有(you)焊接(jie)8M(4~36M)晶振,只有(you)一個(ge)很黑一坨的(de)32.768KHz大小的(de)晶振作(zuo)為RTC的(de)振蕩源。而且我故意延時了那么久!它居然(ran)跑的(de)很快(kuai)!!!

唉!不管了,先驗證一下看會不會跑的更快!

然后我就再寫了(le)一個函數:

如下:

上圖的(de)函數中,我(wo)使用了(le)STM32的(de)內部(bu)RC振蕩器作為系統鎖相環(huan)PLL的(de)時(shi)鐘源,配置思路如下:

(1)開啟內部RC振蕩器HSI,作為時鐘源

(2)打開Flash的存取BUFF

(3)配置HCLK為四天時鐘SYSCLK的1分頻

(4)配置PCLK為HCLK的1分頻

(5)HSI的(de)2分(fen)頻作為(wei)鎖相(xiang)(xiang)(xiang)環(huan)(huan)(PLL)的(de)時鐘源,并(bing)倍頻為(wei)12,即設置(zhi)鎖相(xiang)(xiang)(xiang)環(huan)(huan)的(de)時鐘為(wei)48MHz,并(bing)使能鎖相(xiang)(xiang)(xiang)環(huan)(huan),等待鎖相(xiang)(xiang)(xiang)環(huan)(huan)啟動成功

(6)設置鎖相(xiang)環時鐘為(wei)系統(tong)時鐘

(7)等(deng)待時(shi)鐘(zhong)啟動(dong)成功

從以上的設置來看,AHB和APB總線(xian)的時(shi)鐘都為48M,依(yi)據是(shi):在DataSheet中表21說明AHB、APB、HCLK、PCLK可以大能達到48MHz。如下圖:

所以肯(ken)定要(yao)跑(pao)的快!哈哈!

那么(me)時鐘(zhong)設置的思(si)路(lu)源于(yu)什(shen)么(me)呢(ni)???

三個字“時(shi)鐘樹”即(ji)“Clock Tree”.見下圖:

以上(shang)程序的(de)(de)思(si)路就源于此圖(tu)的(de)(de)綠(lv)色線條了!哈(ha)(ha)哈(ha)(ha)!而且在時(shi)鐘(zhong)樹(shu)中明明白白的(de)(de)標出了,當使用HSI作為PLL的(de)(de)時(shi)鐘(zhong)源時(shi),必須2分頻,所以就有:(8M/2) * 12 = 40MHz了。當然!其實STM32默認(ren)(ren)是(shi)(shi)走(zou)藍色線的(de)(de),也就是(shi)(shi)當沒有任(ren)何設置是(shi)(shi),系(xi)統默認(ren)(ren)時(shi)鐘(zhong)為8MHz,其他的(de)(de)就看分頻了。

那么(me)其(qi)實還需要注(zhu)(zhu)意一(yi)點:在看(kan)(kan)時(shi)鐘樹(shu)的(de)時(shi)候,寫程序的(de)時(shi)候要注(zhu)(zhu)意看(kan)(kan)看(kan)(kan)圖或者表在上(shang)面和下面的(de)說明,別傻乎乎的(de)就(jiu)直接操作了(le),萬(wan)一(yi)碰到人(ren)(ren)家逆(ni)鱗(lin)了(le),人(ren)(ren)家就(jiu)不給你(ni)工作了(le)。上(shang)面的(de)要找對自己的(de)MCU(因為(wei)手冊都(dou)是(shi)以系列劃分的(de),區(qu)別是(shi)封裝、資源和內存(Flash和RAM)大小不同(tong))。

對(dui)的!這(zhe)個圖就(jiu)是我們的STM32F030R8T6的時鐘樹(shu)下面的說明了(le)。意思是,對(dui)于LSI/LSE不適用(yong)與STM32F030x8這(zhe)個系列(lie)的MCU,所以當(dang)我們使(shi)用(yong)到STM32F030x8 MCU的時候,就(jiu)別亂玩LSI和(he)LSE這(zhe)東西(xi)。比如(ru)牛客板上的STM32F030R8T6就(jiu)不行。

OK!程序寫(xie)好了!那么調用驗證一(yi)下唄!看看是不(bu)是跑的更快了!

速度一樣的(de)!沒(mei)變!啥(sha)情況呢????

其實(shi)!原因是(shi)這樣的!在(zai)程序(xu)進入Main開始執行(xing)之前,就已(yi)經配置過時(shi)鐘了!并且配置的效果(guo)和我上面那個函(han)數(shu):void RCC_Configuration(void)的效果(guo)是(shi)一(yi)樣的。

 也(ye)就(jiu)是(shi)(shi)說,就(jiu)算我們不(bu)自己配(pei)置系(xi)統時(shi)鐘(zhong),ST也(ye)默認(ren)幫我們配(pei)置好了!使用HSI作(zuo)(zuo)為振蕩(dang)源,PLL作(zuo)(zuo)為系(xi)統時(shi)鐘(zhong)源,所以(yi)跑(pao)起(qi)來SYSCLK也(ye)是(shi)(shi)48MHz,所以(yi)跑(pao)的速度(du)也(ye)就(jiu)一樣快了啊!

在(zai)這里廢話幾句:上(shang)面/下面所(suo)說的(de)(de)跑的(de)(de)快,其實(shi)就是MCU的(de)(de)運(yun)行速(su)度,執行指(zhi)令的(de)(de)速(su)度,那么在(zai)我(wo)上(shang)面的(de)(de)程序的(de)(de)效果(guo)就是,LD2閃爍(shuo)的(de)(de)速(su)度!那么怎么驗證我(wo)上(shang)面的(de)(de)正(zheng)確性呢??其實(shi)很簡單!調用(yong)如下:

進(jin)入(ru)main函數之(zhi)后,第一件(jian)事(shi)就是把(ba)系統時鐘恢復默(mo)認(ren)值,在(zai)燒(shao)錄(lu)程序,再看效(xiao)果!就能很明顯(xian)的(de)看到(dao),這LD2閃爍的(de)是有多慢了!

RCC_DeInit();是(shi)外設標準庫(ku)提(ti)供(gong)(gong)的函(han)數,當(dang)然,想(xiang)操作寄存器就自己寫吧!哈哈!具體(ti)的位置(zhi)就是(shi)stm32f0xx_rcc.h,stm32f0xx_rcc.c文件(jian)中。所有(you)關于RCC的內(nei)容都在這兩個文件(jian)中找到,(其實ST提(ti)供(gong)(gong)了(le)庫(ku)函(han)數手(shou)冊(ce),這個更方(fang)便(bian)了(le))。

那么問(wen)題就止于此(ci)了(le)嗎????不是的!這只是問(wen)題的開(kai)始!哈哈哈!否則點(dian)個燈我就沒必(bi)要廢話那么多了(le)!

 我(wo)們要分析一(yi)下,到底在進入(ru)Main之前都(dou)(dou)干了啥(sha)???為什么把時鐘(zhong)都(dou)(dou)設置了。

或許有些(xie)童鞋就(jiu)說了,上課時/在(zai)很多C語言書上不(bu)是(shi)(shi)(shi)說C語言是(shi)(shi)(shi)從main函數開(kai)(kai)始執行(xing)的(de)(de)么(me)??我(wo)(wo)簡單的(de)(de)回答一下這(zhe)個(ge)問(wen)題:首先,我(wo)(wo)們(men)初學時的(de)(de)C語言是(shi)(shi)(shi)標準的(de)(de)ANSI C語言,它運行(xing)的(de)(de)平臺通常(chang)是(shi)(shi)(shi)在(zai)操作系(xi)統之(zhi)(zhi)上,那(nei)么(me)也就(jiu)是(shi)(shi)(shi)所,我(wo)(wo)們(men)用(yong)戶(hu)(hu)編寫的(de)(de)用(yong)戶(hu)(hu)程(cheng)(cheng)序肯定是(shi)(shi)(shi)從main開(kai)(kai)始了啊(a),因為(wei)在(zai)main之(zhi)(zhi)前的(de)(de)東西普通程(cheng)(cheng)序員是(shi)(shi)(shi)看不(bu)到(dao)的(de)(de)啊(a),比如PC機(ji)的(de)(de)BIOS和Windows內核(he)我(wo)(wo)們(men)也看不(bu)到(dao)也沒必要看,也不(bu)用(yong)關心,所以用(yong)戶(hu)(hu)程(cheng)(cheng)序肯定是(shi)(shi)(shi)從main開(kai)(kai)始執行(xing)的(de)(de)。但是(shi)(shi)(shi)作為(wei)嵌入式驅動(dong)開(kai)(kai)發工程(cheng)(cheng)師,那(nei)么(me)main之(zhi)(zhi)前的(de)(de)是(shi)(shi)(shi)就(jiu)需要連接、理解了,否(fou)則(ze)寫毛驅動(dong)啊(a)!在(zai)main之(zhi)(zhi)前通常(chang)都(dou)是(shi)(shi)(shi)一下匯(hui)編代碼或者內嵌匯(hui)編代碼。一個(ge)硬(ying)件的(de)(de)啟動(dong)應該是(shi)(shi)(shi)這(zhe)樣(yang)的(de)(de):

(1)異常向(xiang)量表(biao)/中斷向(xiang)量表(biao)的建立(li)

(2)必要的硬件、寄存(cun)器、內存(cun)等(deng)初(chu)始(shi)化,這部分通常是有匯編(bian)代碼實現

(3)堆棧的初(chu)始(shi)化

(4)進入用戶程序前的初始化

真實(shi)的(de)CPU啟動要復雜很(hen)多(duo),但是(shi)(shi)也就大概是(shi)(shi)這么個意思,以上只是(shi)(shi)我個人對MCU啟動的(de)理解。

OK!進入正題!那么我(wo)們要分(fen)析(xi)(xi)main之前的(de)是,應該從上面地方入手呢??答案(an)是:MCU的(de)啟(qi)動文(wen)件(jian):比如(ru)我(wo)的(de)工程中的(de)startup_stm32f030.s文(wen)件(jian),它(ta)是一(yi)個(ge)匯編文(wen)件(jian),那么里面肯(ken)定(ding)是匯編調(diao)用(yong)了。整個(ge)代碼并不(bu)多(duo)(duo)!就兩百多(duo)(duo)行!所以,有能力(li)的(de)話(hua),分(fen)析(xi)(xi)一(yi)下(xia)還是很好的(de)!

為堆(dui)棧(zhan)開辟空間!!

建(jian)立異常向量表

建立(li)中斷向量表!!!

搞了(le)這么久!終(zhong)于到代碼段(duan)了(le),也就是啟動文件的(de)開始和結(jie)束!哈(ha)哈(ha)!就這么一點點!!!

第一(yi)個(ge)紅(hong)色框,就是(shi)(shi)MCU上電就執行的第一(yi)個(ge)語(yu)句,很(hen)明(ming)顯,就是(shi)(shi)設置堆棧(zhan)指針,人家的注釋說的明(ming)明(ming)白(bai)白(bai)了!

第二個紅(hong)色框就(jiu)是前面所說的了(le),系統(tong)時(shi)鐘的初始化!先放著(zhu)!后面分析!

第三個紅(hong)色框就(jiu)是(shi)要調轉(zhuan)到用戶(hu)程(cheng)序的main執行(xing)了。但是(shi)特別注意(yi):在(zai)啟動文件中的__main和用戶(hu)程(cheng)序的main是(shi)有區(qu)別的,區(qu)別如下:

當產生復位(wei)(wei)異常(chang)(就是復位(wei)(wei)):Reset_Handler PROC

IMPORT __main導入__main,然(ran)后(hou)執行(xing)下午,然(ran)后(hou)就(jiu)是(shi)又從main重(zhong)新執行(xing),這就(jiu)是(shi)為毛這叫復位了(le)!

 

這(zhe)些就是產生(sheng)異常或者中斷,都來此進行調(diao)度(du)的過程(cheng)了!!

這(zhe)才是真正(zheng)的堆棧空間的開辟和初(chu)始化(hua)。

整個(ge)啟動文(wen)件就(jiu)這樣就(jiu)結束了!!!具體的(de)解(jie)(jie)釋就(jiu)不說了!我之前在CSDN看到(dao)了個(ge)哥們寫的(de)非常(chang)好,我如果跟(gen)著解(jie)(jie)釋的(de)話,未(wei)必有他的(de)好!我就(jiu)意思一下流程!有興趣全面理解(jie)(jie)的(de)可(ke)以去CSDN找找!哈哈!!!(裝(zhuang)B失敗!)

那么(me)解決(jue)我們未解決(jue)的問題!

 跳轉到函(han)(han)數SystemInit,函(han)(han)數原型(xing)如下:

你看到的(de)就(jiu)(jiu)是匯編語(yu)句LDR R0, =SystemInit 調(diao)(diao)用(yong)的(de)函數(shu)(shu)原型了(le),是由C語(yu)言(yan)編寫的(de)!(那么可(ke)(ke)(ke)能存在一下(xia)疑問(wen),為(wei)毛在匯編里面調(diao)(diao)用(yong)C函數(shu)(shu)呢??答(da)案是肯定的(de)(廢(fei)話人家都調(diao)(diao)用(yong)了(le)),因(yin)為(wei)啟動文件一上來(lai)就(jiu)(jiu)初(chu)始(shi)化了(le)堆(dui)棧空(kong)間(jian)(jian),只要(yao)堆(dui)棧空(kong)間(jian)(jian)初(chu)始(shi)化成功(gong)了(le),那么就(jiu)(jiu)可(ke)(ke)(ke)以運行C語(yu)言(yan)函數(shu)(shu)了(le)。如果覺得奇怪的(de)童鞋,我還(huan)告訴你,在C語(yu)言(yan)函數(shu)(shu)中還(huan)可(ke)(ke)(ke)以寫匯編代碼呢??(可(ke)(ke)(ke)以去(qu)了(le)解了(le)解))。

那么(me)我們分享一下!

第一句:RCC->CR |= (uint32_t)0x00000001; 從語(yu)句可以(yi)看(kan)出,所操作的是RCC_CR寄存器的0位。所以(yi)就(jiu)需(xu)要在參考手指中(zhong)找到RCC_CR寄存器的說明,如下(xia):

可(ke)以看(kan)出操作(zuo)的是:HSION位,那么(me)往(wang)下(xia)看(kan)說明:

一清二楚(chu)的說明了(le)HSION位置1時(shi),使能HSI振蕩器。OK!

基本上以這種方(fang)法就可以分(fen)析(xi)出(chu)這個void SystemInit (void)函數是(shi)干(gan)嘛的(de)(de)了!下面就不說廢(fei)話(hua)了!就算是(shi)剛剛入門的(de)(de)初學者(zhe),看到這里也應該會(hui)自己分(fen)析(xi)了!哈(ha)(ha)哈(ha)(ha)哈(ha)(ha)!瞬間(jian)感覺(jue)自信(xin)倍增。

我(wo)(wo)記(ji)得以前我(wo)(wo)在使(shi)用(yong)(yong)STM32F103系(xi)列(lie)的(de)MCU時,在手冊(ce)(忘(wang)了(le)(le)是(shi)數據手冊(ce)還是(shi)應(ying)用(yong)(yong)筆(bi)記(ji))上好像看到推薦使(shi)用(yong)(yong)外部石英晶(jing)體振蕩器作(zuo)為時鐘(zhong)源,剛好我(wo)(wo)手里有好多8M的(de)晶(jing)振(三種直(zhi)插封裝),為了(le)(le)表現的(de)牛(niu)B!我(wo)(wo)就(jiu)給咱的(de)牛(niu)客板卡加(jia)了(le)(le)個高大的(de)晶(jing)振(廢話說完就(jiu)附圖)。看了(le)(le)下(xia)原理圖:

有這么(me)幾件事(shi)要干(gan):

(1)找兩個20pF的(de)無極(ji)性封裝為0603的(de)電容焊上,絲(si)印(yin)分別是:C33和C34

(2)找(zhao)兩個封裝為06030歐電阻焊(han)上,絲印分(fen)別是(shi):C35和C37

(3)把我高(gao)大的(de)晶振焊上

 OK!硬件連接(jie)好(hao)了!那么(me)就(jiu)重寫這么(me)個(ge)程序!

使(shi)用外部晶振作(zuo)為時鐘源進行配置!調用如(ru)下:

就這樣編譯和燒錄(lu)!牛客(ke)板卡有在48MHz的(de)時鐘下飛(fei)快的(de)跑(pao)起(qi)來了!哈哈!!!

為(wei)毛(mao)是(shi)48MHz呢??嘿(hei)嘿(hei)!因為(wei)咱牛客板上的MCU STM32F030的時(shi)鐘頻(pin)率高就是(shi)48MHz。

就到這里(li)!對以上 只屬于個人理解!有不足或者錯誤(wu)的地方請告訴(su)我一聲!讓(rang)我學(xue)習(xi)學(xue)習(xi)!資源共享交流(liu)才是學(xue)習(xi)好(hao)的幫手!哈(ha)哈(ha)!

本人QQ:641251565 東方(fang)青

好了(le)!曬(shai)下我高大上(shang)的晶振(zhen):

手(shou)機太爛!!!莫有辦法!!!哈哈哈!!反正很高(gao)很大(da),是(shi)(shi)不是(shi)(shi)高(gao)大(da)上(shang)就不知道了!嘿嘿!!

上一篇:Platform相親之旅

下一篇:STM32F030 Nucleo-開發調試的經驗USART的重要性

熱(re)點文章推(tui)薦
華清學(xue)員就業榜單
高(gao)薪(xin)學員經驗(yan)分享
熱(re)點新(xin)聞(wen)推薦
前(qian)臺專線:010-82525158 企(qi)業培訓洽談專線:010-82525379 院校合作洽(qia)談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部