當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]只要是有點(diǎn)基礎(chǔ)的騷友,點(diǎn)個(gè)燈就是個(gè)小KS!但是,我卻發(fā)現(xiàn)一些貓膩!!!先看程序:從牛卡板卡的硬件原理圖得知LD1為ST-Link的RGB指示燈,LD3為牛客板卡的電源指示燈,那么只剩下LD2了,LD2

只要是有點(diǎn)基礎(chǔ)的騷友,點(diǎn)個(gè)燈就是個(gè)小KS!但是,我卻發(fā)現(xiàn)一些貓膩!!!先看程序:

從??ò蹇ǖ挠布韴D得知LD1為ST-Link的RGB指示燈,LD3為??桶蹇ǖ碾娫粗甘緹簦敲粗皇O翷D2了,LD2為有主控MCU(STM32F030)控制的LED燈,

如下圖:


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

條件:SB21、SB42焊接或短路

點(diǎn)亮LD2條件:GPIOA5輸出高電平

以上是從原理圖中得到的信息,在檢查??ò蹇?OK!SB21、SB42已經(jīng)用0歐電阻連接了!那么硬件電路沒問題了!(其實(shí)板卡一上電,默認(rèn)的程序就使LD2閃爍了,我在這里主要只是表現(xiàn)一下分析思路。

那么我的程序如下:

Led_Divice.c

Led_Divice.h


Main.c



程序?qū)懞煤?嗨!跑的蠻快啊!牛客板卡中STM32F030沒有焊接8M(4~36M)晶振,只有一個(gè)很黑一坨的32.768KHz大小的晶振作為RTC的振蕩源。而且我故意延時(shí)了那么久!它居然跑的很快!!!

唉!不管了,先驗(yàn)證一下看會(huì)不會(huì)跑的更快!

然后我就再寫了一個(gè)函數(shù):

如下:



上圖的函數(shù)中,我使用了STM32的內(nèi)部RC振蕩器作為系統(tǒng)鎖相環(huán)PLL的時(shí)鐘源,配置思路如下:

(1)開啟內(nèi)部RC振蕩器HSI,作為時(shí)鐘源

(2)打開Flash的存取BUFF

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

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

(5)HSI的2分頻作為鎖相環(huán)(PLL)的時(shí)鐘源,并倍頻為12,即設(shè)置鎖相環(huán)的時(shí)鐘為48MHz,并使能鎖相環(huán),等待鎖相環(huán)啟動(dòng)成功

(6)設(shè)置鎖相環(huán)時(shí)鐘為系統(tǒng)時(shí)鐘

(7)等待時(shí)鐘啟動(dòng)成功

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


所以肯定要跑的最快!哈哈!

那么時(shí)鐘設(shè)置的思路源于什么呢???

三個(gè)字“時(shí)鐘樹”即“Clock Tree”.見下圖:


以上程序的思路就源于此圖的綠色線條了!哈哈!而且在時(shí)鐘樹中明明白白的標(biāo)出了,當(dāng)使用HSI作為PLL的時(shí)鐘源時(shí),必須2分頻,所以就有:(8M/2) * 12 = 40MHz了。當(dāng)然!其實(shí)STM32默認(rèn)是走藍(lán)色線的,也就是當(dāng)沒有任何設(shè)置是,系統(tǒng)默認(rèn)時(shí)鐘為8MHz,其他的就看分頻了。

那么其實(shí)還需要注意一點(diǎn):在看時(shí)鐘樹的時(shí)候,寫程序的時(shí)候要注意看看圖或者表在上面和最下面的說明,別傻乎乎的就直接操作了,萬一碰到人家逆鱗了,人家就不給你工作了。最上面的要找對(duì)自己的MCU(因?yàn)槭謨?cè)都是以系列劃分的,區(qū)別是封裝、資源和內(nèi)存(Flash和RAM)大小不同)。


對(duì)的!這個(gè)圖就是我們的STM32F030R8T6的時(shí)鐘樹下面的說明了。意思是,對(duì)于LSI/LSE不適用與STM32F030x8這個(gè)系列的MCU,所以當(dāng)我們使用到STM32F030x8 MCU的時(shí)候,就別亂玩LSI和LSE這東西。比如牛客板上的STM32F030R8T6就不行。

