首先是安裝軟件
這一節(jié)用Kei來(lái)實(shí)現(xiàn),需要安裝MDK4.7這個(gè)軟件,怎么安裝,自己百度哈.都學(xué)習(xí)32的人了,不會(huì)連個(gè)軟件都不會(huì)安裝吧....還是那句話
沒(méi)有百度一下解決不了的事情,如果有那就是百度兩下(除了科研和探索人類未知領(lǐng)域)
建個(gè)文件夾
我用的是STM32F103C8t6 ?大家根據(jù)自己的選擇
?建一個(gè)主函數(shù)的 .c文件
?編譯一下
啟動(dòng)文件里面有個(gè)執(zhí)行 SystemInit函數(shù)的調(diào)用,因?yàn)樵蹧](méi)有這個(gè)函數(shù),所以報(bào)錯(cuò)了,其實(shí)寄存器開發(fā)用不到,實(shí)際上這是官方提供的庫(kù)開發(fā)的時(shí)候需要的
可以看一下官方提供的庫(kù)開發(fā)里面SystemInit實(shí)現(xiàn)的什么功能
主要的是配置了一開始的時(shí)鐘,因?yàn)槭浅鯇W(xué)者,所以先不用管哈,以后咱也會(huì)去配置外設(shè)時(shí)鐘,,不對(duì),這一節(jié)就會(huì)去配置時(shí)鐘
咱就寫一個(gè)這個(gè)函數(shù),然后內(nèi)部什么都不寫
?還有個(gè)警告,實(shí)說(shuō)最后的代碼要多加一個(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)部的寄存器呢,是這樣的
然后再說(shuō)一下引腳的模式
?模擬輸入:該引腳就會(huì)連接內(nèi)部的模擬輸入模塊(使用ADC或者DAC的時(shí)候需要設(shè)置)
浮空輸入模式:引腳狀態(tài)完全由外部決定(一般串口的RX引腳設(shè)置成這種模式)
上拉/下拉:就是內(nèi)部實(shí)現(xiàn)上下拉
通用推挽輸出:就是直接輸出高低電平,推挽輸出還有個(gè)速率問(wèn)題
這樣理解:假設(shè)SPI傳輸?shù)乃俾适?M的,假設(shè)我設(shè)置了引腳的輸出最大是2M,引腳的反轉(zhuǎn)速度根本跟不上哈,所以會(huì)傳輸不正常,所以可以設(shè)置輸出速率為10M
當(dāng)然速率越高,功耗越大
通用開漏輸出:和51單片機(jī)的P0口似的,沒(méi)有輸出能力,需要外部接上拉電阻才可以(可以用來(lái)做通信時(shí)候的電壓匹配,因?yàn)樵鄣?2是3,3V供電,假設(shè)和5V的芯片通信,咱可以設(shè)置為這個(gè)模式,然后上拉一個(gè)電阻,然后電阻另一邊接的是5V)
后面還有復(fù)用功能推挽/開漏輸出:其實(shí)哈所謂復(fù)用,就是指引腳的第二功能,就是除了正常的輸入輸出的其它功能,列如:
PA2還有個(gè)功能是串口2的輸出,如果要用這個(gè)功能,就需要配置PA2為:復(fù)用推挽輸出
好啦好啦,請(qǐng)清空自己的腦子,這些東西哈,等用到了再說(shuō).... 記住哈,用到什么學(xué)什么,知識(shí)的海洋永遠(yuǎn)沒(méi)有盡頭的,千萬(wàn)別像學(xué)校里面似的先統(tǒng)統(tǒng)學(xué)學(xué)學(xué),最后來(lái)個(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口就是一直是高電平,和輸出速率沒(méi)有關(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就是說(shuō),要配置PA口的CRL這個(gè)寄存器,(配置端口0為推挽輸出 50M)直接
往0x4001 0800這個(gè)地址寫入 ?0x4444 444 3 ?就可以了
?有沒(méi)有這樣想的
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è)寄存器說(shuō)有個(gè)偏移是0c ? 其實(shí),額,還記得這張圖不
?說(shuō)白了就是前面的地址被其它寄存器占了而已,注意這里所說(shuō)的偏移,都是在0x40010800的基礎(chǔ)上需要增加多少才能到那個(gè)寄存器
所以要配置PA口 的ODR寄存器 ? 就是需要在原來(lái)地址的基礎(chǔ)上加上 0x0C
所以控制PA0輸出高電平就是
*((int*)(0x40010800+0x0c)) ?=?0x0000 0001
咱先下載到開發(fā)板試一試
會(huì)發(fā)現(xiàn)......不可以,,,哈哈哈哈 ? ?肯定還有沒(méi)有配置的地方
需要打開時(shí)鐘,有人就會(huì)想,這么麻煩呀......
嘿嘿,想一個(gè)場(chǎng)景,現(xiàn)在很多項(xiàng)目都需要低功耗,STM32呢之所以這些地方需要自己選擇性的打開,就是為了低功耗
您想想哈,不打開,不用它,肯定省電
好了,咱就去打開時(shí)鐘去
感覺(jué)到繁瑣了沒(méi),注意這樣寄存器開發(fā)哈,以后用庫(kù)函數(shù)就方便的多,很多都封裝好了,直接調(diào)用就可以
我個(gè)人感覺(jué)要想學(xué)好一個(gè)東西,其實(shí)最重要的是過(guò)程,我要讓大家知道一切的一切都是怎么來(lái)的,為什么ST的官方要弄庫(kù)函數(shù),庫(kù)函數(shù)是怎么寫的.很少人會(huì)講的這么深,總結(jié)起來(lái)有幾個(gè)原因(嫌麻煩,懶的具體研究;怕講不好,反倒讓別人不喜歡自己的教程).
我呢從來(lái)不嫌麻煩,而且知識(shí)儲(chǔ)備和自學(xué)能力還可以,所以呢....額,我也不知道該說(shuō)什么,反正還是那句話:我說(shuō)講的東西不會(huì)讓大家感覺(jué)到難,只是會(huì)感覺(jué)繁瑣而已
現(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
?說(shuō)一下哈?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é)就說(shuō)到這里,自己去消化消化