- 基于ARM Cortex-M3的STM32系列嵌入式微控制器應用實踐
- 彭剛 秦志強編著
- 1528字
- 2018-12-27 16:01:44
第2章 STM32單片機I/O端口與伺服電機控制
本章教你如何用STM32單片機的輸入/輸出端口來控制發光二極管的閃爍,以及控制機器人小車伺服電機,讓它運動。為此,你需要理解和掌握用STM32輸入/輸出端口的配置方法,控制伺服電機方向、速度和運行時間的相關原理和編程技術。
2.1 STM32單片機的輸入/輸出端口
控制機器人伺服電機以不同速度運動是通過讓單片機的輸入/輸出(I/O)口輸出不同的脈沖序列來實現的。STM32-M3單片機有5個16位的并行I/O口:PA、PB、PC、PD和PE。這5個端口,既可以作為輸入,也可以作為輸出;可按16位處理,也可按位方式(1位)使用。圖2.1是基于ARM Cortex-M3內核的STM32F103xx單片機引腳定義圖,這是一個標準的100引腳LQFP封裝的芯片。

圖2.1 基于ARM Cortex-M3內核的STM32F103xx單片機引腳定義圖
LQFP也就是薄型QFP(Low-profile Quad Flat Package),是指封裝本體厚度為1.4mm的QFP。QFP封裝的中文含義叫方型扁平式封裝技術(Quad Flat Package),該技術實現的CPU芯片引腳之間距離很小,引腳很細,一般大規模或超大規模集成電路采用這種封裝形式,其引腳數一般都在100以上。該技術封裝CPU(如STM32F103xx)時操作方便,可靠性高,而且其封裝外形尺寸較小,寄生參數減小,適合高頻應用。該技術主要適合用SMT表面安裝技術在PCB上安裝布線。本書所用教學開發板上還有SOT封裝的穩壓電源芯片,SOP封裝的RS-232通信芯片,0603封裝的電阻和電容,這些都是SMD表面貼裝器件。
任務一 認識封裝
封裝就是指把硅片上的電路管腳用導線接引到外部接頭處,以便與其他器件連接。封裝形式是指安裝半導體集成電路芯片用的外殼。它不僅起著安裝、固定、密封、保護芯片及增強電熱性能等方面的作用,而且還通過芯片上的接點用導線連接到封裝外殼的引腳上,這些引腳又通過印制電路板上的導線與其他器件相連接,從而實現內部芯片與外部電路的連接。芯片內部必須與外界隔離,以防止空氣中的雜質對芯片電路的腐蝕而造成電氣性能下降。另外,封裝后的芯片也更便于安裝和運輸。由于封裝技術的好壞還直接影響到芯片自身性能的發揮和與之連接的PCB(Printed Circuit Board,印制電路板)的設計和制造,因此它是至關重要的。
封裝主要分為DIP(Dual ln-line Package,雙列直插式封裝)和SMD(Surface Mounted Devices,表面貼裝器件封裝)兩種。其中,SMD是SMT(Surface Mounted Technology,表面貼片技術)元器件中的一種。當代集成電路的裝配方式從通孔插裝(Plating Through Hole,PTH)逐漸發展到表面組裝(SMT)。從結構方面,封裝經歷了最早期的晶體管TO(如TO-89、TO92)封裝發展到了雙列直插封裝,隨后由PHILIP公司開發出了SOP小外型封裝;從材料介質方面,包括金屬、陶瓷、塑料、塑料等。目前很多高強度工作條件需求的電路,如軍工和宇航級別仍用大量的金屬封裝。封裝大致經過了如下發展進程:
結構方面:TO→DIP→PLCC→QFP→BGA→CSP;
材料方面:金屬、陶瓷→陶瓷、塑料→塑料;
引腳形狀:長引線直插→短引線或無引線貼裝→球狀凸點。
幾種常用封裝
TO:Transistor Out-line,晶體管外形封裝。這是早期的封裝規格,如TO-92、TO-220等都是插入式封裝設計。
SIP:Single In-line Package,單列直插式封裝。引腳從封裝一個側面引出,排列成一條直線。當裝配到印制基板上時封裝呈側立狀。如一般的三極管就是SIP3封裝。
DIP:Dual ln-line Package,雙列直插式封裝,引腳從封裝兩側引出,封裝材料有塑料和陶瓷兩種。DIP是最普及的插裝型封裝,應用范圍包括標準邏輯IC,存儲器等。
PLCC:Plastic Leaded Chip Carrier,帶引線的塑料芯片載體。表面貼裝型封裝之一。
QFP:Quad Flat Package,四側引腳扁平封裝。表面貼裝型封裝之一,引腳從四個側面引出呈海鷗翼(L)型。基材有陶瓷、金屬和塑料三種。QFP的缺點是,當引腳中心距小于0.65mm時,引腳容易彎曲。為了防止引腳變形,出現了幾種改進的QFP品種。如BQFP(Quad Flat Package with Bumper),帶緩沖墊的四側引腳扁平封裝。在封裝本體的四個角設置突起(緩沖墊)以防止在運送過程中引腳發生彎曲變形。
QFN(Quad Flat Non-leaded Package),四側無引腳扁平封裝。表面貼裝型封裝之一。現在多稱為LCC。QFN是日本電子機械工業會規定的名稱。封裝四側配置有電極觸點,由于無引腳,貼裝占有面積比QFP小,高度比QFP低。但是,當印刷基板與封裝之間產生應力時,在電極接觸處就不能得到緩解。因此電極觸點難于做到QFP的引腳那樣多,一般從14~100。材料有陶瓷和塑料兩種。當有LCC標記時基本上都是陶瓷QFN。
BGA:Ball Grid Array,球形觸點陣列,表面貼裝型封裝之一。
SOP:Small Out-line Package,小外形封裝,是從SMT技術衍生出的,表面貼裝型封裝之一。引腳從封裝兩側引出呈海鷗翼狀(L字形)。材料有塑料和陶瓷兩種。SOP封裝的應用范圍很廣,后來逐漸派生出SOJ(Small Out-line J-lead,J型引腳小外形封裝)、TSOP(Thin SOP,薄小外形封裝)、VSOP(Very SOP,甚小外形封裝)、SSOP(Shrink SOP,縮小型SOP)、TSSOP(Thin Shrink SOP,薄的縮小型SOP)及SOT(Small Out-line Transistor,小外形晶體管)、SOIC(Small Out-line Integrated Circuit,小外形集成電路)等,在集成電路中都起到了舉足輕重的作用。
CSP(Chip Scale Package),是芯片級封裝的意思。CSP封裝是最新一代的內存芯片封裝技術,可以讓芯片面積與封裝面積之比超過1:1.14,已經相當接近1:1的理想情況,絕對尺寸也僅有32平方毫米,約為普通的BGA的1/3,僅僅相當于TSOP內存芯片面積的1/6。CSP封裝線路阻抗顯著減小,芯片速度隨之大幅度提高,而且芯片的抗干擾、抗噪性能也能得到大幅提升,這也使得CSP的存取時間比BGA改善15%~20%。CSP技術是在電子產品的更新換代時提出來的,它的目的是在使用大芯片替代以前的小芯片時,其封裝體占用印刷板的面積保持不變或更小。正是由于CSP產品的封裝體小、薄,因此它的手持式移動電子設備中迅速獲得了應用。
STM32F103引腳
STM32F103系列微控制器隨著后綴的不同,引腳數量也不同,有36、48、64、100、144引腳。圖2.1所示的STM32F103Vx系列共有100根引腳,其中80根是I/O端口引腳,而STM32F103Rx系列有64根引腳,其中51根是I/O端口引腳。這些I/O引腳中的部分I/O口可以復用,將它配置成輸入、輸出、模數轉換口或者串口等。
與標準51單片機比較,一些高級的單片機或者微處理器,如基于ARM Cortex-M3的STM32系列單片機、基于ARM9的S3C2410/2440等都需要進行I/O口功能的配置。
對于STM32F103xxyy系列:
第一個x代表引腳數:T代表36引腳,C代表48引腳,R代表64引腳,V代表100引腳,Z代表144引腳。第二個x代表內嵌的Flash容量:6代表32K,8代表64K,B代表128K,C代表256K,D代表384K,E代表512K。
第一個y代表封裝:H代表BGA封裝,H代表LQFP封裝,U代表QFN封裝。第二個y代表工作溫度范圍:6代表-40~85℃,6代表-40~105℃。
你現在明白F103VB、VC、VE等的含義了吧。這種組合不是任意的,如沒有STM32F103TC等。更詳細的STM32系列單片機的編號說明見附錄。
說到這里,你或許馬上就會問:處理器的這些引腳端口是什么作用,是作為輸入、還是輸出、或者是其他什么功能呢?這與處理器各I/O端口的內部結構有關。后面的章節會根據不同的任務逐步介紹它們的原理和使用方法。本章主要介紹如何用PA~PE口來完成發光二極管的閃爍、機器人小車伺服電機的控制。如果將PA~PE口作為輸出時,需要進行相關的配置,配置好后,只需向該端口的各個位輸出你想輸出的高低電平信號即可。
任務二 單燈閃爍控制
為了驗證某個端口的輸出電平是不是由你編寫的程序輸出的電平,可以采用一個非常簡單有效的辦法,就是在你想驗證的端口位接一個發光二極管。當你輸出低電平時,發光二極管亮;輸出高電平時,發光二極管滅。電路圖如圖2.2所示。

