2-STM32帶你入坑系列(點(diǎn)亮一個(gè)燈--Keil)

1-STM32帶你入坑系列(STM32介紹)


首先是安裝軟件

這一節(jié)用Kei來實(shí)現(xiàn),需要安裝MDK4.7這個(gè)軟件,怎么安裝,自己百度哈.都學(xué)習(xí)32的人了,不會(huì)連個(gè)軟件都不會(huì)安裝吧....還是那句話

沒有百度一下解決不了的事情,如果有那就是百度兩下(除了科研和探索人類未知領(lǐng)域)


建個(gè)文件夾






我用的是STM32F103C8t6 ?大家根據(jù)自己的選擇

?建一個(gè)主函數(shù)的 .c文件







?編譯一下


啟動(dòng)文件里面有個(gè)執(zhí)行 SystemInit函數(shù)的調(diào)用,因?yàn)樵蹧]有這個(gè)函數(shù),所以報(bào)錯(cuò)了,其實(shí)寄存器開發(fā)用不到,實(shí)際上這是官方提供的庫開發(fā)的時(shí)候需要的

可以看一下官方提供的庫開發(fā)里面SystemInit實(shí)現(xiàn)的什么功能


主要的是配置了一開始的時(shí)鐘,因?yàn)槭浅鯇W(xué)者,所以先不用管哈,以后咱也會(huì)去配置外設(shè)時(shí)鐘,,不對(duì),這一節(jié)就會(huì)去配置時(shí)鐘

咱就寫一個(gè)這個(gè)函數(shù),然后內(nèi)部什么都不寫



?還有個(gè)警告,實(shí)說最后的代碼要多加一個(gè)空行

我也不知道為什么有這個(gè)規(guī)則


我的開發(fā)板有個(gè)燈是PC13 ?


咱就讓PC13輸出高電平,然后控制燈亮


然后咱就找控制PC13的寄存器,看看往寄存器里面寫幾然后控制PC13輸出高電平





首先需要明確一件事情哈

每個(gè)IO都有 ?CRL,CRH,IDR,ODR,BSRR,BRR,LCKR 這些寄存器,而這些寄存器都是32位的,占四個(gè)字節(jié),(大家可以看圖哈),


假設(shè)咱的單片機(jī)哈有PA口和PB口

然后假設(shè)PA的地址是 ?0x40010800 ?PB的地址是 0x40010C00 實(shí)際上內(nèi)部的寄存器呢,是這樣的

然后再說一下引腳的模式


?模擬輸入:該引腳就會(huì)連接內(nèi)部的模擬輸入模塊(使用ADC或者DAC的時(shí)候需要設(shè)置)

浮空輸入模式:引腳狀態(tài)完全由外部決定(一般串口的RX引腳設(shè)置成這種模式)

上拉/下拉:就是內(nèi)部實(shí)現(xiàn)上下拉

通用推挽輸出:就是直接輸出高低電平,推挽輸出還有個(gè)速率問題

這樣理解:假設(shè)SPI傳輸?shù)乃俾适?M的,假設(shè)我設(shè)置了引腳的輸出最大是2M,引腳的反轉(zhuǎn)速度根本跟不上哈,所以會(huì)傳輸不正常,所以可以設(shè)置輸出速率為10M

當(dāng)然速率越高,功耗越大

通用開漏輸出:和51單片機(jī)的P0口似的,沒有輸出能力,需要外部接上拉電阻才可以(可以用來做通信時(shí)候的電壓匹配,因?yàn)樵鄣?2是3,3V供電,假設(shè)和5V的芯片通信,咱可以設(shè)置為這個(gè)模式,然后上拉一個(gè)電阻,然后電阻另一邊接的是5V)


后面還有復(fù)用功能推挽/開漏輸出:其實(shí)哈所謂復(fù)用,就是指引腳的第二功能,就是除了正常的輸入輸出的其它功能,列如:

PA2還有個(gè)功能是串口2的輸出,如果要用這個(gè)功能,就需要配置PA2為:復(fù)用推挽輸出

好啦好啦,請(qǐng)清空自己的腦子,這些東西哈,等用到了再說.... 記住哈,用到什么學(xué)什么,知識(shí)的海洋永遠(yuǎn)沒有盡頭的,千萬別像學(xué)校里面似的先統(tǒng)統(tǒng)學(xué)學(xué)學(xué),最后來個(gè)考試, ?咱是學(xué)一個(gè)知識(shí)點(diǎn),用一個(gè)知識(shí)點(diǎn),然后再學(xué)一個(gè)知識(shí)點(diǎn),再用一個(gè)知識(shí)點(diǎn).......


現(xiàn)在假設(shè)配置 PA0 輸出 高電平 ?輸出速率咱選擇 50M ? 注意:設(shè)置輸出高電平,那么IO口就是一直是高電平,和輸出速率沒有關(guān)系,唯一的關(guān)系就是速率越高響應(yīng)的越快

舉個(gè)栗子:

假設(shè)哈: ?速率是1HZ ? 那么執(zhí)行輸出高電平操作可能會(huì)延時(shí) 1S后才執(zhí)行,然后一直輸出高電平