OK!程序?qū)懞昧?那么調(diào)用驗(yàn)證一下唄!看看是不是跑的更快了!

速度一樣的!沒變!啥情況呢????

其實(shí)!原因是這樣的!在程序進(jìn)入Main開始執(zhí)行之前,就已經(jīng)配置過時(shí)鐘了!并且配置的效果和我上面那個(gè)函數(shù):void RCC_Configuration(void)的效果是一樣的。

也就是說,就算我們不自己配置系統(tǒng)時(shí)鐘,ST也默認(rèn)幫我們配置好了!使用HSI作為振蕩源,PLL作為系統(tǒng)時(shí)鐘源,所以跑起來SYSCLK也是48MHz,所以跑的速度也就一樣快了啊!

在這里廢話幾句:上面/下面所說的跑的快,其實(shí)就是MCU的運(yùn)行速度,執(zhí)行指令的速度,那么在我上面的程序的效果就是,LD2閃爍的速度!那么怎么驗(yàn)證我上面的正確性呢??其實(shí)很簡(jiǎn)單!調(diào)用如下:


進(jìn)入main函數(shù)之后,第一件事就是把系統(tǒng)時(shí)鐘恢復(fù)默認(rèn)值,在燒錄程序,再看效果!就能很明顯的看到,這LD2閃爍的是有多慢了!

RCC_DeInit();是外設(shè)標(biāo)準(zhǔn)庫提供的函數(shù),當(dāng)然,想操作寄存器就自己寫吧!哈哈!具體的位置就是stm32f0xx_rcc.h,stm32f0xx_rcc.c文件中。所有關(guān)于RCC的內(nèi)容都在這兩個(gè)文件中找到,(其實(shí)ST提供了庫函數(shù)手冊(cè),這個(gè)更方便了)。

那么問題就止于此了嗎????不是的!這只是問題的開始!哈哈哈!否則點(diǎn)個(gè)燈我就沒必要廢話那么多了!

我們要分析一下,到底在進(jìn)入Main之前都干了啥???為什么把時(shí)鐘都設(shè)置了。

或許有些童鞋就說了,上課時(shí)/在很多C語言書上不是說C語言是從main函數(shù)開始執(zhí)行的么??我簡(jiǎn)單的回答一下這個(gè)問題:首先,我們初學(xué)時(shí)的C語言是標(biāo)準(zhǔn)的ANSI C語言,它運(yùn)行的平臺(tái)通常是在操作系統(tǒng)之上,那么也就是所,我們用戶編寫的用戶程序肯定是從main開始了啊,因?yàn)樵趍ain之前的東西普通程序員是看不到的啊,比如PC機(jī)的BIOS和Windows內(nèi)核我們也看不到也沒必要看,也不用關(guān)心,所以用戶程序肯定是從main開始執(zhí)行的。但是作為嵌入式驅(qū)動(dòng)開發(fā)工程師,那么main之前的是就需要連接、理解了,否則寫毛驅(qū)動(dòng)啊!在main之前通常都是一下匯編代碼或者內(nèi)嵌匯編代碼。一個(gè)硬件的啟動(dòng)應(yīng)該是這樣的:

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

(2)必要的硬件、寄存器、內(nèi)存等初始化,這部分通常是有匯編代碼實(shí)現(xiàn)

(3)堆棧的初始化

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

真實(shí)的CPU啟動(dòng)要復(fù)雜很多,但是也就大概是這么個(gè)意思,以上只是我個(gè)人對(duì)MCU啟動(dòng)的理解。

OK!進(jìn)入正題!那么我們要分析main之前的是,應(yīng)該從上面地方入手呢??答案是:MCU的啟動(dòng)文件:比如我的工程中的startup_stm32f030.s文件,它是一個(gè)匯編文件,那么里面肯定是匯編調(diào)用了。整個(gè)代碼并不多!就兩百多行!所以,有能力的話,分析一下還是很好的!

為堆棧開辟空間!!


建立異常向量表


建立中斷向量表!!!