圖2.2 發光二極管電路圖
在本任務中,使用PC13來控制發光二極管以1Hz的頻率不斷閃爍。
例程:Led_Blink.c
● 接通板上的電源;
● 輸入、保存、下載并運行程序Led_Blink.c(整個過程請參考第1章);
● 觀察與PC13連接的LED是否周期性的閃爍。
#include "stm32f10x_heads.h" #include "HelloRobot.h" int main(void) { BSP_Init(); //開發板初始化函數 USART_Configuration(); printf("Program Running!\n"); while (1) { GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13輸出高電平 delay_nms(500); // 延時500ms GPIO_ResetBits(GPIOC,GPIO_Pin_13);// PC13輸出低電平 delay_nms(500); // 延時500ms } }
Led_Blink.c是如何工作的?
先看while(1)邏輯塊中的語句,兩次調用了延時函數,讓單片機微控制器在給PC13引腳端口輸出高電平和低電平之間都延時500ms,即輸出的高電平和低電平都保持500ms,從而達到發光二極管LED以1Hz的頻率不斷閃爍的效果。
頭文件HelloRobot.h中定義了兩個延時函數:void delay_nms(unsigned int i)與void delay_nus(unsigned int i)。
void delay_nus(unsigned long n) //延時n us:n>=6,最小延時單位6μs { unsigned long j; while(n--) // 外部晶振:8M;PLL:9;8M*9=72MHz { j=8; // 微調參數,保證延時的精度 while(j--); } } void delay_nms(unsigned long n) //延時n ms { while(n--) // 外部晶振:8M;PLL:9;8M*9=72MHz delay_nus(1100); //1ms延時補償 }
無符號長整型數據unsigned long
與長整型數據long相比,無符號長整型數據unsigned long只有一個區別:數據的取值范圍從-2147483648~+2147483647變為0~4294967295,也就是說它只能取非負整數。基于ARM內核的微處理器(S3C2410/2440)或者單片機(STM32系列)是32位的,所以Keil MDK開發環境中整型int數據與長整型long數據相同,占用4字節;若在Keil uVision3中開發8位的51單片機程序,則整型int數據占用2字節,與短整型short數據相同。注意它們的范圍有所不同。
delay_nus( )是微秒級的延時,而delay_nms( )是毫秒級的延時。如果你想延時1s,可以使用語句delay_nms(1000);1ms的延時則用delay_nus(1000)來完成。
注意:上述的延時函數是在外部晶振為8MHz,內部鎖相環(Phase Lock Loop,PLL)設置為9 倍頻的情況下設計的,這兩個函數所產生的延時都經過示波器測試過。如果外部晶振頻率不是8MHz,調用這兩個函數所產生的真正延時就會發生變化。晶振電路如圖2.3所示。圖2.3(a)是系統晶振電路。

