嵌入式分享合集26
折騰一天攝像頭煩四了 弄點(diǎn)這個(gè)把 我們這邊還有個(gè)sb還fa值 罰款的值嗎 搞笑+
一、開(kāi)關(guān)電源的8個(gè)損耗
能量轉(zhuǎn)換系統(tǒng)必定存在能耗,雖然實(shí)際應(yīng)用中無(wú)法獲得100%的轉(zhuǎn)換效率,但是,一個(gè)高質(zhì)量的電源效率可以達(dá)到非常高的水平,效率接近95%。絕大多數(shù)電源IC 的工作效率可以在特定的工作條件下測(cè)得,數(shù)據(jù)資料中給出了這些參數(shù)。一般廠(chǎng)商會(huì)給出實(shí)際測(cè)量的結(jié)果,但我們只能對(duì)我們自己的數(shù)據(jù)擔(dān)保。
????下圖1給出了一個(gè)SMPS降壓轉(zhuǎn)換器的電路實(shí)例,轉(zhuǎn)換效率可以達(dá)到97%,即使在輕載時(shí)也能保持較高效率。采用什么秘訣才能達(dá)到如此高的效率?我們最好從了解SMPS損耗的公共問(wèn)題開(kāi)始,開(kāi)關(guān)電源的損耗大部分來(lái)自開(kāi)關(guān)器件(MOSFET和二極管),另外小部分損耗來(lái)自電感和電容。但是,如果使用非常廉價(jià)的電感和電容(具有較高電阻),將會(huì)導(dǎo)致?lián)p耗明顯增大。
????選擇IC時(shí),需要考慮控制器的架構(gòu)和內(nèi)部元件,以期獲得高效指標(biāo)。例如,圖1采用了多種方法來(lái)降低損耗,其中包括:同步整流,芯片內(nèi)部集成低導(dǎo)通電阻的MOSFET,低靜態(tài)電流和跳脈沖控制模式。我們將在本文展開(kāi)討論這些措施帶來(lái)的好處。
????上圖,圖1:降壓轉(zhuǎn)換器集成了低導(dǎo)通電阻的MOSFET,采用同步整流,效率曲線(xiàn)如上。
● 降壓型SMPS
????損耗是任何SMPS架構(gòu)都面臨的問(wèn)題,我們?cè)诖艘韵聢D2所示降壓型(或buck)轉(zhuǎn)換器為例進(jìn)行討論,圖中標(biāo)明各點(diǎn)的開(kāi)關(guān)波形,用于后續(xù)計(jì)算。
????上圖,圖2。
????降壓轉(zhuǎn)換器的主要功能是把一個(gè)較高的直流輸入電壓轉(zhuǎn)換成較低的直流輸出電壓。為了達(dá)到這個(gè)要求,MOSFET以固定頻率(fS),在脈寬調(diào)制信號(hào)(PWM)的控制下進(jìn)行開(kāi)、關(guān)操作。當(dāng)MOSFET導(dǎo)通時(shí),輸入電壓給電感和電容(L和COUT)充電,通過(guò)它們把能量傳遞給負(fù)載。在此期間,電感電流線(xiàn)性上升,電流回路如圖2 中的回路1所示。
????當(dāng)MOSFET斷開(kāi)時(shí),輸入電壓斷開(kāi)與電感的連接,電感和輸出電容為負(fù)載供電。電感電流線(xiàn)性下降,電流流過(guò)二極管,電流回路如圖中的環(huán)路2所示。MOSFET的導(dǎo)通時(shí)間定義為PWM信號(hào)的占空比(D)。D把每個(gè)開(kāi)關(guān)周期分成[D × tS]和[(1 - D) × tS]兩部分,它們分別對(duì)應(yīng)于MOSFET的導(dǎo)通時(shí)間(環(huán)路1)和二極管的導(dǎo)通時(shí)間(環(huán)路2)。所有SMPS拓?fù)?#xff08;降壓、反相等)都采用這種方式劃分開(kāi)關(guān)周期,實(shí)現(xiàn)電壓轉(zhuǎn)換。
????對(duì)于降壓轉(zhuǎn)換電路,較大的占空比將向負(fù)載傳輸較多的能量,平均輸出電壓增加。相反,占空比較低時(shí),平均輸出電壓也會(huì)降低。根據(jù)這個(gè)關(guān)系,可以得到以下理想情況下(不考慮二極管或MOSFET的壓降)降壓型SMPS的轉(zhuǎn)換公式:
VOUT?= D × VIN
IIN?= D × IOUT
????需要注意的是,任何SMPS在一個(gè)開(kāi)關(guān)周期內(nèi)處于某個(gè)狀態(tài)的時(shí)間越長(zhǎng),那么它在這個(gè)狀態(tài)所造成的損耗也越大。對(duì)于降壓型轉(zhuǎn)換器,D越低(相應(yīng)的VOUT越低),回路2產(chǎn)生的損耗也大。
1、開(kāi)關(guān)器件的損耗MOSFET傳導(dǎo)損耗
????上文,圖2(以及其它絕大多數(shù)DC-DC轉(zhuǎn)換器拓?fù)?#xff09;中的MOSFET 和二極管是造成功耗的主要因素。相關(guān)損耗主要包括兩部分:傳導(dǎo)損耗和開(kāi)關(guān)損耗。
??? MOSFET和二極管是開(kāi)關(guān)元件,導(dǎo)通時(shí)電流流過(guò)回路。器件導(dǎo)通時(shí),傳導(dǎo)損耗分別由MOSFET的導(dǎo)通電阻(RDS(ON))和二極管的正向?qū)妷簺Q定。
????MOSFET的傳導(dǎo)損耗(PCOND(MOSFET))近似等于導(dǎo)通電阻RDS(ON)、占空比(D)和導(dǎo)通時(shí)MOSFET的平均電流(IMOSFET(AVG))的乘積。
????PCOND(MOSFET)?(使用平均電流) = IMOSFET(AVG)2 × RDS(ON)?× D
????上式給出了SMPS 中MOSFET 傳導(dǎo)損耗的近似值,但它只作為電路損耗的估算值,因?yàn)殡娏骶€(xiàn)性上升時(shí)所產(chǎn)生的功耗大于由平均電流計(jì)算得到的功耗。對(duì)于“峰值”電流,更準(zhǔn)確的計(jì)算方法是對(duì)電流峰值和谷值(圖3中的IV 和IP)之間的電流波形的平方進(jìn)行積分得到估算值。?
????上圖,圖3:典型的降壓型轉(zhuǎn)換器的MOSFET 電流波形,用于估算MOSFET 的傳導(dǎo)損耗。
????下式給出了更準(zhǔn)確的估算損耗的方法,利用IP 和IV 之間電流波形I2的積分替代簡(jiǎn)單的I2項(xiàng)。
PCOND(MOSFET)?= [(IP3?- IV3)/3] × RDS(ON)?× D
= [(IP3?- IV3)/3] × RDS(ON)?× VOUT/VIN
????式中,IP 和IV 分別對(duì)應(yīng)于電流波形的峰值和谷值,如圖3 所示。MOSFET 電流從IV 線(xiàn)性上升到IP,例如:如果IV 為0.25A,IP 為1.75A,RDS(ON)為0.1Ω,VOUT?為VIN/2 (D = 0.5),基于平均電流(1A)的計(jì)算結(jié)果為:
PCOND(MOSFET) (使用平均電流) = 12?× 0.1 × 0.5 = 0.050W
????利用波形積分進(jìn)行更準(zhǔn)確的計(jì)算:
PCOND(MOSFET)?(使用電流波形積分進(jìn)行計(jì)算) = [(1.753?- 0.253)/3] × 0.1 × 0.5 = 0.089W
????或近似為78%,高于按照平均電流計(jì)算得到的結(jié)果。對(duì)于峰均比較小的電流波形,兩種計(jì)算結(jié)果的差別很小,利用平均電流計(jì)算即可滿(mǎn)足要求。
2、二極管傳導(dǎo)損耗
????MOSFET 的傳導(dǎo)損耗與RDS(ON)成正比,二極管的傳導(dǎo)損耗則在很大程度上取決于正向?qū)妷?VF)。二極管通常比MOSFET 損耗更大,二極管損耗與正向電流、VF 和導(dǎo)通時(shí)間成正比。由于MOSFET 斷開(kāi)時(shí)二極管導(dǎo)通,二極管的傳導(dǎo)損耗(PCOND(DIODE))近似為:
PCOND(DIODE)?= IDIODE(ON)?× VF × (1 - D)
????式中,IDIODE(ON)為二極管導(dǎo)通期間的平均電流。圖2 所示,二極管導(dǎo)通期間的平均電流為IOUT,因此,對(duì)于降壓型轉(zhuǎn)換器,PCOND(DIODE)可以按照下式估算:
PCOND(DIODE)?= IOUT?× VF × (1 - VOUT/VIN)
????與MOSFET 功耗計(jì)算不同,采用平均電流即可得到比較準(zhǔn)確的功耗計(jì)算結(jié)果,因?yàn)槎O管損耗與I 成正比,而不是I2。
????顯然,MOSFET或二極管的導(dǎo)通時(shí)間越長(zhǎng),傳導(dǎo)損耗也越大。對(duì)于降壓型轉(zhuǎn)換器,輸出電壓越低,二極管產(chǎn)生的功耗也越大,因?yàn)樗幱趯?dǎo)通狀態(tài)的時(shí)間越長(zhǎng)。
3、開(kāi)關(guān)動(dòng)態(tài)損耗
????由于開(kāi)關(guān)損耗是由開(kāi)關(guān)的非理想狀態(tài)引起的,很難估算MOSFET和二極管的開(kāi)關(guān)損耗,器件從完全導(dǎo)通到完全關(guān)閉或從完全關(guān)閉到完全導(dǎo)通需要一定時(shí)間,在這個(gè)過(guò)程中會(huì)產(chǎn)生功率損耗。圖4所示MOSFET 的漏源電壓(VDS)和漏源電流(IDS)的關(guān)系圖可以很好地解釋MOSFET 在過(guò)渡過(guò)程中的開(kāi)關(guān)損耗,從上半部分波形可以看出,tSW(ON)和tSW(OFF)期間電壓和電流發(fā)生瞬變,MOSFET 的電容進(jìn)行充電、放電。
????圖4所示,VDS?降到最終導(dǎo)通狀態(tài)(= ID × RDS(ON))之前,滿(mǎn)負(fù)荷電流(ID)流過(guò)MOSFET。相反,關(guān)斷時(shí),VDS?在MOSFET電流下降到零值之前逐漸上升到關(guān)斷狀態(tài)的最終值。開(kāi)關(guān)過(guò)程中,電壓和電流的交疊部分即為造成開(kāi)關(guān)損耗的來(lái)源,從圖4 可以清楚地看到這一點(diǎn)。
????上圖,圖4:開(kāi)關(guān)損耗發(fā)生在MOSFET 通、斷期間的過(guò)渡過(guò)程。
????開(kāi)關(guān)損耗隨著SMPS頻率的升高而增大,這一點(diǎn)很容易理解,隨著開(kāi)關(guān)頻率提高(周期縮短),開(kāi)關(guān)過(guò)渡時(shí)間所占比例增大,從而增大開(kāi)關(guān)損耗。開(kāi)關(guān)轉(zhuǎn)換過(guò)程中,開(kāi)關(guān)時(shí)間是占空比的二十分之一對(duì)于效率的影響要遠(yuǎn)遠(yuǎn)小于開(kāi)關(guān)時(shí)間為占空比的十分之一的情況。由于開(kāi)關(guān)損耗和頻率有很大的關(guān)系,工作在高頻時(shí),開(kāi)關(guān)損耗將成為主要的損耗因素。MOSFET 的開(kāi)關(guān)損耗(PSW(MOSFET))可以按照?qǐng)D3 所示三角波進(jìn)行估算,公式如下:
PSW(MOSFET)?= 0.5 × VD × ID × (tSW(ON)?+ tSW(OFF)) × fS
????其中,VD為MOSFET關(guān)斷期間的漏源電壓,ID是MOSFET導(dǎo)通期間的溝道電流,tSW(ON)和tSW(OFF)是導(dǎo)通和關(guān)斷時(shí)間。對(duì)于降壓電路轉(zhuǎn)換,VIN?是MOSFET關(guān)斷時(shí)的電壓,導(dǎo)通時(shí)的電流為IOUT。
????為了驗(yàn)證MOSFET的開(kāi)關(guān)損耗和傳導(dǎo)損耗,圖5給出了降壓轉(zhuǎn)換器中集成高端MOSFET的典型波形:VDS和IDS。電路參數(shù)為:VIN?= 10V、VOUT?= 3.3V、IOUT?= 500mA、RDS(ON)?= 0.1Ω、fS?= 1MHz、開(kāi)關(guān)瞬變時(shí)間(tON?+ tOFF)總計(jì)為38ns。
????在下圖5,可以看出,開(kāi)關(guān)變化不是瞬間完成的,電流和電壓波形交疊部分導(dǎo)致功率損耗。MOSFET“導(dǎo)通”時(shí)(圖2),流過(guò)電感的電流IDS 線(xiàn)性上升,與導(dǎo)通邊沿相比,斷開(kāi)時(shí)的開(kāi)關(guān)損耗更大。
????利用上述近似計(jì)算法,MOSFET的平均損耗可以由下式計(jì)算:
PT(MOSFET)?= PCOND(MOSFET)?+ PSW(MOSFET)
= [(I13?- I03)/3] × RDS(ON)?× VOUT/VIN?+ 0.5 × VIN?× IOUT?× (tSW(ON)?+ tSW(OFF)) × fS
= [(13?- 03)/3] × 0.1 × 3.3/10 + 0.5 × 10 × 0.5 × (38 × 10-9) × 1 × 106
= 0.011 + 0.095 = 106mW
????這一結(jié)果與圖5下方曲線(xiàn)測(cè)量得到的117.4mW接近。
????注意:這種情況下,fS?足夠高,PSW(MOSFET)是功耗的主要因素。?
????上圖,圖5:降壓轉(zhuǎn)換器高端MOSFET的典型開(kāi)關(guān)周期,輸入10V、輸出3.3V (輸出電流500mA)。開(kāi)關(guān)頻率為1MHz,開(kāi)關(guān)轉(zhuǎn)換時(shí)間是38ns。
????與MOSFET相同,二極管也存在開(kāi)關(guān)損耗。這個(gè)損耗很大程度上取決于二極管的反向恢復(fù)時(shí)間(tRR),二極管開(kāi)關(guān)損耗發(fā)生在二極管從正向?qū)ǖ椒聪蚪刂沟霓D(zhuǎn)換過(guò)程。
????當(dāng)反向電壓加在二級(jí)管兩端時(shí),正向?qū)娏髟诙O管上產(chǎn)生的累積電荷需要釋放,產(chǎn)生反向電流尖峰(IRR(PEAK)),極性與正向?qū)娏飨喾?#xff0c;從而造成V × I 功率損耗,因?yàn)榉聪蚧謴?fù)期內(nèi),反向電壓和反向電流同時(shí)存在于二極管。圖6給出了二極管在反向恢復(fù)期間的PN結(jié)示意圖:?
????上圖,圖6:二極管結(jié)反偏時(shí),需要釋放正向?qū)ㄆ陂g的累積電荷,產(chǎn)生峰值電流(IRR(PEAK))。
????了解了二極管的反向恢復(fù)特性,可以由下式估算二極管的開(kāi)關(guān)損耗(PSW(DIODE)):
PSW(DIODE)?= 0.5 × VREVERSE?× IRR(PEAK)?× tRR2?× fS
????其中,VREVERSE?是二極管的反向偏置電壓,IRR(PEAK)是反向恢復(fù)電流的峰值,tRR2?是從反向電流峰值IRR?到恢復(fù)電流為正的時(shí)間。對(duì)于降壓電路,當(dāng)MOSFET 導(dǎo)通的時(shí)候,VIN?為MOSFET 導(dǎo)通時(shí)二極管的反向偏置電壓。
????為了驗(yàn)證二極管損耗計(jì)算公式,圖7 顯示了典型的降壓轉(zhuǎn)換器中PN 結(jié)的開(kāi)關(guān)波形,VIN?= 10V、VOUT =3.3V,測(cè)得IRR(PEAK)?= 250mA、IOUT?= 500mA、fS?= 1MHz、 tRR2?= 28ns、VF = 0.9V。利用這些數(shù)值可以得到:
?????該結(jié)果接近于圖7所示測(cè)量結(jié)果358.7mW。考慮到較大的VF和較長(zhǎng)的二極管導(dǎo)通周期,tRR?時(shí)間非常短,開(kāi)關(guān)損耗(PSW(DIODE))在二極管損耗中占主導(dǎo)地位。
????上圖,圖7:降壓型轉(zhuǎn)換器中PN 結(jié)開(kāi)關(guān)二極管的開(kāi)關(guān)波形,從10V 輸入降至3.3V 輸出,輸出電流為500mA。其它參數(shù)包括:1MHz 的fS,tRR2 為28ns,VF = 0.9V。
● 提高效率
????基于上述討論,通過(guò)哪些途徑可以降低電源的開(kāi)關(guān)損耗呢?直接途徑是:選擇低導(dǎo)通電阻RDS(ON)、可快速切換的MOSFET;選擇低導(dǎo)通壓降VF、可快速恢復(fù)的二極管。
????直接影響MOSFET 導(dǎo)通電阻的因素有幾點(diǎn),通常增加芯片尺寸和漏源極擊穿電壓(VBR(DSS)),由于增加了器件中的半導(dǎo)體材料,有助于降低導(dǎo)通電阻RDS(ON)。另一方面,較大的MOSFET會(huì)增大開(kāi)關(guān)損耗。因此,雖然大尺寸MOSFET降低了RDS(ON),但也導(dǎo)致小器件可以避免的效率問(wèn)題。當(dāng)管芯溫度升高時(shí),MOSFET導(dǎo)通電阻會(huì)相應(yīng)增大。必須保持較低的結(jié)溫,使導(dǎo)通電阻RDS(ON)不會(huì)過(guò)大。導(dǎo)通電阻RDS(ON)和柵源偏置電壓成反比。
????因此,推薦使用足夠大的柵極電壓以降低RDS(ON)損耗,但此時(shí)也會(huì)增大柵極驅(qū)動(dòng)損耗,需要平衡降低RDS(ON)的好處和增大柵極驅(qū)動(dòng)的缺陷。MOSFET的開(kāi)關(guān)損耗與器件電容有關(guān),較大的電容需要較長(zhǎng)的充電時(shí)間,使開(kāi)關(guān)切換變緩,消耗更多能量。米勒電容通常在MOSFET數(shù)據(jù)資料中定義為反向傳輸電容(CRSS)或柵-漏電容(CGD),在開(kāi)關(guān)過(guò)程中對(duì)切換時(shí)間起決定作用。米勒電容的充電電荷用QGD表示,為了快速切換MOSFET,要求盡可能低的米勒電容。
????一般來(lái)說(shuō),MOSFET的電容和芯片尺寸成反比,因此必須折衷考慮開(kāi)關(guān)損耗和傳導(dǎo)損耗,同時(shí)也要謹(jǐn)慎選擇電路的開(kāi)關(guān)頻率。對(duì)于二極管,必須降低導(dǎo)通壓降,以降低由此產(chǎn)生的損耗。對(duì)于小尺寸、額定電壓較低的硅二極管,導(dǎo)通壓降一般在0.7V到1.5V之間。二極管的尺寸、工藝和耐壓等級(jí)都會(huì)影響導(dǎo)通壓降和反向恢復(fù)時(shí)間,大尺寸二極管通常具有較高的VF 和tRR,這會(huì)造成比較大的損耗。
????開(kāi)關(guān)二極管一般以速度劃分,分為“高速”、“甚高速”和“超高速”二極管,反向恢復(fù)時(shí)間隨著速度的提高而降低。快恢復(fù)二極管的tRR?為幾百納秒,而超高速快恢復(fù)二極管的tRR?為幾十納秒。低功耗應(yīng)用中,替代快恢復(fù)二極管的一種選擇是肖特基二極管,這種二極管的恢復(fù)時(shí)間幾乎可以忽略,反向恢復(fù)電壓VF 也只有快恢復(fù)二極管的一半(0.4V 至1V),但肖特基二極管的額定電壓和電流遠(yuǎn)遠(yuǎn)低于快恢復(fù)二極管,無(wú)法用于高壓或大功率應(yīng)用。另外,肖特基二極管與硅二極管相比具有較高的反向漏電流,但這些因素并不限制它在許多電源中的應(yīng)用。
????然而,在一些低壓應(yīng)用中,即便是具有較低壓降的肖特基二極管,所產(chǎn)生的傳導(dǎo)損耗也無(wú)法接受。比如,在輸出為1.5V 的電路中,即使使用0.5V 導(dǎo)通壓降VF 的肖特基二極管,二極管導(dǎo)通時(shí)也會(huì)產(chǎn)生33%的輸出電壓損耗!
????為了解決這一問(wèn)題,可以選擇低導(dǎo)通電阻RDS(ON)的MOSFET實(shí)現(xiàn)同步控制架構(gòu)。用MOSFET 取代二極管(對(duì)比圖1 和圖2 電路),它與電源的主MOSFET 同步工作,所以在交替切換的過(guò)程中,保證只有一個(gè)導(dǎo)通。導(dǎo)通的二極管由導(dǎo)通的MOSFET 所替代,二極管的高導(dǎo)通壓降VF 被轉(zhuǎn)換成MOSFET 的低導(dǎo)通壓降(MOSFET RDS(ON)?× I),有效降低了二極管的傳導(dǎo)損耗。
????當(dāng)然,同步整流與二極管相比也只是降低了MOSFET的壓降,另一方面,驅(qū)動(dòng)同步整流MOSFET的功耗也不容忽略。IC數(shù)據(jù)資料以上討論了影響開(kāi)關(guān)電源效率的兩個(gè)重要因素(MOSFET 和二極管)。回顧圖1所示降壓電路,從數(shù)據(jù)資料中可以獲得影響控制器IC 工作效率的主要因素。
????首先,開(kāi)關(guān)元件集成在IC內(nèi)部,可以節(jié)省空間、降低寄生損耗。其次,使用低導(dǎo)通電阻RDS(ON)的MOSFET,在小尺寸集成降壓IC (如MAX1556)中,其N(xiāo)MOS和PMOS 的導(dǎo)通電阻可以達(dá)到0.27Ω (典型值)和0.19Ω (典型值)。最后,使用的同步整流電路。對(duì)于500mA負(fù)載,占空比為50%的開(kāi)關(guān)電路,可以將低邊開(kāi)關(guān)(或二極管)的損耗從225mW (假設(shè)二極管壓降為 1V)降至 34mW。合理選擇SMPS IC合理選擇 SMPS IC的封裝、控制架構(gòu),并進(jìn)行合理設(shè)計(jì),可以有效提高轉(zhuǎn)換效率。
4、集成功率開(kāi)關(guān)
????功率開(kāi)關(guān)集成到IC 內(nèi)部時(shí)可以省去繁瑣的MOSFET 或二極管選擇,而且使電路更加緊湊,由于降低了線(xiàn)路損耗和寄生效應(yīng),可以在一定程度上提高效率。根據(jù)功率等級(jí)和電壓限制,可以把MOSFET、二極管(或同步整流MOSFET)集成到芯片內(nèi)部。將開(kāi)關(guān)集成到芯片內(nèi)部的另一個(gè)好處是柵極驅(qū)動(dòng)電路的尺寸已經(jīng)針對(duì)片內(nèi)MOSFET 進(jìn)行了優(yōu)化,因而無(wú)需將時(shí)間浪費(fèi)在未知的分立MOSFET 上。
● 靜態(tài)電流
????電池供電設(shè)備特別關(guān)注IC 規(guī)格中的靜態(tài)電流(IQ),它是維持電路工作所需的電流。重載情況下(大于十倍或百倍的靜態(tài)電流IQ),IQ 對(duì)效率的影響并不明顯,因?yàn)樨?fù)載電流遠(yuǎn)大于IQ,而隨著負(fù)載電流的降低,效率有下降的趨勢(shì),因?yàn)镮Q 對(duì)應(yīng)的功率占總功率的比例提高。
????這一點(diǎn)對(duì)于大多數(shù)時(shí)間處于休眠模式或其它低功耗模式的應(yīng)用尤其重要,許多消費(fèi)類(lèi)產(chǎn)品即使在“關(guān)閉”狀態(tài)下,也需要保持鍵盤(pán)掃描或其它功能的供電,這時(shí),無(wú)疑需要選擇具有極低IQ的電源。
● 電源架構(gòu)對(duì)效率的提高
??? SMPS 的控制架構(gòu)是影響開(kāi)關(guān)電源效率的關(guān)鍵因素之一。這一點(diǎn)我們已經(jīng)在同步整流架構(gòu)中討論過(guò),由于采用低導(dǎo)通電阻的MOSFET 取代了功耗較大的開(kāi)關(guān)二極管,可有效改善效率指標(biāo)。
????另一種重要的控制架構(gòu)是針對(duì)輕載工作或較寬的負(fù)載范圍設(shè)計(jì)的,即跳脈沖模式,也稱(chēng)為脈沖頻率調(diào)制(PFM)。與單純的PWM 開(kāi)關(guān)操作(在重載和輕載時(shí)均采用固定的開(kāi)關(guān)頻率)不同,跳脈沖模式下轉(zhuǎn)換器工作在跳躍的開(kāi)關(guān)周期,可以節(jié)省不必要的開(kāi)關(guān)操作,進(jìn)而提高效率。
????跳脈沖模式下,在一段較長(zhǎng)時(shí)間內(nèi)電感放電,將能量從電感傳遞給負(fù)載,以維持輸出電壓。當(dāng)然,隨著負(fù)載吸收電流,輸出電壓也會(huì)跌落。當(dāng)電壓跌落到設(shè)置門(mén)限時(shí),將開(kāi)啟一個(gè)新的開(kāi)關(guān)周期,為電感充電并補(bǔ)充輸出電壓。
????需要注意的是跳脈沖模式會(huì)產(chǎn)生與負(fù)載相關(guān)的輸出噪聲,這些噪聲由于分布在不同頻率(與固定頻率的PWM 控制架構(gòu)不同),很難濾除。
????先進(jìn)的SMPS IC 會(huì)合理利用兩者的優(yōu)勢(shì):重載時(shí)采用恒定PWM 頻率;輕載時(shí)采用跳脈沖模式以提高效率,圖1 所示IC即提供了這樣的工作模式。
????當(dāng)負(fù)載增加到一個(gè)較高的有效值時(shí),跳脈沖波形將轉(zhuǎn)換到固定PWM,在標(biāo)稱(chēng)負(fù)載下噪聲很容易濾除。在整個(gè)工作范圍內(nèi),器件根據(jù)需要選擇跳脈沖模式和PWM 模式,保持整體的最高效率(圖8)。
????下圖8中的曲線(xiàn)D、E、F所示效率曲線(xiàn)在固定PWM模式下,輕載時(shí)效率較低,但在重載時(shí)能夠提供很高的轉(zhuǎn)換效率(高達(dá)98%)。如果設(shè)置在輕載下保持固定PWM 工作模式,IC將不會(huì)按照負(fù)載情況更改工作模式。這種情況下能夠使紋波保持在固定頻率,但浪費(fèi)了一定功率。重載時(shí),維持PWM 開(kāi)關(guān)操作所需的額外功率很小,遠(yuǎn)遠(yuǎn)低于輸出功率。
????另一方面,跳脈沖“空閑”模式下的效率曲線(xiàn)(圖8中的A、B、C)能夠在輕載時(shí)保持在較高水平,因?yàn)殚_(kāi)關(guān)只在負(fù)載需要時(shí)開(kāi)啟。對(duì)7V輸入曲線(xiàn),在1mA負(fù)載的空閑模式下能夠獲得高于60%的效率。
????上圖,圖8:降壓轉(zhuǎn)換器在PWM 和空閑(跳脈沖)模式下效率曲線(xiàn),注意:輕載時(shí),空閑模式下的效率高于PWM模式。
-
優(yōu)化SMPS
????開(kāi)關(guān)電源因其高效率指標(biāo)得到廣泛應(yīng)用,但其效率仍然受SMPS電路的一些固有損耗的制約。設(shè)計(jì)開(kāi)關(guān)電源時(shí),需要仔細(xì)研究造成SMPS損耗的來(lái)源,合理選擇SMPS IC,從而充分利用器件的優(yōu)勢(shì),為了在保持盡可能低的電路成本,甚至不增加電路成本的前提下獲得高效的SMPS,工程師需要做出全面的選擇。
5、無(wú)源元件損耗
????我們已經(jīng)了解MOSFET和二極管會(huì)導(dǎo)致SMPS損耗。采用高品質(zhì)的開(kāi)關(guān)器件能夠大大提升效率,但它們并不是唯一能夠優(yōu)化電源效率的元件。
????圖1詳細(xì)介紹了一個(gè)典型的降壓型轉(zhuǎn)換器IC的基本電路。集成了兩個(gè)同步整流MOSFET,低RDS(ON)?MOSFET,效率很高。這個(gè)電路中,開(kāi)關(guān)元件集成在IC內(nèi)部,已經(jīng)為具體應(yīng)用預(yù)先選擇了元器件。然而,為了進(jìn)一步提高效率,設(shè)計(jì)人員還需關(guān)注無(wú)源元件—外部電感和電容,了解它們對(duì)功耗的影響。
6、電感功耗阻性損耗
????電感功耗包括線(xiàn)圈損耗和磁芯損耗兩個(gè)基本因素,線(xiàn)圈損耗歸結(jié)于線(xiàn)圈的直流電阻(DCR),磁芯損耗歸結(jié)于電感的磁特性。
??? DCR 定義為以下電阻公式:
????式中,ρ為線(xiàn)圈材料的電阻系數(shù),l為線(xiàn)圈長(zhǎng)度,A為線(xiàn)圈橫截面積。
??? DCR將隨著線(xiàn)圈長(zhǎng)度的增大而增大,隨著線(xiàn)圈橫截面積的增大而減小。可以利用該原則判斷標(biāo)準(zhǔn)電感,確定所要求的不同電感值和尺寸。對(duì)一個(gè)固定的電感值,電感尺寸較小時(shí),為了保持相同匝數(shù)必須減小線(xiàn)圈的橫截面積,因此導(dǎo)致DCR增大;對(duì)于給定的電感尺寸,小電感值通常對(duì)應(yīng)于小的DCR,因?yàn)檩^少的線(xiàn)圈數(shù)減少了線(xiàn)圈長(zhǎng)度,可以使用線(xiàn)徑較粗的導(dǎo)線(xiàn)。
????已知DCR和平均電感電流(具體取決于SMPS 拓?fù)?,電感的電阻損耗(PL(DCR))可以用下式估算:
PL(DCR)?= LAVG2× DCR
????這里,IL(AVG)是流過(guò)電感的平均直流電流。對(duì)于降壓轉(zhuǎn)換器,平均電感電流是直流輸出電流。盡管DCR的大小直接影響電感電阻的功耗,該功耗與電感電流的平方成正比,因此,減小DCR 是必要的。
????另外,還需要注意的是:利用電感的平均電流計(jì)算PL(DCR)?(如上述公式)時(shí),得到的結(jié)果略低于實(shí)際損耗,因?yàn)閷?shí)際電感電流為三角波。本文前面介紹的MOSFET 傳導(dǎo)損耗計(jì)算中,利用對(duì)電感電流的波形進(jìn)行積分可以獲得更準(zhǔn)確的結(jié)果。更準(zhǔn)確。當(dāng)然也更復(fù)雜的計(jì)算公式如下:
PL(DCR)?= (IP3?- IV3)/3 × DCR
????式中IP 和IV 為電感電流波形的峰值和谷值。
7、磁芯損耗
????磁芯損耗并不像傳導(dǎo)損耗那樣容易估算,很難估測(cè)。它由磁滯、渦流損耗組成,直接影響鐵芯的交變磁通。SMPS 中,盡管平均直流電流流過(guò)電感,由于通過(guò)電感的開(kāi)關(guān)電壓的變化產(chǎn)生的紋波電流導(dǎo)致磁芯周期性的磁通變化。
????磁滯損耗源于每個(gè)交流周期中磁芯偶極子的重新排列所消耗的功率,可以將其看作磁場(chǎng)極性變化時(shí)偶極子相互摩擦產(chǎn)生的“摩擦”損耗,正比于頻率和磁通密度。
????相反,渦流損耗則是磁芯中的時(shí)變磁通量引入的。由法拉第定律可知:交變磁通產(chǎn)生交變電壓。因此,這個(gè)交變電壓會(huì)產(chǎn)生局部電流,在磁芯電阻上產(chǎn)生I2R 損耗。
????磁芯材料對(duì)磁芯損耗的影響很大。SMPS 電源中普遍使用的電感是鐵粉磁芯,鐵鎳鉬磁粉芯(MPP)的損耗最低,鐵粉芯成本最低,但磁芯損耗較大。
????磁芯損耗可以通過(guò)計(jì)算磁芯磁通密度(B)的最大變化量估算,然后查看電感或鐵芯制造商提供的磁通密度和磁芯損耗(和頻率)圖表。峰值磁通密度可以通過(guò)幾種方式計(jì)算,公式可以在電感數(shù)據(jù)資料中的磁芯損耗曲線(xiàn)中找到。
????相應(yīng)地,如果磁芯面積和線(xiàn)圈數(shù)已知,可利用下式估計(jì)峰值磁通:?
????這里,B 是峰值磁通密度(高斯),L 是線(xiàn)圈電感(亨),ΔI 是電感紋波電流峰峰值(安培),A 是磁芯橫截面積(cm2),N 是線(xiàn)圈匝數(shù)。
????隨著互聯(lián)網(wǎng)的普及,可以方便地從網(wǎng)上下載資料、搜索器件信息,一些制造商提供了交互式電感功耗的計(jì)算軟件,幫助設(shè)計(jì)者估計(jì)功耗。使用這些工具能夠快捷、準(zhǔn)確地估計(jì)應(yīng)用電路中的功率損耗。例如,Coilcraft 提供的在線(xiàn)電感磁芯損耗和銅耗計(jì)算公式,簡(jiǎn)單輸入一些數(shù)據(jù)即可得到所選電感的磁芯損耗和銅耗。
8、電容損耗
????與理想的電容模型相反,電容元件的實(shí)際物理特性導(dǎo)致了幾種損耗。電容在SMPS 電路中主要起穩(wěn)壓、濾除輸入/輸出噪聲的作用(圖1),電容的這些損耗降低了開(kāi)關(guān)電源的效率。這些損耗主要表現(xiàn)在三個(gè)方面:等效串聯(lián)電阻損耗、漏電流損耗和電介質(zhì)損耗。
????電容的阻性損耗顯而易見(jiàn)。既然電流在每個(gè)開(kāi)關(guān)周期流入、流出電容,電容固有的電阻(RC)將造成一定功耗。漏電流損耗是由于電容絕緣材料的電阻(RL)導(dǎo)致較小電流流過(guò)電容而產(chǎn)生的功率損耗。電介質(zhì)損耗比較復(fù)雜,由于電容兩端施加了交流電壓,電容電場(chǎng)發(fā)生變化,從而使電介質(zhì)分子極化造成功率損耗。
????上圖,圖9:電容損耗模型一般簡(jiǎn)化為一個(gè)等效串聯(lián)電阻(ESR)。
????所有三種損耗都體現(xiàn)在電容的典型損耗模型中(圖9 左邊部分),用電阻代表每項(xiàng)損耗。與電容儲(chǔ)能相關(guān)的每項(xiàng)損耗的功率用功耗系數(shù)(DF)表示,或損耗角正切(δ)。每項(xiàng)損耗的DF 可以通過(guò)由電容阻抗的實(shí)部與虛部比得到,可以將每項(xiàng)損耗分別插入模型中。
????為簡(jiǎn)化損耗模型,圖9中的接觸電阻損耗、漏電流損耗和電介質(zhì)損耗集中等為一個(gè)等效串聯(lián)電阻(ESR)。ESR 定義為電容阻抗中消耗有功功率的部分。
????推算電容阻抗模型、計(jì)算ESR (結(jié)果的實(shí)部)時(shí),ESR 是頻率的函數(shù)。這種相關(guān)性可以在下面簡(jiǎn)化的ESR等式中得到證明:
????式中,DFR、DFL 和DFD 是接觸電阻、漏電流和電介質(zhì)損耗的功耗系數(shù)。
????利用這個(gè)等式,我們可以觀察到隨著信號(hào)頻率的增加,漏電流損耗和電介質(zhì)損耗都有所減小,直到接觸電阻損耗從一個(gè)較高頻點(diǎn)開(kāi)始占主導(dǎo)地位。在該頻點(diǎn)(式中沒(méi)有包括該參數(shù))以上,ESR 因?yàn)楦哳l交流電流的趨膚效應(yīng)趨于增大。
????許多電容制造商提供ESR 曲線(xiàn)圖表示ESR 與頻率的關(guān)系。例如,TDK 為其大多數(shù)電容產(chǎn)品提供了ESR 曲線(xiàn),參考這些與開(kāi)關(guān)頻率對(duì)應(yīng)曲線(xiàn)圖,得到ESR 值。
????然而,如果沒(méi)有ESR 曲線(xiàn)圖,可以通過(guò)電容數(shù)據(jù)資料中的DF 規(guī)格粗略估算ESR。DF 是電容的整體DF (包括所有損耗),也可以按照下式估算ESR:?
????無(wú)論采用哪種方法來(lái)得到ESR 值,直覺(jué)告訴我們,高ESR 會(huì)降低開(kāi)關(guān)電源效率,既然輸入和輸出電容在每個(gè)開(kāi)關(guān)周期通過(guò)ESR 充電、放電。這導(dǎo)致I2× RESR 功率損耗。這個(gè)損耗(PCAP(ESR))可以按照下式計(jì)算:
PCAP(ESR)?= ICAP(RMS)2?×?RESR
????式中,ICAP(RMS)是流經(jīng)電容的交流電流有效值RMS。對(duì)降壓電路的輸出電容,可以采用電感紋波電流的有效值RMS。輸入濾波電容的RMS 電流的計(jì)算比較復(fù)雜,可以按照下式得到一個(gè)合理的估算值:
ICIN(RMS)?= IOUT/VIN?× [VOUT?(VIN?- VOUT)]1/2
????顯然,為減小電容功率損耗,應(yīng)選擇低ESR 電容,有助于SMPS 電源降低紋波電流。ESR 是產(chǎn)生輸出電壓紋波的主要原因,因此選擇低ESR 的電容不僅僅單純提高效率,還能得到其它好處。
????一般來(lái)說(shuō),不同類(lèi)型電介質(zhì)的電容具有不同的ESR 等級(jí)。對(duì)于特定的容量和額定電壓,鋁電解電容和鉭電容就比陶瓷電容具有更高的ESR 值。聚酯和聚丙烯電容的ESR 值介于它們之間,但這些電容尺寸較大,SMPS 中很少使用。whaosoft aiot?http://143ai.com
????對(duì)于給定類(lèi)型的電容,較大容量、較低的fS 能夠提供較低的ESR。大尺寸電容通常也會(huì)降低ESR,但電解電容會(huì)帶來(lái)較大的等效串聯(lián)電感。陶瓷電容被視為比較好的折中選擇,此外,電容值一定的條件下,較低的電容額定電壓也有助于減小ESR。
二、單片機(jī)工作電壓5V的來(lái)歷
5V來(lái)自于TTL電平。5為T(mén)rue,0為False,之后用了壓降更低的PN節(jié),衍生出了3.3這個(gè)電平。
??? 12V和24V來(lái)自于汽車(chē)電瓶,早年乘用車(chē)又12V和24V兩個(gè)系統(tǒng),現(xiàn)在一般小型車(chē)12V,商用車(chē)24V,再究其由來(lái)應(yīng)該是鉛酸電池。
????所以3.3V和5V一般出現(xiàn)在信號(hào)電路或者單片機(jī)等VCC供電,而12V/24V一般出現(xiàn)在低壓動(dòng)力電,例如主板、顯卡、軸流風(fēng)機(jī)、監(jiān)控器。硬件決定系統(tǒng)基礎(chǔ),如果鋰電池早點(diǎn)應(yīng)用的話(huà)估計(jì)還會(huì)有3.7/7.4這個(gè)系統(tǒng)。
????為什么很多單片機(jī)的工作電壓是5v?
????因?yàn)榇蠖鄶?shù)芯片都是5V的TTL電平,要做到電平兼容,電平匹配,避免要電平轉(zhuǎn)換操作,所有很多單片機(jī)的工作電壓都是5V。早期(196x)的晶體管電路(TTL)單管的壓降是0.7V。一個(gè)電路里經(jīng)常有多個(gè)晶體管串聯(lián)。比如4管串聯(lián),電源至少保證0.7x4=2.8v才能保證電路正常工作。所以最早有3V 5V等標(biāo)準(zhǔn)。后來(lái)LM7805(197x)電源IC出來(lái)以后,5V成了事實(shí)標(biāo)準(zhǔn)。
??? TTL指的是TTL電平,0~5V之間,小于0.2V輸出低電平,高于3.4V輸出高電平。全稱(chēng)Transistor-Transistor Logic,即BJT-BJT邏輯門(mén)電路,是數(shù)字電子技術(shù)中常用的一種邏輯門(mén)電路,應(yīng)用較早,技術(shù)已比較成熟。TTL主要有BJT(Bipolar Junction Transistor 即雙極結(jié)型晶體管,晶體三極管)和電阻構(gòu)成,具有速度快的特點(diǎn)。最早的TTL門(mén)電路是74系列,后來(lái)出現(xiàn)了74H系列,74L系列,74LS,74AS,74ALS等系列。
????但是由于TTL功耗大等缺點(diǎn),正逐漸被CMOS電路取代,TL輸出高電平》2.4V,輸出低電平《0.4V。在室溫下,一般輸出高電平是3.5V,輸出低電平是0.2V。最小輸入高電平和低電平:輸入高電平》=2.0V,輸入低電平《=0.8V,噪聲容限是0.4V。
????為什么很多都是5V,而且有大量電源芯片支持的也是5V。
????電壓浮動(dòng)為5%,而電壓標(biāo)準(zhǔn),在A/D當(dāng)中使用,標(biāo)準(zhǔn)應(yīng)該是5.12V。
????因?yàn)?12 是2的N次方,這樣A/D 的每一個(gè)字都是一個(gè)整數(shù),當(dāng)作為無(wú)符號(hào)計(jì)算的時(shí)候,更簡(jiǎn)單,但是沒(méi)見(jiàn)到哪個(gè)成品用這個(gè)電壓的,大部分都是5V,為什么不用呢?
????因?yàn)樽?.12的標(biāo)準(zhǔn)電壓成本會(huì)成倍增長(zhǎng)。5V與5.12V精度差別在百倍,小數(shù)點(diǎn)后0.12V,基本很難做到高精度標(biāo)準(zhǔn)電壓,市場(chǎng)通用電壓為5V,上浮一定百分比。
??? 2008年11月發(fā)布的STC12系列單片機(jī)數(shù)據(jù)手冊(cè)中,STC12C系列的單片機(jī)電壓范圍是3.3~5.5V;STC12L系列的單片機(jī)電壓范圍是2.2~3.6V。如果選擇STC12C系列的單片機(jī),只要單片機(jī)的工作頻率不是太高,使用3.7V供電是沒(méi)有任何顧慮的,官方聲稱(chēng)單片機(jī)的抗干擾能力可以達(dá)到4000V,但實(shí)際應(yīng)用說(shuō)法不一。
????大多數(shù)單片機(jī)都是 TTL 電平,各自的高低電平定義不一樣;
????當(dāng)電源電壓為5V時(shí):51,AVR單片機(jī)是5V;
????當(dāng)電源電壓為3.3V時(shí):51,AVR單片機(jī)高電平是3.3V;
??? ARM如LPC2138,電源電壓只能為3.3V,IO輸出高電平為3.3V;延慶川北小區(qū)45孫老師 收賣(mài)廢品破爛垃圾炒股 廢品孫 再回收
????但I(xiàn)O口可承受5V電壓現(xiàn)在單片機(jī)工作電壓主要有兩種:一種工作在3.3V 一種工作在5V。
三、STM32單片機(jī)的知識(shí)點(diǎn)2
本文將以STM32F10x為例,對(duì)標(biāo)準(zhǔn)庫(kù)開(kāi)發(fā)進(jìn)行概覽。主要分為三塊內(nèi)容:
-
STM32系統(tǒng)結(jié)構(gòu)
-
寄存器
-
通過(guò)點(diǎn)燈案例,詳解如何基于標(biāo)準(zhǔn)庫(kù)構(gòu)建STM32工程
STM32系統(tǒng)結(jié)構(gòu)
?
????上圖,STM32f10xxx系統(tǒng)結(jié)構(gòu)。
內(nèi)核IP
????從結(jié)構(gòu)框圖上看,Cortex-M3內(nèi)部有若干個(gè)總線(xiàn)接口,以使CM3能同時(shí)取址和訪(fǎng)內(nèi)(訪(fǎng)問(wèn)內(nèi)存),它們是:指令存儲(chǔ)區(qū)總線(xiàn)(兩條)、系統(tǒng)總線(xiàn)、私有外設(shè)總線(xiàn)。有兩條代碼存儲(chǔ)區(qū)總線(xiàn)負(fù)責(zé)對(duì)代碼存儲(chǔ)區(qū)(即 FLASH 外設(shè))的訪(fǎng)問(wèn),分別是?I-Code 總線(xiàn)和?D-Code 總線(xiàn)。
??? I-Code用于取指,D-Code用于查表等操作,它們按最佳執(zhí)行速度進(jìn)行優(yōu)化。
????系統(tǒng)總線(xiàn)(System)用于訪(fǎng)問(wèn)內(nèi)存和外設(shè),覆蓋的區(qū)域包括SRAM,片上外設(shè),片外RAM,片外擴(kuò)展設(shè)備,以及系統(tǒng)級(jí)存儲(chǔ)區(qū)的部分空間。
????私有外設(shè)總線(xiàn)負(fù)責(zé)一部分私有外設(shè)的訪(fǎng)問(wèn),主要就是訪(fǎng)問(wèn)調(diào)試組件。它們也在系統(tǒng)級(jí)存儲(chǔ)區(qū)。
????還有一個(gè)DMA總線(xiàn),從字面上看,DMA是data memory access的意思,是一種連接內(nèi)核和外設(shè)的橋梁,它可以訪(fǎng)問(wèn)外設(shè)、內(nèi)存,傳輸不受CPU的控制,并且是雙向通信。簡(jiǎn)而言之,這個(gè)家伙就是一個(gè)速度很快的且不受老大控制的數(shù)據(jù)搬運(yùn)工。
處理器外設(shè)(內(nèi)核之外的外設(shè))
????從結(jié)構(gòu)框圖上看,STM32的外設(shè)有串口、定時(shí)器、IO口、FSMC、SDIO、SPI、I2C等,這些外設(shè)按照速度的不同,分別掛載到AHB、APB2、APB1這三條總線(xiàn)上。
寄存器
????什么是寄存器?寄存器是內(nèi)置于各個(gè)IP外設(shè)中,是一種用于配置外設(shè)功能的存儲(chǔ)器,并且有想對(duì)應(yīng)的地址。一切庫(kù)的封裝始于映射。
????是不是看的眼都花了,如果進(jìn)行寄存器開(kāi)發(fā),就需要懟地址以及對(duì)寄存器進(jìn)行字節(jié)賦值,不僅效率低而且容易出錯(cuò)。
????庫(kù)的存在就是為了解決這類(lèi)問(wèn)題,將代碼語(yǔ)義化。語(yǔ)義化思想不僅僅是嵌入式有的,前端代碼也在追求語(yǔ)義特性。
從點(diǎn)燈開(kāi)始學(xué)習(xí)STM32
?
內(nèi)核庫(kù)文件分析
cor_cm3.h
????這個(gè)頭文件實(shí)現(xiàn)了:
-
內(nèi)核結(jié)構(gòu)體寄存器定義。?
-
內(nèi)核寄存器內(nèi)存映射。?
-
內(nèi)存寄存器位定義。跟處理器相關(guān)的頭文件stm32f10x.h實(shí)現(xiàn)的功能一樣,一個(gè)是針對(duì)內(nèi)核的寄存器,一個(gè)是針對(duì)內(nèi)核之外,即處理器的寄存器。
misc.h
????內(nèi)核應(yīng)用函數(shù)庫(kù)頭文件,對(duì)應(yīng)stm32f10x_xxx.h。
misc.c
????內(nèi)核應(yīng)用函數(shù)庫(kù)文件,對(duì)應(yīng)stm32f10x_xxx.c。在CM3這個(gè)內(nèi)核里面還有一些功能組件,如NVIC、SCB、ITM、MPU、CoreDebug,CM3帶有非常豐富的功能組件,但是芯片廠(chǎng)商在設(shè)計(jì)MCU的時(shí)候有一些并不是非要不可的,是可裁剪的,比如MPU、ITM等在STM32里面就沒(méi)有。
????其中NVIC在每一個(gè)CM3內(nèi)核的單片機(jī)中都會(huì)有,但都會(huì)被裁剪,只能是CM3 NVIC的一個(gè)子集。在NVIC里面還有一個(gè)SysTick,是一個(gè)系統(tǒng)定時(shí)器,可以提供時(shí)基,一般為操作系統(tǒng)定時(shí)器所用。misc.h和mics.c這兩個(gè)文件提供了操作這些組件的函數(shù),并可以在CM3內(nèi)核單片機(jī)直接移植。
處理器外設(shè)庫(kù)文件分析
startup_stm32f10x_hd.s
????這個(gè)是由匯編編寫(xiě)的啟動(dòng)文件,是STM32上電啟動(dòng)的第一個(gè)程序,啟動(dòng)文件主要實(shí)現(xiàn)了
-
初始化堆棧指針 SP;
-
設(shè)置 PC 指針=Reset_Handler ;
-
設(shè)置向量表的地址,并 初始化向量表,向量表里面放的是 STM32 所有中斷函數(shù)的入口地址
-
調(diào)用庫(kù)函數(shù) SystemInit,把系統(tǒng)時(shí)鐘配置成 72M,SystemInit 在庫(kù)文件 stytem_stm32f10x.c 中定義;
-
跳轉(zhuǎn)到標(biāo)號(hào)_main,最終去到 C 的世界。
system_stm32f10x.c
????這個(gè)文件的作用是里面實(shí)現(xiàn)了各種常用的系統(tǒng)時(shí)鐘設(shè)置函數(shù),有72M,56M,48, 36,24,8M,我們使用的是是把系統(tǒng)時(shí)鐘設(shè)置成72M。
Stm32f10x.h
????這個(gè)頭文件非常重要,這個(gè)頭文件實(shí)現(xiàn)了:
-
處理器外設(shè)寄存器的結(jié)構(gòu)體定義。
-
處理器外設(shè)的內(nèi)存映射。
-
處理器外設(shè)寄存器的位定義。
????關(guān)于 1 和 2 我們?cè)谟眉拇嫫鼽c(diǎn)亮 LED 的時(shí)候有講解。
????其中 3:處理器外設(shè)寄存器的位定義,這個(gè)非常重要,具體是什么意思?
????我們知道一個(gè)寄存器有很多個(gè)位,每個(gè)位寫(xiě) 1 或者寫(xiě) 0 的功能都是不一樣的,處理器外設(shè)寄存器的位定義就是把外設(shè)的每個(gè)寄存器的每一個(gè)位寫(xiě) 1 的 16 進(jìn)制數(shù)定義成一個(gè)宏,宏名即用該位的名稱(chēng)表示,如果我們操作寄存器要開(kāi)啟某一個(gè)功能的話(huà),就不用自己親自去算這個(gè)值是多少,可以直接到這個(gè)頭文件里面找。
????我們以片上外設(shè) ADC 為例,假設(shè)我們要啟動(dòng) ADC 開(kāi)始轉(zhuǎn)換,根據(jù)手冊(cè)我們知道是要控制 ADC_CR2 寄存器的位 0:ADON,即往位 0 寫(xiě) 1,即:
????這是一般的操作方法。現(xiàn)在這個(gè)頭文件里面有關(guān)于 ADON 位的位定義:
有了這個(gè)位定義,我們剛剛的代碼就變成了:
stm32f10x_xxx.h
????外設(shè) xxx 應(yīng)用函數(shù)庫(kù)頭文件,這里面主要定義了實(shí)現(xiàn)外設(shè)某一功能的結(jié)構(gòu)體,比如通用定時(shí)器有很多功能,有定時(shí)功能,有輸出比較功能,有輸入捕捉功能,而通用定時(shí)器有非常多的寄存器要實(shí)現(xiàn)某一個(gè)功能。
????比如定時(shí)功能,我們根本不知道具體要操作哪些寄存器,這個(gè)頭文件就為我們打包好了要實(shí)現(xiàn)某一個(gè)功能的寄存器,是以機(jī)構(gòu)體的形式定義的,比如通用定時(shí)器要實(shí)現(xiàn)一個(gè)定時(shí)的功能,我們只需要初始化 TIM_TimeBaseInitTypeDef 這個(gè)結(jié)構(gòu)體里面的成員即可,里面的成員就是定時(shí)所需要操作的寄存器。
????有了這個(gè)頭文件,我們就知道要實(shí)現(xiàn)某個(gè)功能需要操作哪些寄存器,然后再回手冊(cè)中精度這些寄存器的說(shuō)明即可。
stm32f10x_xxx.c
??? stm32f10x_xxx.c:外設(shè) xxx 應(yīng)用函數(shù)庫(kù),這里面寫(xiě)好了操作 xxx 外設(shè)的所有常用的函數(shù),我們使用庫(kù)編程的時(shí)候,使用的最多的就是這里的函數(shù)。
SystemInit
????工程中新建main.c 。
????在此文件中編寫(xiě)main函數(shù)后直接編譯會(huì)報(bào)錯(cuò):
Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o).????錯(cuò)誤提示說(shuō)SystemInit沒(méi)有定義。從分析啟動(dòng)文件startup_stm32f10x_hd.s時(shí)我們知道。
????第五行第六行代碼Reset_Handler調(diào)用了SystemInit該函數(shù)用來(lái)初始化系統(tǒng)時(shí)鐘,而該函數(shù)是在庫(kù)文件system_stm32f10x.c中實(shí)現(xiàn)的。我們重新寫(xiě)一個(gè)這樣的函數(shù)也可以,把功能完整實(shí)現(xiàn)一遍,但是為了簡(jiǎn)單起見(jiàn),我們?cè)趍ain文件里面定義一個(gè)SystemInit空函數(shù),為的是騙過(guò)編譯器,把這個(gè)錯(cuò)誤去掉。
????關(guān)于配置系統(tǒng)時(shí)鐘之后會(huì)出文章RCC時(shí)鐘樹(shù)詳細(xì)介紹,主要配置時(shí)鐘控制寄存器(RCC_CR)和時(shí)鐘配置寄存器(RCC_CFGR)這兩個(gè)寄存器,但最好是直接使用CubeMX直接生成,因?yàn)樗呐渲眠^(guò)程有些冗長(zhǎng)。
????如果我們用的是庫(kù),那么有個(gè)庫(kù)函數(shù)SystemInit,會(huì)幫我們把系統(tǒng)時(shí)鐘設(shè)置成72M。
????現(xiàn)在我們沒(méi)有使用庫(kù),那現(xiàn)在時(shí)鐘是多少?答案是8M,當(dāng)外部HSE沒(méi)有開(kāi)啟或者出現(xiàn)故障的時(shí)候,系統(tǒng)時(shí)鐘由內(nèi)部低速時(shí)鐘LSI提供,現(xiàn)在我們是沒(méi)有開(kāi)啟HSE,所以系統(tǒng)默認(rèn)的時(shí)鐘是LSI=8M。
庫(kù)封裝層級(jí)
????如圖,達(dá)到第四層級(jí)便是我們所熟知的固件庫(kù)或HAL庫(kù)的效果。當(dāng)然庫(kù)的編寫(xiě)還需要考慮許多問(wèn)題,不止于這些內(nèi)容。我們需要的是了解庫(kù)封裝的大概過(guò)程。
????將庫(kù)封裝等級(jí)分為四級(jí)來(lái)介紹是為了有層次感,就像打怪升級(jí)一樣,進(jìn)行認(rèn)知理解的升級(jí)。
????我們都知道,操作GPIO輸出分三大步:
時(shí)鐘控制:
??? STM32 外設(shè)很多,為了降低功耗,每個(gè)外設(shè)都對(duì)應(yīng)著一個(gè)時(shí)鐘,在系統(tǒng)復(fù)位的時(shí)候這些時(shí)鐘都是被關(guān)閉的,如果想要外設(shè)工作,必須把相應(yīng)的時(shí)鐘打開(kāi)。
??? STM32 的所有外設(shè)的時(shí)鐘由一個(gè)專(zhuān)門(mén)的外設(shè)來(lái)管理,叫RCC(reset and clockcontrol),RCC 在STM32 參考手冊(cè)的第六章。
??? STM32 的外設(shè)因?yàn)樗俾实牟煌?#xff0c;分別掛載到三條總系上:AHB、APB2、APB1,AHB為高速總線(xiàn),APB2 次之,APB1 再次之。所以的IO 口都掛載到APB2 總線(xiàn)上,屬于高速外設(shè)。
模式配置:
????這個(gè)由端口配置寄存器來(lái)控制。端口配置寄存器分為高低兩個(gè),每4bit 控制一個(gè)IO 口,所以端口配置低寄存器:CRL 控制這IO 口的低8 位,端口配置高寄存器:CRH控制這IO 口的高8bit。
????在4 位一組的控制位中,CNFy[1:0] 用來(lái)控制端口的輸入輸出,MODEy[1:0]用來(lái)控制輸出模式的速率,又稱(chēng)驅(qū)動(dòng)電路的響應(yīng)速度,注意此處速率與程序無(wú)關(guān),GPIO引腳速度、翻轉(zhuǎn)速度、輸出速度區(qū)別輸入有4種模式,輸出有4種模式,我們?cè)诳刂芁ED 的時(shí)候選擇通用推挽輸出。
????輸出速率有三種模式:2M、10M、50M,這里我們選擇2M。
電平控制:
??? STM32的IO口比較復(fù)雜,如果要輸出1和0,則要通過(guò)控制:端口輸出數(shù)據(jù)寄存器ODR來(lái)實(shí)現(xiàn),ODR 是:Output data register的簡(jiǎn)寫(xiě),在STM32里面,其寄存器的命名名稱(chēng)都是英文的簡(jiǎn)寫(xiě),很容易記住。
????從手冊(cè)上我們知道ODR是一個(gè)32位的寄存器,低16位有效,高16位保留。低16位對(duì)應(yīng)著IO0~IO16,只要往相應(yīng)的位置寫(xiě)入0或者1就可以輸出低或者高電平。
????第一層級(jí):基地址宏定義?
????時(shí)鐘控制:
????在STM32中,每個(gè)外設(shè)都有一個(gè)起始地址,叫做外設(shè)基地址,外設(shè)的寄存器就以這個(gè)基地址為標(biāo)準(zhǔn)按照順序排列,且每個(gè)寄存器32位,(后面作為結(jié)構(gòu)體里面的成員正好內(nèi)存對(duì)齊)。
查表看到時(shí)鐘由APB2外設(shè)時(shí)鐘使能寄存器(RCC_APB2ENR)來(lái)控制,其中PB端口的時(shí)鐘由該寄存器的位3寫(xiě)1使能。我們可以通過(guò)基地址+偏移量0x18,算出RCC_APB2ENR的地址為:0x40021018。那么使能PB口的時(shí)鐘代碼則如下所示:
????模式配置:
????同RCC_APB2ENR一樣,GPIOB的起始地址是:0X4001 0C00,我們也可以算出GPIO_CRL的地址為:0x40010C00。那么設(shè)置PB0為通用推挽輸出,輸出速率為2M的代碼則如下所示:
????同上,從手冊(cè)中我們看到ODR寄存器的地址偏移是:0CH,可以算出GPIOB_ODR寄存器的地址是:0X4001 0C00 + 0X0C = 0X4001 0C0C。現(xiàn)在我們就可以定義GPIOB_ODR這個(gè)寄存器了,代碼如下:???????
????第一層級(jí):基地址宏定義完成用STM32控制一個(gè)LED的完整代碼:
????第二層級(jí):基地址宏定義+結(jié)構(gòu)體封裝
外設(shè)寄存器結(jié)構(gòu)體封裝
????上面我們?cè)诓僮骷拇嫫鞯臅r(shí)候,操作的是寄存器的絕對(duì)地址,如果每個(gè)寄存器都這樣操作,那將非常麻煩。我們考慮到外設(shè)寄存器的地址都是基于外設(shè)基地址的偏移地址,都是在外設(shè)基地址上逐個(gè)連續(xù)遞增的,每個(gè)寄存器占32個(gè)或者16個(gè)字節(jié),這種方式跟結(jié)構(gòu)體里面的成員類(lèi)似。
????所以我們可以定義一種外設(shè)結(jié)構(gòu)體,結(jié)構(gòu)體的地址等于外設(shè)的基地址,結(jié)構(gòu)體的成員等于寄存器,成員的排列順序跟寄存器的順序一樣。這樣我們操作寄存器的時(shí)候就不用每次都找到絕對(duì)地址,只要知道外設(shè)的基地址就可以操作外設(shè)的全部寄存器,即操作結(jié)構(gòu)體的成員即可。
????下面我們先定義一個(gè)GPIO寄存器結(jié)構(gòu)體,結(jié)構(gòu)體里面的成員是GPIO的寄存器,成員的順序按照寄存器的偏移地址從低到高排列,成員類(lèi)型跟寄存器類(lèi)型一樣。
????在《STM32 中文參考手冊(cè)》8.2 寄存器描述章節(jié),我們可以找到結(jié)構(gòu)體里面的7個(gè)寄存器描述。在點(diǎn)亮LED的時(shí)候我們只用了CRL和ODR這兩個(gè)寄存器,至于其他寄存器的功能大家可以自行看手冊(cè)了解。
????在GPIO結(jié)構(gòu)體里面我們用了兩個(gè)數(shù)據(jù)類(lèi)型,一個(gè)是uint32_t,表示無(wú)符號(hào)的32位整型,因?yàn)镚PIO的寄存器都是32位的。這個(gè)類(lèi)型聲明在標(biāo)準(zhǔn)頭文件stdint.h 里面使用typedef對(duì)unsigned int重命名,我們?cè)诔绦蛏现灰@個(gè)頭文件即可。
????另外一個(gè)是volatile作用就是告訴編譯器這里的變量會(huì)變化不因優(yōu)化而省略此指令,必須每次都直接讀寫(xiě)其值,這樣就能確保每次讀或者寫(xiě)寄存器都真正執(zhí)行到位。
外設(shè)封裝
??? STM32F1系列的GPIO端口分A~G,即GPIOA、GPIOB。。。。。。GPIOG。每個(gè)端口都含有GPIO_TypeDef結(jié)構(gòu)體里面的寄存器,我們可以根據(jù)手冊(cè)各個(gè)端口的基地址把GPIO的各個(gè)端口定義成一個(gè)GPIO_TypeDef類(lèi)型指針,然后我們就可以根據(jù)端口名(實(shí)際上現(xiàn)在是結(jié)構(gòu)體指針了)來(lái)操作各個(gè)端口的寄存器,代碼實(shí)現(xiàn)如下:
外設(shè)內(nèi)存映射
????講到基地址的時(shí)候我們?cè)僖艘粋€(gè)知識(shí)點(diǎn):Cortex-M3存儲(chǔ)器系統(tǒng),這個(gè)知識(shí)點(diǎn)在《Cortex-M3權(quán)威指南》第5章里面講到。CM3的地址空間是4GB,如下圖所示:
????我們這里要講的是片上外設(shè),就是我們所說(shuō)的寄存器的根據(jù)地,其大小總共有512MB,512MB是其極限空間,并不是每個(gè)單片機(jī)都用得完,實(shí)際上各個(gè)MCU廠(chǎng)商都只是用了一部分而已。STM32F1系列用到了:0x4000 0000 ~0x5003 FFFF。現(xiàn)在我們說(shuō)的STM32的寄存器就是位于這個(gè)區(qū)域。
APB1、APB2、AHB 總線(xiàn)基地址
????現(xiàn)在我們說(shuō)的STM32的寄存器就是位于這個(gè)區(qū)域,這里面ST設(shè)計(jì)了三條總線(xiàn):AHB、APB2和APB1,其中AHB和APB2是高速總線(xiàn),APB1是低速總線(xiàn)。不同的外設(shè)根據(jù)速度不同分別掛載到這三條總線(xiàn)上。
????從下往上依次是:APB1、APB2、AHB,每個(gè)總線(xiàn)對(duì)應(yīng)的地址分別是:APB1:0x40000000,APB2:0x4001 0000,AHB:0x4001 8000。
????這三條總線(xiàn)的基地址我們是從《STM32 中文參考手冊(cè)》2.3小節(jié)—存儲(chǔ)器映像得到的:APB1的基地址是TIM2定時(shí)器的起始地址,APB2的基地址是AFIO的起始地址,AHB的基地址是SDIO的起始地址。其中APB1地址又叫做外設(shè)基地址,是所有外設(shè)的基地址,叫做PERIPH_BASE。
????現(xiàn)在我們把這三條總線(xiàn)地址用宏定義出來(lái),以后我們?cè)诙x其他外設(shè)基地址的時(shí)候,只需要在這三條總線(xiàn)的基址上加上偏移地址即可,代碼如下:
GPIO 端口基地址
????因?yàn)镚PIO掛載到APB2總線(xiàn)上,那么現(xiàn)在我們就可以根據(jù)APB2的基址算出各個(gè)GPIO端口的基地址,用宏定義實(shí)現(xiàn)代碼如下:
????第二層級(jí):基地址宏定義+結(jié)構(gòu)體封裝完成用STM32控制一個(gè)LED的完整代碼:???????
????第二層級(jí)變化:
????①、定義一個(gè)外設(shè)(GPIO)寄存器結(jié)構(gòu)體,結(jié)構(gòu)體的成員包含該外設(shè)的所有寄存器,成員的排列順序跟寄存器偏移地址一樣,成員的數(shù)據(jù)類(lèi)型跟寄存器的一樣。
????②外設(shè)內(nèi)存映射,即把地址跟外設(shè)建立起一一對(duì)應(yīng)的關(guān)系。
????③外設(shè)聲明,即把外設(shè)的名字定義成一個(gè)外設(shè)寄存器結(jié)構(gòu)體類(lèi)型的指針。
????④通過(guò)結(jié)構(gòu)體操作寄存器,實(shí)現(xiàn)點(diǎn)亮LED。
????第三層級(jí):基地址宏定義+結(jié)構(gòu)體封裝+“位封裝”(每一位的對(duì)應(yīng)字節(jié)封裝)
上面我們?cè)诳刂艷PIO輸出內(nèi)容的時(shí)候控制的是ODR(Output data register)寄存器,ODR是一個(gè)16位的寄存器,必須以字的形式控制其實(shí)我們還可以控制BSRR和BRR這兩個(gè)寄存器來(lái)控制IO的電平,下面我們簡(jiǎn)單介紹下BRR寄存器的功能,BSRR自行看手冊(cè)研究。
????位清除寄存器BRR只能實(shí)現(xiàn)位清0操作,是一個(gè)32位寄存器,低16位有效,寫(xiě)0沒(méi)影響,寫(xiě)1清0。現(xiàn)在我們要使PB0輸出低電平,點(diǎn)亮LED,則只要往BRR的BR0位寫(xiě)1即可,其他位為0,代碼如下:
????這時(shí)PB0就輸出了低電平,LED就被點(diǎn)亮了。
????如果要PB2輸出低電平,則是:
????如果要PB3/4/5/6。。。。。。這些IO輸出低電平呢?
????道理是一樣的,只要往BRR的相應(yīng)位置賦不同的值即可。因?yàn)锽RR是一個(gè)16位的寄存器,位數(shù)比較多,賦值的時(shí)候容易出錯(cuò),而且從賦值的16進(jìn)制數(shù)字我們很難清楚的知道控制的是哪個(gè)IO。
????這時(shí),我們是否可以把BRR的每個(gè)位置1都用宏定義來(lái)實(shí)現(xiàn),如GPIO_Pin_0就表示0X0001,GPIO_Pin_2就表示0X0004。只要我們定義一次,以后都可以使用,而且還見(jiàn)名知意。“位封裝”(每一位的對(duì)應(yīng)字節(jié)封裝) 代碼如下:???????
????這時(shí)PB0就輸出了低電平的代碼就變成了:
????如果同時(shí)讓PB0/PB15輸出低電平,用或運(yùn)算,代碼:
????為了不使main函數(shù)看起來(lái)冗余,上述庫(kù)封裝 的代碼不應(yīng)該放在main里面,因?yàn)槠涫歉鶪PIO相關(guān)的,我們可以把這些宏放在一個(gè)單獨(dú)的頭文件里面。
????在工程目錄下新建stm32f10x_gpio.h,把封裝代碼放里面,然后把這個(gè)文件添加到工程里面。這時(shí)我們只需要在main.c里面包含這個(gè)頭文件即可。
????第四層級(jí):基地址宏定義+結(jié)構(gòu)體封裝+“位封裝”+函數(shù)封裝
????我們點(diǎn)亮LED的時(shí)候,控制的是PB0這個(gè)IO,如果LED接到的是其他IO,我們就需要把GPIOB修改成其他的端口,其實(shí)這樣修改起來(lái)也很快很方便。
????但是為了提高程序的可讀性和可移植性,我們是否可以編寫(xiě)一個(gè)專(zhuān)門(mén)的函數(shù)用來(lái)復(fù)位GPIO的某個(gè)位,這個(gè)函數(shù)有兩個(gè)形參,一個(gè)是GPIOX(X=A...G),另外一個(gè)是GPIO_Pin(0...15),函數(shù)的主體則是根據(jù)形參GPIOX 和GPIO_Pin來(lái)控制BRR寄存器,代碼如下:
????這時(shí),PB0輸出低電平,點(diǎn)亮LED的代碼就變成了:
????同理, 我們可以控制BSRR這個(gè)寄存器來(lái)實(shí)現(xiàn)關(guān)閉LED,代碼如下:
????這時(shí),PB0輸出高電平,關(guān)閉LED的代碼就變成了:
????同樣,因?yàn)檫@個(gè)函數(shù)是控制GPIO的函數(shù),我們可以新建一個(gè)專(zhuān)門(mén)的文件來(lái)放跟gpio有關(guān)的函數(shù)。相關(guān)文章:STM32中GPIO工作原理詳解。
????在工程目錄下新建stm32f10x_gpio.c,把GPIO相關(guān)的函數(shù)放里面。這時(shí)我們是否發(fā)現(xiàn)剛剛新建了一個(gè)頭文件stm32f10x_gpio.h,這兩個(gè)文件存放的都是跟外設(shè)GPIO相關(guān)的。
??? C文件里面的函數(shù)會(huì)用到h頭文件里面的定義,這兩個(gè)文件是相輔相成的,故我們?cè)趕tm32f10x_gpio.c 文件中也包含stm32f10x_gpio.h這個(gè)頭文件。別忘了把stm32f10x.h這個(gè)頭文件也包含進(jìn)去,因?yàn)橛嘘P(guān)寄存器的所有定義都在這個(gè)頭文件里面。
????如果我們寫(xiě)其他外設(shè)的函數(shù),我們也應(yīng)該跟GPIO一樣,新建兩個(gè)文件專(zhuān)門(mén)來(lái)存函數(shù),比如RCC這個(gè)外設(shè)我們可以新建stm32f10x_rcc.c和stm32f10x_rcc.h。其他外依葫蘆畫(huà)瓢即可。
實(shí)例編寫(xiě)
????以上,是對(duì)庫(kù)封住過(guò)程的概述,下面我們正在地使用庫(kù)函數(shù)編寫(xiě)LED程序。
①管理庫(kù)的頭文件
????當(dāng)我們開(kāi)始調(diào)用庫(kù)函數(shù)寫(xiě)代碼的時(shí)候,有些庫(kù)我們不需要,在編譯的時(shí)候可以不編譯,可以通過(guò)一個(gè)總的頭文件stm32f10x_conf.h來(lái)控制,該頭文件主要代碼如下:
?
????這里面包含了全部外設(shè)的頭文件,點(diǎn)亮一個(gè)LED我們只需要RCC和GPIO 這兩個(gè)外設(shè)的庫(kù)函數(shù)即可,其中RCC控制的是時(shí)鐘,GPIO控制的具體的IO口。所以其他外設(shè)庫(kù)函數(shù)的頭文件我們注釋掉,當(dāng)我們需要的時(shí)候就把相應(yīng)頭文件的注釋去掉即可。
??? stm32f10x_conf.h這個(gè)頭文件在stm32f10x.h這個(gè)頭文件的最后面被包含,在第8296行:
????代碼的意思是,如果定義了USE_STDPERIPH_DRIVER這個(gè)宏的話(huà),就包含stm32f10x_conf.h這個(gè)頭文件。
????我們?cè)谛陆üこ痰臅r(shí)候,在魔術(shù)棒選項(xiàng)卡C/C++中,我們定義了USE_STDPERIPH_DRIVER 這個(gè)宏,所以stm32f10x_conf.h 這個(gè)頭文件就被stm32f10x.h包含了,我們?cè)趯?xiě)程序的時(shí)候只需要調(diào)用一個(gè)頭文件:stm32f10x.h即可。
②編寫(xiě)LED初始化函數(shù)
????經(jīng)過(guò)寄存器點(diǎn)亮LED的操作,我們知道操作一個(gè)GPIO輸出的編程要點(diǎn)大概如下:
1、開(kāi)啟GPIO的端口時(shí)鐘
2、選擇要具體控制的IO口,即pin
3、選擇IO口輸出的速率,即speed
4、選擇IO口輸出的模式,即mode
5、輸出高/低電平
??? STM32的時(shí)鐘功能非常豐富,配置靈活,為了降低功耗,每個(gè)外設(shè)的時(shí)鐘都可以獨(dú)自的關(guān)閉和開(kāi)啟。STM32中跟時(shí)鐘有關(guān)的功能都由RCC這個(gè)外設(shè)控制,RCC中有三個(gè)寄存器控制著所以外設(shè)時(shí)鐘的開(kāi)啟和關(guān)閉:RCC_APHENR、RCC_APB2ENR和RCC_APB1ENR,AHB、APB2和APB1代表著三條總線(xiàn),所有的外設(shè)都是掛載到這三條總線(xiàn)上,GPIO屬于高速的外設(shè),掛載到APB2總線(xiàn)上,所以其時(shí)鐘有RCC_APB2ENR控制。
GPIO 時(shí)鐘控制
????固件庫(kù)函數(shù):RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE)函數(shù)的原型為:
????當(dāng)程序編譯一次之后,把光標(biāo)定位到函數(shù)/變量/宏定義處,按鍵盤(pán)的F12或鼠標(biāo)右鍵的Go to definition of,就可以找到原型。固件庫(kù)的底層操作的就是RCC外設(shè)的APB2ENR這個(gè)寄存器,宏RCC_APB2Periph_GPIOB的原型是:0x00000008,即(1<<3),還原成存器操作就是:RCC->APB2ENR |= 1<<<3。相比固件庫(kù)操作,寄存器操作的代碼可讀性就很差,只有才查閱寄存器配置才知道具體代碼的功能,而固件庫(kù)操作恰好相反,見(jiàn)名知意。
GPIO 端口配置
??? GPIO的pin,速度,模式,都由GPIO的端口配置寄存器來(lái)控制,其中IO0~IO7由端口配置低寄存器CRL控制,IO8~IO15由端口配置高寄存器CRH配置。固件庫(kù)把端口配置的pin,速度和模式封裝成一個(gè)結(jié)構(gòu)體:
??? pin可以是GPIO_Pin_0~GPIO_Pin_15或者是GPIO_Pin_All,這些都是庫(kù)預(yù)先定義好的宏。speed也被封裝成一個(gè)結(jié)構(gòu)體:
????速度可以是10M,2M或者50M,這個(gè)由端口配置寄存器的MODE位控制,速度是針對(duì)IO口輸出的時(shí)候而言,在輸入的時(shí)候可以不用設(shè)置。mode也被封裝成一個(gè)結(jié)構(gòu)體:???????
??? IO口的模式有8種,輸入輸出各4種,由端口配置寄存器的CNF配置。平時(shí)用的最多的就是通用推挽輸出,可以輸出高低電平,驅(qū)動(dòng)能力大,一般用于接數(shù)字器件。
????最終用固件庫(kù)實(shí)現(xiàn)就變成這樣:
// 定義一個(gè)GPIO_InitTypeDef 類(lèi)型的結(jié)構(gòu)體GPIO_InitTypeDef GPIO_InitStructure; // 選擇要控制的IO 口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 設(shè)置引腳為推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 設(shè)置引腳速率為50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; /*調(diào)用庫(kù)函數(shù),初始化GPIOB0*/GPIO_Init(GPIOB, &GPIO_InitStructure);????倘若同一端口下不同引腳有不同的模式配置,每次對(duì)每個(gè)引腳配置完成后都要調(diào)用GPIO初始化函數(shù),代碼如下:
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO 輸出控制
??? GPIO輸出控制,可以通過(guò)端口數(shù)據(jù)輸出寄存器ODR、端口位設(shè)置/清除寄存器BSRR和端口位清除寄存器BRR這三個(gè)來(lái)控制。端口輸出寄存器ODR是一個(gè)32位的寄存器,低16位有效,對(duì)應(yīng)著IO0~IO15,只能以字的形式操作,
????端口位清除寄存器BRR是一個(gè)32位的寄存器,低十六位有效,對(duì)應(yīng)著IO0~IO15,只能以字的形式操作,可以單獨(dú)對(duì)某一個(gè)位操作,寫(xiě)1清0。
??? BSRR是一個(gè)32位的寄存器,低16位用于置位,寫(xiě)1有效,高16位用于復(fù)位,寫(xiě)1有效,相當(dāng)于BRR寄存器。高16位我們一般不用,而是操作BRR這個(gè)寄存器,所以BSRR這個(gè)寄存器一般用來(lái)置位操作。
????綜上:固件庫(kù)LED GPIO初始化函數(shù)。
主函數(shù)
????注意void Time_Delay(volatile uint32_t Count)只是一個(gè)簡(jiǎn)陋的軟件延時(shí)函數(shù),如果小伙伴們有興趣可以看一看MultiTimer,它是一個(gè)軟件定時(shí)器擴(kuò)展模塊,可無(wú)限擴(kuò)展所需的定時(shí)器任務(wù),取代傳統(tǒng)的標(biāo)志位判斷方式, 更優(yōu)雅更便捷地管理程序的時(shí)間觸發(fā)時(shí)序。
總結(jié)
- 上一篇: 阿里销售铁军:阿里巴巴客户跟进流程
- 下一篇: 常用的linux连接工具