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