圖2.3 晶振電路
晶振的作用
單片機要能工作,就必須有一個標準時鐘信號,而晶振就是為單片機提供標準時鐘信號。晶振的作用類似人的心跳,只有晶振起振了,嵌入式系統中的處理器才能工作、執行代碼、實現特定功能,完成應用程序任務。因此,如果系統不工作應注意查看晶振是否起振了。可以用示波器測量晶振引腳處是否有信號。
如果將晶振比喻為人的心跳,那么電源輸出電流就類似于流經人全身的血液。因此晶振和電源在嵌入式系統中的作用,就相當于心臟和血液對于人的作用,你說重不重要!晶振不穩定就相當于心率不齊。沒有電源,電源不能輸出電流,就相當于沒有血液,或血液不流動。在后面的實時時鐘章節中,將會更詳細的介紹晶振。
注意:STM32上電默認是使用內部高速RC時鐘(HIS),因此,判斷STM32單片機最小系統是否工作用示波器檢查OSC引腳是否有時鐘信號是錯誤的。
如何選擇晶振
對于一個高可靠性的系統設計,晶振的選擇非常重要,尤其設計帶有睡眠喚醒(往往用低電壓以求低功耗)的系統。這是因為低供電電壓使提供給晶振的激勵功率減少,造成晶振起振很慢或根本就不能起振。這一現象在上電復位時并不特別明顯,原因是上電時電路有足夠的擾動,很容易建立振蕩。在睡眠喚醒時,電路的擾動要比上電時小得多,起振變得很不容易。在振蕩回路中,晶振既不能過激勵(容易振到高次諧波上)也不能欠激勵(不容易起振)。晶振的選擇至少必須考慮諧振頻點、負載電容、激勵功率、溫度特性、長期穩定性。
如何選擇晶振電容
(1)因為每一種晶振都有各自的特性,所以最好按芯片制造廠商所提供的數值選擇外部元器件。
(2)電容值小,容易起振;但過小,振蕩器容易不穩定。電容值大,有利于振蕩器的穩定;但過大,將會增加起振時間,不容易起振。一般選擇合適的中間值。