搞了這么久!終于到代碼段了,也就是啟動(dòng)文件的開始和結(jié)束!哈哈!就這么一點(diǎn)點(diǎn)!!!

第一個(gè)紅色框,就是MCU上電就執(zhí)行的第一個(gè)語句,很明顯,就是設(shè)置堆棧指針,人家的注釋說的明明白白了!

第二個(gè)紅色框就是前面所說的了,系統(tǒng)時(shí)鐘的初始化!先放著!后面分析!

第三個(gè)紅色框就是要調(diào)轉(zhuǎn)到用戶程序的main執(zhí)行了。但是特別注意:在啟動(dòng)文件中的__main和用戶程序的main是有區(qū)別的,區(qū)別如下:

當(dāng)產(chǎn)生復(fù)位異常(就是復(fù)位):Reset_Handler PROC

IMPORT __main導(dǎo)入__main,然后執(zhí)行下午,然后就是又從main重新執(zhí)行,這就是為毛這叫復(fù)位了!



這些就是產(chǎn)生異?;蛘咧袛?,都來此進(jìn)行調(diào)度的過程了!!



這才是真正的堆??臻g的開辟和初始化。

整個(gè)啟動(dòng)文件就這樣就結(jié)束了!!!具體的解釋就不說了!我之前在CSDN看到了個(gè)哥們寫的非常好,我如果跟著解釋的話,未必有他的好!我就意思一下流程!有興趣全面理解的可以去CSDN找找!哈哈!!!(裝B失敗!)

那么解決我們未解決的問題!

跳轉(zhuǎn)到函數(shù)SystemInit,函數(shù)原型如下:




你看到的就是匯編語句LDR R0, =SystemInit 調(diào)用的函數(shù)原型了,是由C語言編寫的!(那么可能存在一下疑問,為毛在匯編里面調(diào)用C函數(shù)呢??答案是肯定的(廢話人家都調(diào)用了),因?yàn)閱?dòng)文件一上來就初始化了堆??臻g,只要堆??臻g初始化成功了,那么就可以運(yùn)行C語言函數(shù)了。如果覺得奇怪的童鞋,我還告訴你,在C語言函數(shù)中還可以寫匯編代碼呢??(可以去了解了解))。

那么我們分享一下!

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

可以看出操作的是:HSION位,那么往下看說明:



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

基本上以這種方法就可以分析出這個(gè)void SystemInit (void)函數(shù)是干嘛的了!下面就不說廢話了!就算是剛剛?cè)腴T的初學(xué)者,看到這里也應(yīng)該會(huì)自己分析了!哈哈哈!瞬間感覺自信倍增。

我記得以前我在使用STM32F103系列的MCU時(shí),在手冊(cè)(忘了是數(shù)據(jù)手冊(cè)還是應(yīng)用筆記)上好像看到推薦使用外部石英晶體振蕩器作為時(shí)鐘源,剛好我手里有好多8M的晶振(三種直插封裝),為了表現(xiàn)的牛B!我就給咱的??桶蹇恿藗€(gè)高大的晶振(廢話說完就附圖)??戳讼略韴D:


有這么幾件事要干:

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

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

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

OK!硬件連接好了!那么就重寫這么個(gè)程序!


使用外部晶振作為時(shí)鐘源進(jìn)行配置!調(diào)用如下:



就這樣編譯和燒錄!牛客板卡有在48MHz的時(shí)鐘下飛快的跑起來了!哈哈!!!

為毛是48MHz呢??嘿嘿!因?yàn)樵叟?桶迳系腗CU STM32F030的時(shí)鐘頻率最高就是48MHz。

就到這里!對(duì)以上 只屬于個(gè)人理解!有不足或者錯(cuò)誤的地方請(qǐng)告訴我一聲!讓我學(xué)習(xí)學(xué)習(xí)!資源共享交流才是學(xué)習(xí)最好的幫手!哈哈!

本人QQ:641251565 東方青

好了!曬下我高大上的晶振:


手機(jī)太爛!!!莫有辦法!!!哈哈哈!!反正很高很大,是不是高大上就不知道了!嘿嘿!!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