在網(wǎng)上看到的一遍文章,覺(jué)的不錯,分享給大家 單片的輸入輸出不叫GPIO,僅僅是個(gè)io,稍微復雜點(diǎn)的就是串口,至于后面那些增強的1t的帶da的 單片機,都不屬于入門(mén)學(xué)習范圍.那些東西都是為了低成本而存在,對學(xué)習沒(méi)有任何作用.只要初學(xué)者入門(mén)了,所有片內外設都非常簡(jiǎn)單的搞定.本文是一片基礎學(xué)習文章.入門(mén)者的精神食糧.
理解gpio不僅僅是會(huì )配置寄存器,因為好多人根本不知道寄存器如何配置.如果不信的話(huà)那回答我這個(gè)問(wèn)題,stm32的io頻率到底該配置成多少Mhz?
上面這張圖是來(lái)自stm32的中文版手冊.我對這些模塊進(jìn)行了簡(jiǎn)單的標注.下面我就從外到內進(jìn)行分析信號的流向以及每一部分存在/屏蔽的意義.
先看上半部分,就是io的I,input,輸入功能.信號從io引腳流入,首先被保護 二極管q/r進(jìn)行鉗位.那就舉一個(gè)例子,假定vdd是3.3v,那么二極管有0.7v的壓降,那么io引腳的高電平就不能超過(guò)3.3+0.7v=4v只要超過(guò)4v那么就會(huì )有很大的 電流從保護二極管流過(guò),信號的內阻就會(huì )承擔比較大的 電壓,使io引腳的電壓最高鉗位到4v.上面分析的是對于過(guò)高的電平.q二極管導通.r二極管關(guān)閉,所以不用分析.對于io出現負電壓,這個(gè)時(shí)候q二極管是關(guān)閉的需要分析下面的r二極管.r二極管保持io引腳電平不低于vss-0.7v.至于為什么會(huì )出現這種情況,暫時(shí)不做分析,如果你看過(guò) 示波器的振鈴信號.就明白了.給大家留一個(gè)問(wèn)題,如何消除振鈴信號? 對于正常的數字信號,就進(jìn)入了o/p 電阻的控制范圍.上下拉電阻的作用又是什么,什么時(shí)候需要上下拉? 上拉電阻就是在信號和vdd直接接引ig電阻,經(jīng)驗值在10k左右.對于一個(gè)5v的信號,能夠最大提供0.5ma的電流.首先聊一個(gè)開(kāi)漏輸出,就是iic使用的信號.這種信號的兩個(gè)狀態(tài)是Z高阻態(tài)和0低電平,無(wú)法提供高電平的.加入一個(gè)上拉電阻,就能在z態(tài)的時(shí)候,信號線(xiàn)為高電平vdd, 0態(tài)的時(shí)候信號線(xiàn)為0.上拉電阻承擔整個(gè)vdd電壓.也就是說(shuō)z態(tài)的時(shí)候上拉電阻無(wú)電流通過(guò),功耗基本為0,而0態(tài)的時(shí)候上拉電阻功率為vdd*vdd/r,在低功耗設計的時(shí)候這一個(gè)電阻的功耗需要考慮.默認狀態(tài)需要保持電阻在功耗0的狀態(tài).當然對于stm32這種片內控制的上下拉,直接關(guān)掉,讓其浮空.就會(huì )降低功耗.但是有可能信號也失去了意義無(wú)法喚醒cpu.慎重嚴肅考慮.上拉電阻的意義就是給 總線(xiàn)灌入一定電流,提高總線(xiàn)從0到1跳變的速度.有些信號驅動(dòng)能力不足的時(shí)候,會(huì )提供信號的高電平驅動(dòng)能力.包括電壓和電流.相反,減緩了下降沿的速度,降低了低電平的驅動(dòng)能力.在設計的時(shí)候多用歐姆定律計算.包括功耗.電阻究竟該用多大.
K元件,呵呵.這個(gè)是個(gè)很有意思的東西.其實(shí)這里的每一個(gè)元件都有意思,否則 2個(gè)電阻2個(gè)二極管就不需要寫(xiě)上面的兩大段了.首先名稱(chēng)是ttl肖特基觸發(fā)器,不就是個(gè)帶門(mén)限的觸發(fā)器嘛.首先ttl是指他的參考是ttl電平不是cmos電平,這里寫(xiě)詳細了大家也會(huì )混亂.ttl電平我解釋一下,TTL輸出高電平>2.4V,輸出低電平<0.4V。最小輸入高電平和最大輸入低電平:輸入高電平>=2.0V,輸入低電平<=0.8V,噪聲容限是0.4V。也就是說(shuō)b模擬輸入,是直接從io引入,并且與c數字部分進(jìn)行了隔離.數字部分使用ttl電平的觸發(fā)器進(jìn)行了緩沖,這個(gè)緩沖有時(shí)候也被稱(chēng)為buff,但是buff并不全是觸發(fā)器.觸發(fā)器的延時(shí)在5-10ns之間.當然i和c會(huì )同時(shí)獲取ttl肖特基觸發(fā)器的輸出,觸發(fā)器也對信號的驅動(dòng)能力進(jìn)行了提高,至于是c還是d來(lái)消費掉這個(gè)信號,就看你io配置成什么功能了.
對于GPIO的o, output,就從左向右進(jìn)行分析.首先是信號的生成,其一是寄存器,由cpu來(lái)操作.e和f共兩種操作,e是單次操作只能設置寄存器的某些位為1,或者清除某些位為0,影響部分bit,而f是直接將輸出寄存器改變,影響 全部bit.對于j是硬件控制器自動(dòng)生成信號流,這里就不用詳述了.控制輸出前面的梯形是選擇器,選擇其中的一路有效.無(wú)效的一路cpu也可以操作.但是毫無(wú)意義.很多人都是在這個(gè)坑里出不來(lái),我做了一些操作,但是io不聽(tīng)話(huà).對于控制輸出和m/n兩個(gè)管子共同生成高低電平的切換.當然,這里會(huì )有一個(gè)死區控制.別看這芯片原理圖這么畫(huà),就認為是這么簡(jiǎn)單設計.如果用橋 電路控制電機就會(huì )掉坑里.因為圖上的控制框是有死區控制的.并且能控制好.控制不好就會(huì )出現跳變的時(shí)候io功率很大.對于電機橋電路來(lái)說(shuō).就是直接燒壞驅動(dòng)芯片.做輸出的時(shí)候,上下拉電阻都是斷開(kāi)的.但是保護二極管沒(méi)有斷開(kāi).這里提出一個(gè)問(wèn)題,雖然是輸出,信號會(huì )過(guò)充嗎?大家自己去考慮.專(zhuān)業(yè) STM32學(xué)習QQ754634522
寫(xiě)道這里,圖解gpio就結束了.把中間的兩個(gè)復雜的問(wèn)題總結一下答案. 1. 振鈴信號 2.gpio的頻率 振鈴信號是因為電路的阻抗匹配出問(wèn)題導致.也就是信號線(xiàn)上的 電感和 電容導致了信號的震蕩.這個(gè)震蕩與信號的跳變間隔基本無(wú)關(guān).但跳變間隔長(cháng)的信號,對振鈴不敏感而已.因為他們有更多的采樣時(shí)間.在工業(yè)級總線(xiàn)上可以多次采樣求平均值來(lái)扛干擾.震蕩信號 與跳變的邊沿有關(guān).跳變邊沿的頻率約為信號反轉頻率的10倍.就是一個(gè)1k的串口信號,跳變頻率大約在10k級別.所以2.gpio的頻率是1振鈴信號的產(chǎn)生原因之一.既然是之一,那么,就可以通過(guò)修改它來(lái)減少振鈴信號.提高信號的穩定程度.并且減少干擾.那么對于小于200K的時(shí)鐘來(lái)說(shuō),設置2M時(shí)鐘即可.對于小于1M的信號,設置10M輸出即可.對于5M以下的信號,設置50Mhz,對于5M以上的信號,也只能設置50Mhz,這時(shí)候,你要去考慮信號邊沿的斜率是不是能滿(mǎn)足你的需要了.例如io頻率在48M的時(shí)候,波形可能已經(jīng)不是漂亮的方波了.但是不代表這個(gè)信號是不能用的.要看你的接收方是不是認可這種信號.當然,這里我也不用多說(shuō)了,遇到這種問(wèn)題的人,都知道如何解決.只不過(guò)沒(méi)法找到萬(wàn)能的解決辦法. 嵌入式、STM32專(zhuān)業(yè)實(shí)訓QQ754634522
|