假設(shè)用這個(gè)速率執(zhí)行9M ?SPI通信肯定是不行的,因?yàn)檫@個(gè)速率根本跟不上哈.....



?配置端口0為推挽輸出 50M ?


那么這個(gè)寄存器的值 ? 0x4444 444 3 ? 前面的4444444是用的默認(rèn)的值, 后面的3就是配置0端口? (0011)


00的意思




?11的意思


看一下PA口的地址


起始地址是0x4001 0800



偏移是00h就是說,要配置PA口的CRL這個(gè)寄存器,(配置端口0為推挽輸出 50M)直接

往0x4001 0800這個(gè)地址寫入 ?0x4444 444 3 ?就可以了


?有沒有這樣想的

0x40010800 =?0x44444443


要告訴編譯器0x40010800是一個(gè)地址才好,然后我要往這個(gè)地址里面寫東西

(int *)0x40010800 ?這樣就能告訴編譯器0x40010800是一個(gè)地址

然后讀取這個(gè)地址里面的值 ? aa = ?*((int *)0x40010800) ?

給這個(gè)地址賦值 ??*((int *)0x40010800) ?= XXXXX

所以 就是?*((int *)0x40010800) ?=?0x44444443;



這個(gè)只是配置了PA0的模式,咱還要讓他輸出高電平(配置了引腳,那個(gè)該引腳應(yīng)該會(huì)有變化) ?仿真下











?控制0端口輸出高電平就是讓ODR寄存器的值是? ? 0x0000 0001

?因?yàn)檫@個(gè)寄存器說有個(gè)偏移是0c ? 其實(shí),額,還記得這張圖不


?說白了就是前面的地址被其它寄存器占了而已,注意這里所說的偏移,都是在0x40010800的基礎(chǔ)上需要增加多少才能到那個(gè)寄存器

所以要配置PA口 的ODR寄存器 ? 就是需要在原來地址的基礎(chǔ)上加上 0x0C

所以控制PA0輸出高電平就是

*((int*)(0x40010800+0x0c)) ?=?0x0000 0001



咱先下載到開發(fā)板試一試


會(huì)發(fā)現(xiàn)......不可以,,,哈哈哈哈 ? ?肯定還有沒有配置的地方


需要打開時(shí)鐘,有人就會(huì)想,這么麻煩呀......

嘿嘿,想一個(gè)場(chǎng)景,現(xiàn)在很多項(xiàng)目都需要低功耗,STM32呢之所以這些地方需要自己選擇性的打開,就是為了低功耗

您想想哈,不打開,不用它,肯定省電

好了,咱就去打開時(shí)鐘去

感覺到繁瑣了沒,注意這樣寄存器開發(fā)哈,以后用庫函數(shù)就方便的多,很多都封裝好了,直接調(diào)用就可以

我個(gè)人感覺要想學(xué)好一個(gè)東西,其實(shí)最重要的是過程,我要讓大家知道一切的一切都是怎么來的,為什么ST的官方要弄庫函數(shù),庫函數(shù)是怎么寫的.很少人會(huì)講的這么深,總結(jié)起來有幾個(gè)原因(嫌麻煩,懶的具體研究;怕講不好,反倒讓別人不喜歡自己的教程).

我呢從來不嫌麻煩,而且知識(shí)儲(chǔ)備和自學(xué)能力還可以,所以呢....額,我也不知道該說什么,反正還是那句話:我說講的東西不會(huì)讓大家感覺到難,只是會(huì)感覺繁瑣而已

現(xiàn)在市面上倒賣魚的太多了,真正教給捕魚的少之又少,我所希望的是前期自己捕魚自己吃,后期從賣魚的那里直接買魚吃.等到哪一天賣魚的不再了,你不是還可以自己捕魚.當(dāng)然你學(xué)會(huì)了捕魚,當(dāng)然也可以賣魚,我現(xiàn)在就開始賣魚了,也賣捕魚的方法

扯了這么多.........


就是往這個(gè)寄存器里面的這個(gè)位寫1就可以了

然后就是找地址





?所以RCC_APB2ENR這個(gè)寄存器的地址是

0x4002 1000 ?+ 0x18


*((int*)(0x40021000+0x18)) ?=?0x00000004 ? ?

這個(gè)4 ? ?0100




?下載進(jìn)去試一試


好了好了咱修改修改,去點(diǎn)亮小燈 ? PC13


首先是打開時(shí)鐘? ?


所以是? *((int*)(0x40021000+0x18)) = 0x00000010;?




配置為輸出50M



?說一下哈?CRL是配置0-7引腳號(hào) ? CRH是配置8-15引腳號(hào) ? 所以選擇CRH


?*((int *)(0x40011000 + 0x04)) = 0x44344444;? 默認(rèn)的咱就默認(rèn)是4



配置輸出高電平


?*((int *)(0x40011000 + 0x0C)) = 0x00002000;



?下載進(jìn)去



?現(xiàn)在熄滅



?好了這一節(jié)就說到這里,自己去消化消化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容