沈鎬哲
(紹興文理學(xué)院數(shù)理信息學(xué)院,浙江紹興,312000)
關(guān)鍵字:STM32;Cortex-M;常用外設(shè)驅(qū)動開發(fā);應(yīng)用拓展
科技發(fā)展日益迅猛,具有低成本、低功耗、高性能、可裁剪、功能多等優(yōu)勢ARM結(jié)構(gòu)的STM32系列單片機(jī)成為市場主流的芯片。STM32是意法半導(dǎo)體公司比較早推向市場的基于Cortex-M內(nèi)核的微處理器系列產(chǎn)品,該系列具有許多優(yōu)勢,滿足市場的需求。STM32系列形成芯片家族,用戶可根據(jù)工程需要選擇,受到大眾的廣泛好評。STM32的開發(fā)一般用固件庫或者寄存器的開發(fā)方式,STM32的內(nèi)核是ARM公司設(shè)計(jì)的處理器體系架構(gòu)。ST公司或其它芯片生產(chǎn)廠商如TI,負(fù)責(zé)設(shè)計(jì)的是在內(nèi)核之外的部件,被稱為核外外設(shè)或片上外設(shè)、設(shè)備外設(shè)。STM32的常用外設(shè)與傳統(tǒng)的51單片機(jī)類似,網(wǎng)絡(luò)資源比較豐富,但資源較為零散且代碼形式參差不齊,缺少統(tǒng)一開發(fā)整理。本次課題將常用的STM32驅(qū)動程序開發(fā)、調(diào)試完全,并且成體系收集、整理好,可供學(xué)生實(shí)驗(yàn)、課程設(shè)計(jì)、學(xué)科競賽、學(xué)生科研使用,對本行業(yè)的軟硬件工程師開展工作也有一定的幫助。
本課題選用STM32F103ZET6為目標(biāo)CPU,其配置強(qiáng)大、資源豐富,為外設(shè)的開發(fā)提供了良好的條件。STM32F103ZET6具有 FLASH、SRAM、定時器、DMA、SPI、IIC、ADC、DAC以及FSMC等功能。STM32F103ZET6常用的外設(shè)有按鍵、顯示器、AD與DA轉(zhuǎn)換器、EEPROM、時鐘芯片、溫度傳感器、語言模塊等。STM32擴(kuò)展的外設(shè)需要一個完整的外設(shè)庫結(jié)構(gòu)加以管理。本課題常用外設(shè)開發(fā)做到只需添加需要的外設(shè)到相應(yīng)的文件夾即可調(diào)用使用。
驅(qū)動程序主要包含以下幾個工程文件:USER、HARD WARE、STSTEM、CORE、FWLib。其 中,USER文 件 下 存 放main.c、stm32f10x_it.c、system_stm32f10x.c這些文件,HARDWARE文件夾下存放相關(guān)外設(shè)的.c文件,SYSTEM文件下一般存放delay.c、sys.c、usart.c文件,CORE文件夾下存放內(nèi)核和不同容量開發(fā)板的啟動文件,F(xiàn)WLib文件夾存放misc.c、stm32f10x_xxx.c文件。這些文件夾功能不同,使用者想外設(shè)驅(qū)動開發(fā),應(yīng)在相應(yīng)文件下添加文件。這能使文件分類清晰明了,使用方便,可作為工程模板。下圖1以LCD為例說明驅(qū)動程序結(jié)構(gòu)。
圖1 LCD的驅(qū)動程序結(jié)構(gòu)
以下舉幾個常用外設(shè)驅(qū)動的例子,說明外設(shè)驅(qū)動庫的結(jié)構(gòu)。最簡單的例子為跑馬燈,除USER和SYSTEM文件與上述一致而無需改變外,首先需要在HARDWARE文件夾下添加led.c文件,其次在CORE文件夾下放core_cm3.c內(nèi)核文件和startup_stm32f10x_hd.s高容量的STM32啟動文件,最后在FWLIB文件下添加misc.c、stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c文件。其中,led.c文件需要自己編寫,文件內(nèi)的初始化函數(shù)需要修改引腳模式等參數(shù)。這樣跑馬燈的驅(qū)動程序結(jié)構(gòu)就完成了。再如OLED顯示程序,只需要在跑馬燈驅(qū)動程序基礎(chǔ)上于HARDWARE文件夾下添加oled.c文件,同樣oled.c文件內(nèi)的函數(shù)需要自己編寫修改,這樣便能完成OLED顯示程序。當(dāng)外設(shè)比較高級時,需要在FWLIB中添加文件。例如使用紅外遙控外設(shè),在工程模板基礎(chǔ)上,在HARDWARE文件夾下添加remote.c文件并在FWLIB文件夾下添加stm32f10x_tim.c文件。在FWLIB文件夾下添加stm32f10x_tim.c文件是因?yàn)榧t外遙控需要使用輸入捕獲。與前述外設(shè)相同,需要自行編寫remote.c文件。
STM32的常用外設(shè)數(shù)量較多、較復(fù)雜,而且外設(shè)之間經(jīng)常需要配合使用,直接操作寄存器不太方便,所以常用外設(shè)驅(qū)動程序的開發(fā)讓人更容易理解使用STM32。下面以LCD、時鐘芯片、無線通信模塊為例,介紹STM32的外設(shè)驅(qū)動程序開發(fā)成果。
TFTLCD即薄膜晶體管液晶顯示器。薄膜晶體管液晶顯示器具有重量輕、平板化、低功耗、無輻射、顯示品質(zhì)優(yōu)良等特點(diǎn),其應(yīng)用領(lǐng)域正在逐步擴(kuò)大。本課題選用2.8寸的ALIENTEK TFTLCD模塊,該模塊支持65K色顯示,顯示分辨率為320×240,接口為16位的80并口,屏幕可觸摸。下圖2是LCD及拓展外設(shè)開發(fā)流程圖。
圖2 LCD及拓展外設(shè)開發(fā)流程圖
本課題的TFTLCD顯示由FSMC接口控制,以下為FSMC相關(guān)的介紹。FSMC為靈活靜態(tài)存儲控制器,能夠與存儲器和PC存儲卡相連,其接口支持SRAM、NAND FLASH、NOR FLASH和PSRAM等存儲器。STM32的FSMC分為3類外設(shè):NOR/PSRAM設(shè)備、NAND設(shè)備、PC卡設(shè)備。這些設(shè)備之間用不同的CS區(qū)分,TFTLCD用的就是FSMC_NE4,將TFTLCD視為SRAM。外部SRAM的控制有:地址線、數(shù)據(jù)線、寫信號、讀信號、片選。而TFTLCD也有類似的操作時序,包含RS、WR、RD、CS等。因此,TFTLCD由FSMC接口控制完全可行,且TFTLCD的初始化函數(shù)與FSMC的三個寄存器有關(guān),通過配置FSMC的寄存器即可驅(qū)動LCD。FSMC有3類外設(shè),分別對應(yīng)3個初始化函數(shù),而這3個初始化函數(shù)內(nèi)初始化了FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx三個寄存器。通過編寫3個初始化函數(shù),即可分別控制3類外設(shè)。下圖3為LCD與芯片接口電路圖。
圖3 LCD與芯片接口電路圖
與STM32配合使用的時鐘芯片有DS3231、PCF8563、DS1302等,本課題選擇DS3231時鐘芯片。DS3231是一種低成本、高精度的IIC時鐘芯片,集成了TCXO和晶體。DS3231時鐘芯片具有IIC接口,地址與數(shù)據(jù)通過IIC雙向總線串行傳輸,傳輸速度達(dá)400kHz。本課題選用DS3231芯片,該芯片可直接與STM32的IIC外設(shè)模塊引腳相連,使用方便。STM32F103ZET6與DS3231芯片相對應(yīng)的引腳連接需4根線,除VCC和GND與相對應(yīng)連接外,只需PB6與DS3231的SCL、PB7與DS3231的SDA連接,占用引腳較少。
由于DS3231時鐘芯片用到的是IIC總線,所以相關(guān)的外設(shè)程序開發(fā)都與IIC相關(guān)。以下介紹IIC相關(guān)函數(shù),了解了IIC相關(guān)函數(shù)不僅學(xué)會如何使用DS3231時鐘芯片,更能快速了解使用有關(guān)IIC的外設(shè)。首先應(yīng)在stm32f10x_conf.h文件內(nèi)包含相應(yīng)的頭文件,在這個文件內(nèi)可以一鍵包含所有已列的文件,這樣比較便捷,不必每次再去添加。其次在主函數(shù)內(nèi)加入相應(yīng)頭文件并初始化IIC、DS3231時鐘芯片,這便能使用固件庫內(nèi)的函數(shù)。其中,IIC相關(guān)的函數(shù)有初始化 I2C_init()、使能 I2C_Cmd()、I2C_Write1Byte()、I2C_Read1Byte()等。I2C_init()函數(shù)用于設(shè)置相應(yīng)的IO、模式、速率這些參數(shù)。以下是DS3231時鐘與IIC總線結(jié)合實(shí)例,主要對DS3231.c文件的編寫。第一步文件內(nèi)應(yīng)包含相應(yīng)的DS3231.h和IIC.h頭文件,這兩個頭文件主要包含預(yù)定義和函數(shù)申明。接下來最重要的是DS3231時鐘初始化函數(shù)DS3231_init(),函數(shù)內(nèi)部主要是IIC初始化函數(shù)IIC_init(),而IIC初始化函數(shù)上述已說明。此外,DS3231.c文件內(nèi)還包含DS3231讀寫函數(shù)、設(shè)定與讀取時間函數(shù)。而DS3231的讀寫需要用到IIC相關(guān)的函數(shù),比如IIC的啟動函數(shù)IIC_Start()、IIC發(fā)送字節(jié)函數(shù)IIC_Send_Byte()。編寫完上述內(nèi)容,時鐘芯片相關(guān)文件就完成了。STM32程序在主函數(shù)內(nèi)調(diào)用外設(shè)的.c文件便可使用外設(shè)。當(dāng)需要使用DS3231時,在主函數(shù)內(nèi)調(diào)用DS3231_init()函數(shù)以完成DS3231的初始化,再調(diào)用DS3231_Set()函數(shù)完成時間設(shè)置,while循環(huán)內(nèi)更新時間。
DS3231時鐘芯片用到的IIC總線可擴(kuò)展其他的外設(shè),例如OLED顯示屏、MAX30102、MAX30205等。因此,通過DS3231時鐘芯片的開發(fā)使用,即可了解IIC總線的內(nèi)容,進(jìn)而又可快速入門有關(guān)IIC總線的外設(shè)。
與STM32連接使用的無線通信模塊有NRF24L01、ME3630-C3B、ATK-GM510等。本課題選用NRF24L01無線通信模塊,具有不錯的穩(wěn)定性。NRF24L01是2.4G無線通信模塊,最高速度達(dá)2Mbps,抗干擾能力強(qiáng),滿足多點(diǎn)通信的需求。下圖4是NRF24L01的電路圖。
圖4 NRF24L01的電路圖
NRF24L01與STM32通過SPI通信,而SPI的速度最高可達(dá)18MHz,能夠?qū)崿F(xiàn)無線快速傳輸。NRF24L01的使用要先初始化,函數(shù)為NRF24L01_Init(),函數(shù)內(nèi)部初始化相應(yīng)的引腳及其參數(shù)。此外,該函數(shù)還應(yīng)初始化SPI并設(shè)置相應(yīng)參數(shù)。初始化完成之后還應(yīng)用函數(shù)NRF24L01_Check()檢測無線通信模塊是否存在。上述步驟完成之后,即可在主函數(shù)循環(huán)內(nèi)設(shè)置NRF24L01的模式,這兩種模式分別完成收發(fā)。同時,NRF24L01的通信可以配合LCD顯示結(jié)果。以下介紹SPI通信以及其外設(shè)拓展。SPI即串行外圍設(shè)備接口,主要應(yīng)用在EEPROM、FLASH、AD轉(zhuǎn)換器等外設(shè)上。SPI是高速、同步、全雙工的通信總線,只使用MISO、MOSI、SCLK、CS這四條線,使用方便。SPI以主從方式工作,一個主設(shè)備可以和一個或多個從設(shè)備通信,所以多個外設(shè)可與SPI相連以實(shí)現(xiàn)多個功能。SPI總線的應(yīng)用有以下幾個基本步驟:連接SPI外設(shè)時鐘、連接被復(fù)用的IO外設(shè)時鐘、設(shè)置IO為推挽輸出、調(diào)用初始化函數(shù)設(shè)置工作模式、使能SPI、收發(fā)數(shù)據(jù)。應(yīng)用在STM32上的常用外設(shè)有OLED、W25Q128等,這些外設(shè)只需按上述步驟操作即能使用。例如驅(qū)動FLASH芯片W25Q128,不僅需要初始化使能端口,還應(yīng)初始化SPI時鐘。初始化完成之后,應(yīng)配置工作模式并使能SPI。上述完成之后便可進(jìn)行對W25Q128操作。
通過STM32常用外設(shè)驅(qū)動程序的開發(fā),初學(xué)者將更加容易上手使用STM32,提高了學(xué)習(xí)效率,而工程師能提高工作效率。STM32常用外設(shè)驅(qū)動程序的開發(fā)開拓應(yīng)用領(lǐng)域,更是推動了單片機(jī)的更新和換代。
MVG推出用于全尺寸汽車天線測量的多探頭測量系統(tǒng)SG 3000M
無線連接測試專家MVG近日宣布推出多探頭測量系統(tǒng)SG 3000M。SG 3000M專為全尺寸汽車天線測量和OTA測試而設(shè)計(jì),可將現(xiàn)有吸波暗室升級為用于互聯(lián)車輛的天線測量和OTA測試設(shè)備。
SG 3000M的MV-Scan多探頭技術(shù)和嵌入式過采樣功能可確保準(zhǔn)確、高效的天線測量。其寬頻帶覆蓋范圍從200MHz到10GHz,使其能夠支持開發(fā)汽車連接性大多數(shù)現(xiàn)有的端到端測試協(xié)議。