楊 宇
(昆明冶金高等??茖W校電氣與機械學院,云南 昆明 650033)
現(xiàn)在市面上常用的單片機可以分為兩大類:基礎性能單片機和高性能單片機?;A性能單片機中最常用的就是51單片機,它是眾多單片機學習者進行入門學習的首選。但隨著社會的發(fā)展、科技的進步,單片機需要具備更強的性能和更低的功耗,51單片機已經不能滿足一些新的要求。高性能單片機的出現(xiàn)彌補了51單片機的不足,在眾多的高性能單片機中,STM32憑借其在開發(fā)方式、技術支持、性價比等方面的優(yōu)勢,成為了市場占有率最高的一種高性能單片機。
對于許多具有51單片機基礎的學習者,繼續(xù)學習STM32可以說是一種必然趨勢。但由于種種原因,很多人的STM32學習之路都半途而廢,因為普遍認為學習STM32難度太大。究其原因,筆者認為他們只是單純地學習STM32,而沒有將51單片機和STM32結合起來學習。本文正是以此為出發(fā)點,將STM32的基本開發(fā)方式——寄存器編程,與51單片機的寄存器編程進行比較和分析,使學習者能更好地理解STM32的寄存器編程。
本文主要闡述51單片機和STM32對GPIO(General Purpose Input Output,通用型輸入輸出端口)的操作原理,以分別用這2種單片機點亮一個LED(發(fā)光二極管)為實例來比較和分析2種寄存器編程方式的異同。本實例中51單片機采用的型號為AT89C51, STM32采用的型號為STM32F103R6。AT89C51通過引腳 P 2.0 連接發(fā)光二極管,輸出低電平點亮發(fā)光二極管,如圖1所示;STM32F103R6通過引腳 PC 0 連接發(fā)光二極管,輸出低電平點亮發(fā)光二極管,如圖2所示。
圖1 AT89C51驅動LED原理圖 圖2 STM32F103R6驅動LED原理圖Fig.1 Schematic diagram of AT89C51 Fig.2 Schematic diagram of STM32F103R6
AT89C51和STM32F103R6的程序開發(fā)都是以創(chuàng)建項目的形式來完成,AT89C51驅動發(fā)光二極管的項目文件如圖3所示,STM32F103R6驅動發(fā)光二極管的項目文件如圖4所示。2個項目都包括3種文件:啟動程序文件、主程序文件和頭文件。本文首先對2個項目的啟動程序文件和頭文件進行比較,再對主程序文件進行對比。
圖3 AT89C51驅動LED項目文件 圖4 STM32F103R6驅動LED項目文件Fig.3 Project files of AT89C51 Fig.4 Project files of STM32F103R6
2個項目都具有啟動程序文件,AT89C51的啟動程序文件名稱為STARTUP.A51, STM32F103R6的啟動程序文件名稱為startup_stm32f10x_hd.s。兩者的作用相同:當單片機上電啟動時,首先會執(zhí)行啟動程序,從而建立起執(zhí)行主程序的運行環(huán)境。并且兩者都采用匯編語言編寫,但文件后綴名不同。兩者的主要區(qū)別是,STARTUP.A51文件是單片機開發(fā)軟件(比如Keil c51)自帶的;而startup_stm32f10x_hd.s文件是單片機制造商ST(意法半導體)官方提供的,用戶需要從官方固件庫中找到該文件,并添加到自己的編程里。
2個項目都具有頭文件,AT89C51的頭文件名稱為reg51.h, STM32F103R6的頭文件名稱為stm32f10x.h。兩者的作用相同:用于存放寄存器映射的程序,為主程序中對寄存器編程做準備;并且兩者都采用C語言編寫,文件后綴名也相同。兩者的主要區(qū)別是,reg51.h文件是單片機開發(fā)軟件(比如Keil c51)自帶的,而stm32f10x.h文件需要用戶創(chuàng)建。
圖5 AT89C51驅動LED主程序Fig.5 Main file of AT89C51
圖6 STM32F103R6驅動LED主程序Fig.6 Main file of STM32F103R6
2個項目中的主程序文件名稱均為main.c,AT89C51驅動發(fā)光二極管的主程序如圖5所示,STM32F103R6驅動發(fā)光二極管的主程序如圖6所示。2個主程序的作用相同:都是對單片機的GPIO進行操作,使單片機輸出相應的信號。它們的主要區(qū)別在于STM32F103R6對GPIO的操作比AT89C51對GPIO的操作更復雜。從圖5可以看出,AT89C51對GPIO的操作很簡單,只需要直接對端口寄存器P2賦值就可以使單片機的 P 2.0 引腳輸出低電平。STM32F103R6對GPIO的操作需要開啟端口時鐘以及配置端口寄存器CRL和ODR,如圖6所示,首先開啟GPIOC端口時鐘,接著對GPIOC_CRL寄存器中的相關位清零;然后設置GPIOC_CRL寄存器將PC0引腳配置為推挽輸出;最后設置GPOIC_ODR寄存器讓PC0引腳輸出需要的電平。此外,STM32F103R6對GPIO操作還需要編寫系統(tǒng)初始化函數(shù),如圖4中的SystemInit(),用于初始化系統(tǒng)時鐘,AT89C51對GPIO的操作則不需要該函數(shù)。
由于51單片機的寄存器編程和STM32的寄存器編程既有相同點又有差異性,所以將兩者結合起來對比學習比單純學習STM32更容易理解STM32的寄存器編程原理。STM32的編程方式分為基礎的寄存器編程和高階的固件庫編程,固件庫編程也是STM32領先于其他高性能單片機的一大優(yōu)勢,很多人想學但學不好STM32的固件庫編程,其實是沒有打好寄存器編程的基礎。通過本文的方法對理解STM32的寄存器編程及后續(xù)學習固件庫編程會有很大幫助。