STM32自學(xué)筆記詳解_第1頁(yè)
STM32自學(xué)筆記詳解_第2頁(yè)
STM32自學(xué)筆記詳解_第3頁(yè)
STM32自學(xué)筆記詳解_第4頁(yè)
STM32自學(xué)筆記詳解_第5頁(yè)
已閱讀5頁(yè),還剩488頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

STM32自學(xué)筆記詳解目錄\h第1章什么是STM32\h1.1從Cortex-M3說(shuō)起\h1.2STM32面面觀\h第2章杰出的源泉——ARMCortex-M3內(nèi)核架構(gòu)\h2.1ARM架構(gòu)回顧\h2.2Cortex-M3CPU:核心中的核心\h2.2.1管道\h2.2.2編程模型\h2.2.3Cortex-M3CPU的運(yùn)行模式\h2.2.4Thumb-2指令集\h2.2.5非對(duì)齊存取接口\h2.3Cortex-M3處理器——不只是個(gè)處理器\h2.3.1總線\h2.3.2總線矩陣\h2.3.3存儲(chǔ)映射\h2.3.4位帶的概念\h2.3.5系統(tǒng)節(jié)拍定時(shí)器\h2.3.6中斷處理\h2.3.7嵌套中斷向量控制器\h2.4低功耗的新期待\h2.4.1進(jìn)入低功耗模式\h2.4.2CoreSight調(diào)試組件\h第3章歡迎來(lái)到STM32的世界\h3.1讓STM32跑起來(lái)\h3.1.1引腳分布和封裝尺寸\h3.1.2電源的供應(yīng)方案\h3.1.3復(fù)位電路\h3.1.4一個(gè)典型的STM32最小系統(tǒng)\h3.1.5時(shí)鐘源的選擇\h3.1.6啟動(dòng)引腳和ISP編程\h3.1.7調(diào)試端口\h3.2認(rèn)識(shí)真正的STM32\h3.2.1存儲(chǔ)區(qū)映射\h3.2.2性能最大化\h3.3豐富多樣的外部設(shè)備\h3.3.1通用設(shè)備單元\h3.3.2通信接口\h3.4STM32也論低功耗\h3.4.1運(yùn)行模式\h3.4.2幾種低功耗模式\h3.4.3調(diào)試支持特性\h3.5為STM32保駕護(hù)航\h3.5.1一些安全特性\h3.5.2復(fù)位控制\h3.5.3電源檢測(cè)\h3.5.4時(shí)鐘安全系統(tǒng)\h3.5.5看門(mén)狗\h3.5.6外設(shè)的安全特性\h3.6高性能內(nèi)置Flash模塊\h3.6.1內(nèi)置Flash安全特性和編程方法\h3.6.2選項(xiàng)字節(jié)\h第4章百花齊放的開(kāi)發(fā)工具\(yùn)h4.1開(kāi)發(fā)平臺(tái)\h4.2固件庫(kù)和協(xié)議棧\h4.3實(shí)時(shí)操作系統(tǒng)RTOS\h4.4KeilMDK使用入門(mén)\h4.4.1KeilMDK的安裝與工程建立\h4.4.2使用KeilMDK進(jìn)行STM32的程序開(kāi)發(fā)\h第5章STM32基礎(chǔ)實(shí)驗(yàn)\h5.1先用GPIO來(lái)點(diǎn)個(gè)燈吧\h5.1.1概述\h5.1.2實(shí)驗(yàn)設(shè)計(jì)\h5.1.3硬件電路\h5.1.4程序設(shè)計(jì)\h5.1.5程序清單\h5.1.6注意事項(xiàng)\h5.1.7使用到的庫(kù)函數(shù)一覽\h5.1.8實(shí)驗(yàn)結(jié)果\h5.1.9小結(jié)\h5.2簡(jiǎn)約而不簡(jiǎn)單的SysTick定時(shí)器\h5.2.1概述\h5.2.2實(shí)驗(yàn)設(shè)計(jì)和硬件電路\h5.2.3程序設(shè)計(jì)\h5.2.4程序清單\h5.2.5使用到的主要庫(kù)函數(shù)一覽\h5.2.6注意事項(xiàng)\h5.2.7實(shí)驗(yàn)結(jié)果\h5.2.8小結(jié)\h5.3使用GPIO和SysTick定時(shí)器實(shí)現(xiàn)按鍵掃描\h5.3.1概述\h5.3.2實(shí)驗(yàn)設(shè)計(jì)\h5.3.3硬件電路\h5.3.4程序設(shè)計(jì)\h5.3.5程序清單\h5.3.6注意事項(xiàng)\h5.3.7實(shí)驗(yàn)結(jié)果\h5.3.8小結(jié)\h5.4通過(guò)串口和PC說(shuō)聲Hello\h5.4.1概述\h5.4.2實(shí)驗(yàn)設(shè)計(jì)\h5.4.3硬件電路\h5.4.4程序設(shè)計(jì)\h5.4.5程序清單\h5.4.6使用到的庫(kù)函數(shù)一覽\h5.4.7注意事項(xiàng)\h5.4.8實(shí)驗(yàn)結(jié)果\h5.4.9小結(jié)\h5.5風(fēng)吹草動(dòng)也不放過(guò)——NVIC和外部中斷\h5.5.1概述\h5.5.2實(shí)驗(yàn)設(shè)計(jì)\h5.5.3硬件電路\h5.5.4程序設(shè)計(jì)\h5.5.5程序清單\h5.5.6使用到的庫(kù)函數(shù)\h5.5.7注意事項(xiàng)\h5.5.8實(shí)驗(yàn)結(jié)果\h5.5.9小結(jié)\h5.6兩只忠誠(chéng)的看門(mén)狗\h5.6.1窗口看門(mén)狗\h5.6.2獨(dú)立看門(mén)狗\h5.7DMA——讓數(shù)據(jù)傳輸更上一層樓\h5.7.1概述\h5.7.2實(shí)驗(yàn)設(shè)計(jì)\h5.7.3硬件電路\h5.7.4程序設(shè)計(jì)\h5.7.5程序清單\h5.7.6使用到的庫(kù)函數(shù)\h5.7.7注意事項(xiàng)\h5.7.8實(shí)驗(yàn)結(jié)果\h5.7.9小結(jié)\h5.8BKP寄存器與入侵檢測(cè)—廉價(jià)的掉電存儲(chǔ)與防拆解方案\h5.8.1概述\h5.8.2實(shí)驗(yàn)設(shè)計(jì)\h5.8.3硬件電路\h5.8.4程序設(shè)計(jì)\h5.8.5程序清單\h5.8.6使用到的庫(kù)函數(shù)一覽\h5.8.7注意事項(xiàng)\h5.8.8實(shí)驗(yàn)結(jié)果\h5.8.9小結(jié)\h5.9利用RTC實(shí)現(xiàn)一個(gè)萬(wàn)年歷\h5.9.1概述\h5.9.2實(shí)驗(yàn)設(shè)計(jì)\h5.9.3硬件電路\h5.9.4程序設(shè)計(jì)\h5.9.5程序清單\h5.9.6使用到的庫(kù)函數(shù)\h5.9.7注意事項(xiàng)\h5.9.8實(shí)驗(yàn)結(jié)果\h5.9.9小結(jié)\h5.10挑戰(zhàn)STM32的低功耗設(shè)計(jì)\h5.10.1概述\h5.10.2實(shí)驗(yàn)設(shè)計(jì)\h5.10.3硬件電路\h5.10.4程序設(shè)計(jì)\h5.10.5程序清單\h5.10.6使用到的庫(kù)函數(shù)\h5.10.7注意事項(xiàng)\h5.10.8實(shí)驗(yàn)結(jié)果\h5.10.9小結(jié)\h5.11STM32有一雙眼睛叫ADC\h5.11.1概述\h5.11.2實(shí)驗(yàn)設(shè)計(jì)\h5.11.3硬件電路\h5.11.4程序設(shè)計(jì)\h5.11.5程序清單\h5.11.6使用到的庫(kù)函數(shù)\h5.11.7注意事項(xiàng)\h5.11.8實(shí)驗(yàn)結(jié)果\h5.11.9小結(jié)\h5.12通用定時(shí)器的應(yīng)用\h5.12.1概述\h5.12.2時(shí)基單元\h5.12.3比較輸出\h5.12.4PWM輸出\h5.12.5PWM輸入捕獲\h5.12.5本節(jié)使用到的庫(kù)函數(shù)\h5.12.6小結(jié)\h5.13嵌入式Flash的讀/寫(xiě)\h5.13.1概述\h5.13.2實(shí)驗(yàn)設(shè)計(jì)\h5.13.3硬件電路\h5.13.4程序設(shè)計(jì)\h5.13.5程序清單\h5.13.6程序所使用到的庫(kù)函數(shù)\h5.13.7注意事項(xiàng)\h5.13.8實(shí)驗(yàn)結(jié)果\h5.13.9小結(jié)\h5.14使用SPI接口實(shí)現(xiàn)自通信\h5.14.1概述\h5.14.2實(shí)驗(yàn)設(shè)計(jì)\h5.14.3硬件設(shè)計(jì)\h5.14.4程序設(shè)計(jì)\h5.14.5程序清單\h5.13.6所使用到的庫(kù)函數(shù)\h5.14.7注意事項(xiàng)\h5.14.8實(shí)驗(yàn)結(jié)果\h5.14.9小結(jié)\h5.15I2C接口自通信實(shí)驗(yàn)\h5.15.1概述\h5.15.2實(shí)驗(yàn)設(shè)計(jì)\h5.15.3硬件電路\h5.15.4程序設(shè)計(jì)\h5.15.5程序清單\h5.15.6使用到的庫(kù)函數(shù)\h5.15.7注意事項(xiàng)\h5.15.8實(shí)驗(yàn)結(jié)果\h5.15.9小結(jié)\h5.16來(lái)認(rèn)識(shí)一下CAN總線\h5.16.1概述\h5.16.2實(shí)驗(yàn)設(shè)計(jì)\h5.16.3硬件電路\h5.16.4程序設(shè)計(jì)\h5.16.5程序清單\h5.16.6使用到的庫(kù)函數(shù)\h5.16.7注意事項(xiàng)\h5.16.8實(shí)驗(yàn)結(jié)果\h5.16.9小結(jié)\h第6章STM32進(jìn)階應(yīng)用\h6.1進(jìn)階文章1:IAREWARM的工程建立\h6.2進(jìn)階文章2:STM32的時(shí)鐘樹(shù)\h6.3進(jìn)階文章3:解析STM32的庫(kù)函數(shù)\h6.4進(jìn)階文章4:在STM32平臺(tái)上實(shí)現(xiàn)Cortex-M3的位帶特性\h6.5進(jìn)階文章5:解析STM32的啟動(dòng)過(guò)程\h6.6進(jìn)階文章6:環(huán)形緩沖區(qū)的實(shí)現(xiàn)\h6.7進(jìn)階文章7:軟件定時(shí)器的設(shè)計(jì)\h6.8進(jìn)階文章8:STM32的ISP下載\h6.9進(jìn)階文章9:基于STM32標(biāo)準(zhǔn)外設(shè)固件庫(kù)v3.x的工程建立\h6.10進(jìn)階文章10:使用I/O口實(shí)現(xiàn)模擬I2C接口\h第7章綜合性實(shí)例:STM32的IAP方案\h附錄常用程序第1章

什么是STM32在過(guò)去的數(shù)年里,微控制器設(shè)計(jì)領(lǐng)域里一個(gè)主流的趨勢(shì)是:基于ARM7和ARM9內(nèi)核設(shè)計(jì)通用控制器的CPU。而如今,已經(jīng)有超過(guò)240種基于ARM核心的微控制器從眾多芯片制造商手中誕生。意法半導(dǎo)體(STMicroelectronics,簡(jiǎn)稱(chēng)ST)推出了STM32微控制器,這是ST第一個(gè)基于ARMCortex-M3內(nèi)核的微控制器。STM32的出現(xiàn)將當(dāng)前微控制器的性?xún)r(jià)比水平提升到了新的高度,同時(shí)它在低功耗場(chǎng)合和硬實(shí)時(shí)控制場(chǎng)合中亦能游刃有余。1.1從Cortex-M3說(shuō)起Cortex是ARM公司最新系列的處理器內(nèi)核名稱(chēng),其推出的目的旨在為當(dāng)前對(duì)技術(shù)要求日漸廣泛的市場(chǎng)提供一個(gè)標(biāo)準(zhǔn)的處理器架構(gòu)。和其他ARM處理器內(nèi)核不一樣的是,Cortex系列處理器內(nèi)核作為一個(gè)完整的處理器核心,除了向用戶提供標(biāo)準(zhǔn)CPU處理核心之外,還提供了標(biāo)準(zhǔn)的硬件系統(tǒng)架構(gòu)。Cortex系列分為3個(gè)分支:專(zhuān)為高端應(yīng)用場(chǎng)合而設(shè)的“A”(Application)分支,為實(shí)時(shí)應(yīng)用場(chǎng)合而設(shè)的“R”(Real-time)分支,還有專(zhuān)為對(duì)成本敏感的微控制器應(yīng)用場(chǎng)合而設(shè)的“M”(Microcontroller)分支。STM32微控制器基于“M”分支的Cortex-M3內(nèi)核,是專(zhuān)為實(shí)現(xiàn)系統(tǒng)高性能與低功率消耗并存而設(shè)計(jì)的,同時(shí)它足夠低廉的價(jià)格也向傳統(tǒng)的8位和16位微控制器發(fā)起了有力的挑戰(zhàn)。ARM7和ARM9處理器被成功地整合進(jìn)標(biāo)準(zhǔn)微控制器里的結(jié)果就是出現(xiàn)了各自獨(dú)特的SoC(SystemonChip,也即片上系統(tǒng))。特別從對(duì)異常和中斷的響應(yīng)處理方式上,用戶會(huì)更容易看到這些SoC之間的區(qū)別,因?yàn)槊考倚酒圃焐潭加袑儆谧约旱囊惶捉鉀Q方案。Cortex-M3提出標(biāo)準(zhǔn)化的微控制器核心,在CPU的基礎(chǔ)上又提供了整個(gè)微控制器的核心部分,包括中斷系統(tǒng)、系統(tǒng)節(jié)拍時(shí)鐘、調(diào)試系統(tǒng)以及存儲(chǔ)區(qū)映射。Cortex-M3內(nèi)部的4GB線性地址空間被分為Code區(qū)、SRAM區(qū)、外部設(shè)備區(qū)以及系統(tǒng)設(shè)備區(qū)。和ARM7不同,Cortex-M3處理器基于哈佛體系,擁有多重總線,可以進(jìn)行并行處理,因而提升了整體性能。同時(shí)也和早期的ARM架構(gòu)不同,Cortex-M3處理器允許數(shù)據(jù)非對(duì)齊存取,以確保內(nèi)部的SRAM得到充分地利用。Cortex-M3處理器還可以使用一種稱(chēng)為Bit-banding(譯為“位帶”)的技術(shù),利用兩個(gè)32MB大小的“虛擬”內(nèi)存空間實(shí)現(xiàn)對(duì)兩個(gè)1MB大小的物理內(nèi)存空間進(jìn)行“位”的置位和清除操作。這樣就可以有效地對(duì)設(shè)備寄存器和位于SRAM中的數(shù)據(jù)變量進(jìn)行位操作,而不再需要冗長(zhǎng)的布爾邏輯運(yùn)算過(guò)程。如圖1.1.1所示,STM32的核心Cortex-M3處理器,是一個(gè)標(biāo)準(zhǔn)的微控制器結(jié)構(gòu),擁有32位CPU、并行總線結(jié)構(gòu)、嵌套中斷向量控制單元、調(diào)試系統(tǒng)以及標(biāo)準(zhǔn)的存儲(chǔ)映射。圖1.1.1Cortex-M3處理器內(nèi)部架構(gòu)一覽嵌套中斷向量控制器(NestedVectorInterruptController,簡(jiǎn)稱(chēng)NVIC)是Cortex-M3處理器中一個(gè)比較關(guān)鍵的組件。NVIC為基于Cortex-M3核心的微控制器提供了標(biāo)準(zhǔn)的中斷架構(gòu)和優(yōu)秀的中斷響應(yīng)能力,為超過(guò)240個(gè)中斷源提供專(zhuān)門(mén)的中斷入口,而且可以賦予每個(gè)中斷源單獨(dú)的優(yōu)先級(jí)。利用NVIC可以達(dá)到極快的中斷響應(yīng)速度,從收到中斷請(qǐng)求到執(zhí)行中斷服務(wù)程序的第1條指令所要花費(fèi)的時(shí)間僅僅為12個(gè)時(shí)鐘周期。之所以能實(shí)現(xiàn)這種響應(yīng)速度,一方面得益于Cortex-M3內(nèi)核對(duì)堆棧的自動(dòng)處理機(jī)制,這種機(jī)制是通過(guò)固化在CPU內(nèi)部的微代碼實(shí)現(xiàn)。另一方面,在中斷請(qǐng)求連續(xù)出現(xiàn)的情況下,NVIC使用一種稱(chēng)為“尾鏈”的技術(shù)使連續(xù)而來(lái)的中斷在6個(gè)時(shí)鐘周期之內(nèi)得到服務(wù)。在中斷壓棧階段,更高優(yōu)先級(jí)的中斷可以不耗費(fèi)任何額外的CPU周期就能完成嵌入低優(yōu)先級(jí)中斷的動(dòng)作。Cortex-M3的中斷結(jié)構(gòu)和CPU的低功耗實(shí)現(xiàn)也有緊密的聯(lián)系。用戶可以設(shè)置CPU自動(dòng)進(jìn)入低功耗狀態(tài),而使用中斷來(lái)將其喚醒,CPU在中斷事件來(lái)臨之前會(huì)一直保持睡眠狀態(tài)。Cortex-M3的CPU支持兩種運(yùn)行模式:線程模式(ThreadMode)與處理模式(HandlerMode),并且此兩種模式都擁有各自獨(dú)立的堆棧。這種設(shè)計(jì)使開(kāi)發(fā)人員可以進(jìn)行更為精密的程序設(shè)計(jì),對(duì)實(shí)時(shí)操作系統(tǒng)的支持也更好。Cortex-M3處理器還包含一個(gè)24位的可自動(dòng)重裝載定時(shí)器,可以為實(shí)時(shí)內(nèi)核(RTOS)提供一個(gè)周期性的中斷。ARM7和ARM9處理器都有兩種指令集(32位指令集和16位指令集),而Cortex-M3系列處理器支持新型的ARMThumb-2指令集。由于Thumb-2指令集融合了Thumb指令集和ARM指令集,使32位指令集的性能和16位指令集的代碼密度之間取得了平衡。ARMThumb-2專(zhuān)為C/C++編譯器設(shè)計(jì),這意味著Cortex-M3系列處理器的開(kāi)發(fā)應(yīng)用可以全部在C語(yǔ)言環(huán)境中完成。1.2STM32面面觀盡管ST公司已經(jīng)擁有4個(gè)基于ARM7和ARM9處理器的微控制器產(chǎn)品系列,但是STM32微控制器的推出仍然標(biāo)志著ST在其兩條產(chǎn)品主線(低價(jià)位主線和高性能主線)上都邁出了重大的一步?!皢纹畹蛢r(jià)格低于1歐元!”——STM32的出現(xiàn)伴隨著如此凌厲的口號(hào),對(duì)于市場(chǎng)上現(xiàn)有的8位單片機(jī)而言是一個(gè)嚴(yán)峻的挑戰(zhàn)。STM32最初發(fā)布的時(shí)候共推出14個(gè)不同的型號(hào),它們被分為兩個(gè)版本:最高CPU時(shí)鐘為72MHz的“增強(qiáng)型”和最高CPU時(shí)鐘為36MHz的“基本型”。不同版本的STM32器件之間在引腳功能和應(yīng)用軟件上是兼容的。這些不同的STM32型號(hào)里內(nèi)置Flash最大可達(dá)128KB,SRAM最大為20KB。而且在STM32最初發(fā)布之時(shí),配備更大Flash、RAM容量和更多復(fù)雜外設(shè)的版本就已經(jīng)在規(guī)劃之中了。圖1.2.1和圖1.2.2顯示了“增強(qiáng)型”和“基本型”的STM32在結(jié)構(gòu)組成上的區(qū)別。圖1.2.1增強(qiáng)型STM32結(jié)構(gòu)一覽圖1.2.2基本型STM32結(jié)構(gòu)一覽1.精密性乍一看STM32的設(shè)備配備,就像一個(gè)典型的單片機(jī),配備常見(jiàn)的外設(shè)諸如多通道ADC、通用定時(shí)器、I2C總線接口、SPI總線接口、CAN總線接口、USB控制器、實(shí)時(shí)時(shí)鐘RTC等。然而,它的每一個(gè)設(shè)備都是非常有特點(diǎn)的,如12位精度的ADC具備多種轉(zhuǎn)換模式,并帶有一個(gè)內(nèi)部溫度傳感器,帶有雙ADC的STM32器件,還可以使兩個(gè)ADC同時(shí)工作,從而衍生出更為高級(jí)的9種轉(zhuǎn)換模式。如STM32的每一個(gè)定時(shí)器都具備4個(gè)捕獲比較單元,而且每個(gè)定時(shí)器都可以和另外的定時(shí)器聯(lián)合工作以生成更為精密的時(shí)序;如STM32有專(zhuān)門(mén)為電機(jī)控制而設(shè)的高級(jí)定時(shí)器,帶有6個(gè)死區(qū)時(shí)間可編程的PWM輸出通道,同時(shí)其帶有的緊急制動(dòng)通道可以在異常情況出現(xiàn)時(shí),強(qiáng)迫PWM信號(hào)輸出保持在一個(gè)預(yù)定好的安全狀態(tài);如SPI接口設(shè)備含有一個(gè)硬件CRC單元,支持8位字節(jié)和16位半字?jǐn)?shù)據(jù)的CRC計(jì)算,在對(duì)SD或MMC等存儲(chǔ)介質(zhì)進(jìn)行數(shù)據(jù)存取時(shí)相當(dāng)有用。令人稱(chēng)奇的是,STM32還包含了7個(gè)DMA通道。每個(gè)通道都可以用來(lái)在設(shè)備與內(nèi)存之間進(jìn)行8位、16位或32位數(shù)據(jù)的傳輸。每個(gè)設(shè)備都可以向DMA控制器請(qǐng)求發(fā)送或接收數(shù)據(jù)。STM32內(nèi)部總線仲裁器和總線矩陣將CPU數(shù)據(jù)接口和DMA通道之間的連接大大地簡(jiǎn)化了,這意味著DMA單元是很靈活的,其使用方法簡(jiǎn)單,足以應(yīng)付微控制器應(yīng)用中常見(jiàn)的數(shù)據(jù)傳輸需求。為了在具備高性能表現(xiàn)的同時(shí)保持低功耗特性,STM32微控制器在低功耗方面也做了不少努力。它可以在2V供電的情況下運(yùn)行,同時(shí)在所有設(shè)備打開(kāi)且運(yùn)行在滿速72MHz主頻的情況下,也僅消耗36mA的電流;在與Cortex-M3內(nèi)核的低功耗模式結(jié)合之后只有最低達(dá)2μA的電流消耗。即便外部振蕩器處在待啟動(dòng)狀態(tài),STM32使用內(nèi)部8MHz的RC振蕩器也可以迅速地退出低功耗模式。這種快速進(jìn)出低功耗模式的特性,更進(jìn)一步降低了STM32微控制器的整體功率消耗,同時(shí)能仍然保持器件整體的高性能。2.可靠性當(dāng)代的電子應(yīng)用領(lǐng)域,對(duì)處理器處理能力的要求越來(lái)越高,需要越來(lái)越多的精密外設(shè),同時(shí)對(duì)處理器的運(yùn)行可靠性要求也越來(lái)越高。出于對(duì)可靠性的考慮,STM32配備了一系列的硬件來(lái)支持對(duì)可靠性有高度要求的應(yīng)用。這些硬件包括一個(gè)低電壓檢測(cè)器、一個(gè)時(shí)鐘安全管理系統(tǒng)和兩個(gè)看門(mén)狗定時(shí)器。時(shí)鐘管理系統(tǒng)可以檢測(cè)到外部主振蕩器的失效,并隨即安全地將STM32內(nèi)部8MHz的RC振蕩器切換為主時(shí)鐘源。兩個(gè)看門(mén)狗定時(shí)器中的一個(gè)稱(chēng)為窗口看門(mén)狗。窗口看門(mén)狗必須在事先定義好的時(shí)間上下限到達(dá)之前刷新,如果過(guò)早或過(guò)晚地刷新它,都將觸發(fā)窗口看門(mén)狗復(fù)位。第2個(gè)看門(mén)狗稱(chēng)為獨(dú)立看門(mén)狗。獨(dú)立看門(mén)狗使用外部振蕩器驅(qū)動(dòng),該振蕩器與主系統(tǒng)時(shí)鐘是相互獨(dú)立的,這樣即便STM32的主系統(tǒng)時(shí)鐘崩潰,獨(dú)立看門(mén)狗也能“力挽狂瀾”。3.安全性當(dāng)代電子設(shè)計(jì)行業(yè)中,一個(gè)令人感到比較無(wú)奈的現(xiàn)實(shí)是,開(kāi)發(fā)人員不得不想方設(shè)法提高代碼的安全性以防止被破解人員盜取。STM32可以鎖住其內(nèi)部Flash而使得破解人員無(wú)法通過(guò)調(diào)試端口讀取其內(nèi)容。當(dāng)Flash的讀保護(hù)功能開(kāi)啟之后,其寫(xiě)保護(hù)功能也就隨之開(kāi)啟了。寫(xiě)保護(hù)功能常用于防止一些來(lái)歷不明的代碼寫(xiě)入中斷向量表。但寫(xiě)保護(hù)不僅可以保護(hù)中斷向量表,還可以更進(jìn)一步地將其保護(hù)范圍延伸到整個(gè)Flash中未被使用的區(qū)域。STM32還有一小塊電池備份RAM區(qū),這塊RAM區(qū)域?qū)?yīng)一個(gè)入侵檢測(cè)引腳應(yīng)用,當(dāng)這個(gè)引腳上產(chǎn)生電平變化時(shí),STM32會(huì)認(rèn)為遭遇了入侵事件,隨即自動(dòng)將電池備份RAM區(qū)的內(nèi)容全部清除。4.軟件開(kāi)發(fā)支持許多開(kāi)發(fā)工具早已在不知不覺(jué)間支持Thumb-2指令集和STM32系列。但倘若尚未支持,開(kāi)發(fā)人員也只是需要將軟件升級(jí)一下即可獲得對(duì)Thumb-2指令集和STM32的支持。ST公司同時(shí)還為開(kāi)發(fā)人員提供了一個(gè)設(shè)備驅(qū)動(dòng)固件庫(kù)和一個(gè)USB開(kāi)發(fā)應(yīng)用庫(kù),以方便開(kāi)發(fā)人員調(diào)用。當(dāng)然在一些早期微控制器比如STR7和STR9時(shí)期,已經(jīng)發(fā)布的ANSIC庫(kù)和源代碼對(duì)于STM32來(lái)說(shuō)也是可移植的。這些程序接口已經(jīng)在許多流行的編譯工具上進(jìn)行整合了。相似地,許多開(kāi)源的或商用的RTOS,還有一些中間件(比如TCP/IP棧、文件系統(tǒng))對(duì)于STM32系列控制器器來(lái)說(shuō)同樣都是可用的。Cortex-M3還將一個(gè)全新的調(diào)試系統(tǒng)CoreSight帶給用戶,用戶可以使用標(biāo)準(zhǔn)的JTAG接口或雙線串行接口通過(guò)調(diào)試端口(DebugAccessPort)實(shí)現(xiàn)和CoreSight系統(tǒng)的對(duì)接。除了提供調(diào)試運(yùn)行控制服務(wù)之外,STM32上的CoreSight還提供斷點(diǎn)數(shù)據(jù)查看功能以及一個(gè)指令跟蹤器。指令跟蹤器可以將用戶選擇的應(yīng)用信息上傳到調(diào)試工具里,從而可以為用戶提供額外的調(diào)試信息,并且它在軟件運(yùn)行期間同樣可以使用。5.STM32的分支:增強(qiáng)型和基本型STM32的型號(hào)系列被分為兩個(gè)分支:增強(qiáng)型和基本型。如圖1.2.3所示,增強(qiáng)型配備完整的外設(shè),同時(shí)CPU可以在最高達(dá)72MHz的主頻下運(yùn)行?;拘团鋫鋽?shù)量較少的外設(shè),同時(shí)最高CPU主頻為36MHz。但尤為重要的是,無(wú)論是增強(qiáng)型還是基本型,它們的封裝類(lèi)型和引腳分布是完全一致的,如圖1.2.4所示。這個(gè)特點(diǎn)可以讓開(kāi)發(fā)人員在使用STM32系列微控制器的時(shí)候,不必改動(dòng)PCB就可以隨意更換器件型號(hào)。圖1.2.3STM32增強(qiáng)型與基本型性能對(duì)比圖1.2.4STM32產(chǎn)品線分布圖第2章

杰出的源泉——ARMCortex-M3內(nèi)核架構(gòu)Cortex處理器內(nèi)核已經(jīng)成為ARM公司最新一代嵌入式處理的核心。與早期ARM處理器不同的是,Cortex處理器具有一個(gè)完整的處理核心,包括CortexCPU和圍繞在其周?chē)囊幌盗邢到y(tǒng)設(shè)備,從而向用戶提供了嵌入式系統(tǒng)完整的“心臟”。為了適應(yīng)當(dāng)前各種嵌入式系統(tǒng)的廣泛應(yīng)用,Cortex處理器分為幾種應(yīng)用分支。而“Cortex”一詞后面跟著的字母則表示了該分支的具體類(lèi)別,其三個(gè)分支描述如下:●Cortex-A系列,在復(fù)雜的操作系統(tǒng)和用戶級(jí)應(yīng)用場(chǎng)合使用的應(yīng)用分支,支持ARM、Thumb和Thumb-2指令集。●Cortex-R系列,實(shí)時(shí)操作系統(tǒng)分支,支持ARM、Thumb和Thumb-2指令集?!馛ortex-M系列,微控制器分支,為對(duì)成本敏感的微控制器應(yīng)用場(chǎng)合而設(shè),只支持Thumb-2指令集。而在分支字母之后所跟隨的數(shù)字則表示了該內(nèi)核版本的性能級(jí)別,目前由最低的0級(jí)分布到最高的15級(jí)。目前Cortex-M分支中的最高等級(jí)為4。STM32就是基于Cortex-M3處理器的微控制器。2.1ARM架構(gòu)回顧ARM公司的處理器架構(gòu)版本也許會(huì)讓人覺(jué)得有點(diǎn)混亂,分為ARMv6、ARMv7等。如圖2.1.1所示,Cortex-M3處理器基于ARMv7結(jié)構(gòu),支持Thumb-2指令集。因此ARM對(duì)Cortex-M3的描述會(huì)集中在《Cortex-M3技術(shù)參考手冊(cè)》和《ARMv7架構(gòu)參考手冊(cè)》這兩份文檔里,讀者可以從ARM官網(wǎng)下載得到。圖2.1.1ARM架構(gòu)發(fā)展歷程在后面的章節(jié)里,Cortex-M3處理器和Cortex-M3CPU這兩種稱(chēng)呼將表示兩種含義。Cortex-M3處理器表示完整的Cortex嵌入式核心,而Cortex-M3CPU僅表示Cortex-M3處理器內(nèi)部的“精簡(jiǎn)指令集中央處理單元”(RISCCPU)。下一節(jié)將了解一些Cortex-M3CPU的關(guān)鍵特性。2.2Cortex-M3CPU:核心中的核心Cortex-M3處理器的“心臟”地帶被一個(gè)32位的CPU所占據(jù)。這個(gè)CPU的編程模型和ARM7/ARM9CPU雖有不少相似之處,但是豐富的指令集使得它對(duì)整數(shù)運(yùn)算有更好的支持。Cortex-M3CPU還支持位操作,擁有硬件實(shí)時(shí)性能。2.2.1管道Cortex-M3CPU可以在單個(gè)周期內(nèi)完成絕大多數(shù)指令的執(zhí)行。像ARM7和ARM9一樣,Cortex-M3CPU也使用三級(jí)管道技術(shù),還使用分支預(yù)測(cè)技術(shù)提高管道使用率。就ARM7/ARM9CPU中的三級(jí)管道來(lái)說(shuō),當(dāng)一個(gè)指令正在處理時(shí),下一個(gè)指令已經(jīng)被解碼的同時(shí)第3個(gè)指令已經(jīng)被預(yù)取進(jìn)存儲(chǔ)緩存區(qū)里了,這種處理方式非常適合線性代碼的運(yùn)行。但當(dāng)一個(gè)未知的分支來(lái)臨(比如條件判斷語(yǔ)句),管道必須被強(qiáng)制地刷新清空后才能重載分支代碼繼續(xù)使用。ARM7和ARM9對(duì)分支代碼的處理需要花費(fèi)極大的開(kāi)銷(xiāo)。而Cortex-M3CPU使用分支預(yù)測(cè)技術(shù)使這種三級(jí)管道技術(shù)得到了增強(qiáng)。如圖2.2.1所示,當(dāng)一個(gè)分支指令來(lái)臨時(shí),會(huì)進(jìn)行一次預(yù)測(cè)性的裝載,從而使得每個(gè)條件指令所有可能的結(jié)果都可得到立即執(zhí)行,而不會(huì)對(duì)CPU性能產(chǎn)生負(fù)面沖擊。最壞的情況也僅僅是,在某個(gè)非直接的分支里,預(yù)測(cè)性的裝載無(wú)法進(jìn)行,這時(shí)才需要刷新管道。管道技術(shù)成為了提升Cortex-M3CPU整體性能的關(guān)鍵所在,而且用戶并不需要為此增加程序代碼。圖2.2.1Cortex-M3CPU三級(jí)管道技術(shù)2.2.2編程模型Cortex-M3CPU作為一個(gè)精簡(jiǎn)指令集處理核心,是基于一個(gè)“載入-存儲(chǔ)”式的架構(gòu)。為了執(zhí)行數(shù)據(jù)處理指令,操作數(shù)必須裝載進(jìn)一系列中央寄存器里,數(shù)據(jù)操作必須在這些寄存器中進(jìn)行,而數(shù)據(jù)運(yùn)算結(jié)束后結(jié)果會(huì)被存到存儲(chǔ)區(qū)中,該過(guò)程如圖2.2.2所示。圖2.2.2Cortex-M3CPU的“裝載-存儲(chǔ)”結(jié)構(gòu)事實(shí)上,所有的程序活動(dòng)都在CPU寄存器組里面進(jìn)行。這個(gè)寄存器組里包含了16個(gè)32位寄存器,如圖2.2.3所示。寄存器R0~R12是基本寄存器,可以用來(lái)保存程序變量。寄存器R13~R15是CPU的特殊功能寄存器。寄存器R13(Banked寄存器)用以保存堆棧指針,該寄存器允許CPU的兩種操作模式都擁有各自的堆??臻g,這兩個(gè)堆棧分別稱(chēng)為主堆棧和進(jìn)程堆棧。R14寄存器稱(chēng)為鏈接寄存器,作用是在執(zhí)行跳轉(zhuǎn)指令時(shí)保存程序返回地址;通過(guò)R14寄存器可以實(shí)現(xiàn)CPU快速地進(jìn)出調(diào)用函數(shù);如果用戶的程序中存在幾級(jí)嵌套調(diào)用,則R14的值會(huì)被自動(dòng)壓棧。R15寄存器是程序計(jì)數(shù)器(PC),也是中央寄存器組的一員,用戶可以像對(duì)其他寄存器一樣對(duì)R15進(jìn)行讀/寫(xiě)操作。圖2.2.3Cortex-M3的寄存器組注意:當(dāng)CPU處于線程模式時(shí),R13寄存器存儲(chǔ)的是主堆棧指針;而當(dāng)CPU處于處理模式時(shí),R13寄存器存儲(chǔ)的是進(jìn)程堆棧指針。這就是“Banked”一詞的含義。為了讓寄存器組的功能更為完善,Cortex-M3CPU還需要一個(gè)程序狀態(tài)寄存器(ProgramStatusRegister,PSR)。它并不是主寄存器組的一員,只能通過(guò)兩條特殊的指令來(lái)訪問(wèn)。程序狀態(tài)寄存器又可以劃分為幾個(gè)小寄存器(統(tǒng)稱(chēng)為xPSR),它們都能影響Cortex-M3CPU的運(yùn)行狀態(tài)。圖2.2.4顯示了xPSR寄存器的組成細(xì)節(jié)。圖2.2.4xPSR寄存器圖2.2.4中最高的5位是代碼狀態(tài)標(biāo)志位,一般稱(chēng)為應(yīng)用程序狀態(tài)寄存器(ApplicationProgramStatusRegister,APSR)。APSR的前4個(gè)代碼狀態(tài)標(biāo)志為N、Z、C、V,分別表示負(fù)數(shù)標(biāo)志、零標(biāo)志、進(jìn)位標(biāo)志和溢出標(biāo)志,當(dāng)CPU進(jìn)行數(shù)據(jù)處理的時(shí)候出現(xiàn)以上4種狀態(tài),對(duì)應(yīng)的代碼狀態(tài)標(biāo)志位就會(huì)被置位。APSR的第5位是Q標(biāo)志位,當(dāng)某個(gè)變量到達(dá)了它的上限或者下限值時(shí),Q標(biāo)志就會(huì)被置位。顯然和32位的ARM指令集一樣,當(dāng)指令狀態(tài)和APSR里的標(biāo)志位一致時(shí),Thumb-2指令集才能順利被執(zhí)行;否則,Thumb-2指令就被當(dāng)作NOP指令通過(guò)管道。這可以確保指令流能夠平滑地通過(guò)管道,而且避免管道遭受過(guò)多地刷新。在Cortex-M3CPU中,這種管道技術(shù)仍在程序執(zhí)行狀態(tài)寄存器(ExecutionProgramStatusRegister,EPSR)中得到了進(jìn)一步拓展。EPSR在PSR中的位置為第6~28位。EPSR包含3個(gè)分區(qū):“ifthen”分區(qū)、“中斷可持續(xù)指令區(qū)”以及“Thumb指令區(qū)”。Thumb-2指令集對(duì)處理“ifthen”這樣的小指令模塊有一套行之有效的辦法:當(dāng)條件假設(shè)為“真”時(shí),EPSR會(huì)置位某些位并通知CPU處理后續(xù)4條指令;相反而言,如果條件假設(shè)為“假”時(shí),這4條指令會(huì)被當(dāng)作NOP指令通過(guò)管道。這個(gè)過(guò)程可使用C語(yǔ)言混合匯編指令描述如下:雖然大部分Thumb-2指令可以在一個(gè)周期之內(nèi)完成處理,但還是有一些指令需要多個(gè)周期才能完成執(zhí)行。所以,為了使Cortex-M3CPU有一個(gè)絕對(duì)固定的中斷響應(yīng)時(shí)間,這些多周期指令必須是可以被打斷的。當(dāng)一個(gè)多周期指令過(guò)早地被打斷時(shí),中斷可持續(xù)指令區(qū)會(huì)將下一步將要裝載或儲(chǔ)存多周期指令的寄存器的編號(hào)保存。因此一旦中斷服務(wù)執(zhí)行完畢,多周期指令(如load/store)就可以返回執(zhí)行?!癟humb指令區(qū)”是從早期的ARMCPU上移植過(guò)來(lái)的,這個(gè)區(qū)的內(nèi)容表示當(dāng)前使用的指令集是ARM指令集還是Thumb指令集。在Cortex-M3中這一位永遠(yuǎn)都是1(因?yàn)镃ortex-M3只支持Thumb-2指令集)。PSR的最后一個(gè)區(qū)是中斷狀態(tài)區(qū)(InterruptStatusField),作用類(lèi)似8051系列單片機(jī)的中斷狀態(tài)寄存器,里面包含的內(nèi)容指示了當(dāng)前有哪些中斷服務(wù)被請(qǐng)求了。2.2.3Cortex-M3CPU的運(yùn)行模式Cortex-M3CPU擁有更低的門(mén)數(shù),是一個(gè)快速而易用的微控制器核心,同時(shí)它也支持實(shí)時(shí)操作系統(tǒng)的運(yùn)行。Cortex-M3CPU有兩種運(yùn)行模式:線程(Thread)模式和處理(Handler)模式。CPU不處理異常事件時(shí)會(huì)運(yùn)行在Thread模式下,而當(dāng)CPU需要去處理一個(gè)異常事件時(shí)就會(huì)切換到Handler模式。此外,Cortex-M3CPU還有兩種處理代碼的方式:私有和非私有模式。在私有模式下,CPU可以執(zhí)行所有的指令。而在非私有模式下部分指令是被禁止執(zhí)行的(比如對(duì)xPSR寄存器操作的MRS和MSR指令),同時(shí)也不能對(duì)CPU的系統(tǒng)控制區(qū)中的寄存器進(jìn)行操作。此外,堆棧的使用也是可以配置的,主堆棧在Thread和Handler模式下都可以使用。通過(guò)設(shè)置,Handler模式也可以使用進(jìn)程堆棧。圖2.2.5顯示了Cortex-M3CPU兩種運(yùn)行模式的細(xì)節(jié)。圖2.2.5Cortex-M3CPU的運(yùn)行模式如圖2.2.5所示,Cortex-M3CPU在復(fù)位之后會(huì)以最開(kāi)放的方式運(yùn)行,即無(wú)論是Thread模式還是Handler模式都在私有模式下執(zhí)行,對(duì)處理器的任何資源都沒(méi)有使用限制,Thread模式和Handler模式都使用主堆棧。要開(kāi)始運(yùn)行一般應(yīng)用的C程序,用戶只需要設(shè)置好復(fù)位向量和堆棧的起始地址即可。然而,如果要使用RTOS或者開(kāi)發(fā)一個(gè)有高度安全性要求的項(xiàng)目,可以使Cortex-M3CPU進(jìn)入一種高級(jí)模式,在這種模式里,RTOS或者異常事件在Handler模式下使用私有模式運(yùn)行,并使用主堆棧;而應(yīng)用代碼在線程模式下使用非私有模式運(yùn)行,并使用進(jìn)程堆棧。這樣做的好處是,系統(tǒng)代碼和應(yīng)用代碼得以分離,這樣即便應(yīng)用代碼產(chǎn)生錯(cuò)誤也不會(huì)殃及RTOS的核心,造成整個(gè)系統(tǒng)崩潰。2.2.4Thumb-2指令集ARM7和ARM9處理器支持兩種指令集:32位ARM指令集和16位Thumb指令集。開(kāi)發(fā)人員在開(kāi)發(fā)應(yīng)用程序時(shí)經(jīng)常需要在指令集的選用上煞費(fèi)心思,因?yàn)?2位指令可以提升運(yùn)行速度,而16位指令可以提升代碼密度。Cortex-M3CPU使用Thumb-2指令集,該指令集是16位和32位指令集的混合體。Thumb-2指令集相對(duì)于32位ARM指令集有26%的代碼密度提升,而相對(duì)于16位Thumb指令集則有25%的性能提升。Thumb-2指令集含有一些高級(jí)的多周期指令,它們都可以在一個(gè)周期完成執(zhí)行,但前提是CPU需要2~7個(gè)周期將其分離。Thumb-2的性能如圖2.2.6所示。圖2.2.6Thumb-2指令集性能一覽Thumb-2指令集還有:高級(jí)的分支指令(包括test和compare指令),if/then處理指令集合,為數(shù)據(jù)處理提供的字節(jié)、半字和字存取指令。Cortex-M3CPU同時(shí)還是一個(gè)RISC(精簡(jiǎn)指令集)處理器,其豐富的指令集可以和C編譯器很好的配合。除了小部分有可能用到的非ANSIC關(guān)鍵字和使用匯編語(yǔ)句編寫(xiě)的中斷向量表之外,一個(gè)典型的Cortex-M3應(yīng)用程序可以全部使用ANSIC完成。2.2.5非對(duì)齊存取接口ARM7和ARM9CPU所基于的指令集支持使用字節(jié)(8位)、半字(16位)、字(32位)和各種有符號(hào)(signed)、無(wú)符號(hào)(unsigned)變量。CPU可以很自然地處理32位整型變量,不再需要軟件的支持(典型的8位和16位單片機(jī)都需要)。然而,早期的ARM處理器也只能以“字”或者“半字”的對(duì)齊方式進(jìn)行數(shù)據(jù)存取。這其實(shí)浪費(fèi)了編譯器將針對(duì)程序數(shù)據(jù)體積的大小進(jìn)行優(yōu)化的能力——由于數(shù)據(jù)必須對(duì)齊存取的原因,部分寶貴的SRAM被浪費(fèi)了。此外,Cortex-M3處理器的“位帶”技術(shù)允許程序標(biāo)志位寫(xiě)入“字”或“半字”變量?jī)?nèi)部,而不是每個(gè)標(biāo)志位都占用1字節(jié)的空間(如1個(gè)32位“字”數(shù)據(jù)通過(guò)“位帶”技術(shù)可以存放32個(gè)標(biāo)志位,這樣可節(jié)省大量空間)。因此,對(duì)齊存儲(chǔ)方式將這種浪費(fèi)進(jìn)一步地放大了。圖2.2.7顯示了非對(duì)齊和對(duì)齊存儲(chǔ)方式之間的區(qū)別。圖2.2.7非對(duì)齊(左)與對(duì)齊(右)存儲(chǔ)方式對(duì)比Cortex-M3CPU同樣可以實(shí)現(xiàn)“字”以及“半字”對(duì)齊的方式尋址,但它還可以使用非對(duì)齊存取方式。這賦予了編譯鏈接器在將程序數(shù)據(jù)編譯鏈接時(shí)的最大“自由”。2.3Cortex-M3處理器——不只是個(gè)處理器2.3.1總線Cortex-M3處理器基于哈佛結(jié)構(gòu)體系,擁有獨(dú)立的地址總線和數(shù)據(jù)總線,分別稱(chēng)為I-Code總線和D-Code總線。這兩條總線都可以在0x00000000~0x1FFFFFFF范圍內(nèi)存取代碼和數(shù)據(jù)。Cortex-M3處理器還有一條額外的系統(tǒng)總線用以存取位于0x20000000~0xDFFFFFFFF和0xE0100000~0xFFFFFFFF地址范圍內(nèi)的Cortex-M3系統(tǒng)控制區(qū)。而Cortex-M3處理器的片上調(diào)試系統(tǒng)則使用一條私有設(shè)備總線來(lái)連接。2.3.2總線矩陣Cortex-M3處理器的系統(tǒng)總線和數(shù)據(jù)總線通過(guò)一系列高速總線陣列組成的總線矩陣和外部控制器連接,這樣就可以在Cortex-M3處理器的內(nèi)部總線和外部總線之間建立一些并行通道,比如從DMA到片上SRAM或者外設(shè)。如果兩個(gè)總線主機(jī)(比如Cortex-M3CPU和DMA單元)同時(shí)嘗試連接同一個(gè)設(shè)備,Cortex-M3處理器內(nèi)部的仲裁機(jī)構(gòu)會(huì)解決此類(lèi)沖突問(wèn)題,優(yōu)先級(jí)高的總線主機(jī)會(huì)取得總線的控制權(quán)。然而,對(duì)STM32控制器而言,DMA單元被嵌入到了Cortex-M3CPU中,下文在講述DMA單元的運(yùn)行機(jī)制時(shí)會(huì)闡述到這部分情況。2.3.3存儲(chǔ)映射Cortex-M3處理器是一個(gè)標(biāo)準(zhǔn)化的微控制器核心,其固定的存儲(chǔ)映射方案就是標(biāo)準(zhǔn)化的一個(gè)表現(xiàn)。盡管Cortex-M3處理器擁有多重內(nèi)部總線,但其存儲(chǔ)區(qū)仍然是一個(gè)線性的4GB地址空間。圖2.3.1顯示了Cortex-M3處理器內(nèi)部的存儲(chǔ)映射情況。圖2.3.1存儲(chǔ)區(qū)和映射方案如圖2.3.1所示,存儲(chǔ)區(qū)最開(kāi)始的1GB空間分別為Code(代碼)區(qū)和SRAM(靜態(tài)內(nèi)存)區(qū)。Code區(qū)使用經(jīng)過(guò)針對(duì)性?xún)?yōu)化的I-Code總線來(lái)連接。同理,SRAM區(qū)使用D-Code總線連接。雖然SRAM也可以用來(lái)裝載和執(zhí)行代碼,但這樣做會(huì)使CPU不得不通過(guò)系統(tǒng)總線來(lái)取指令,產(chǎn)生額外的CPU等待周期,因此在SRAM中運(yùn)行代碼會(huì)比在代碼區(qū)的片上Flash中運(yùn)行要緩慢。接下來(lái)的0.5GB存儲(chǔ)空間是片上外設(shè)區(qū)。微控制器的所有用戶設(shè)備的基地址都落在這個(gè)區(qū)域內(nèi)。片上外設(shè)區(qū)和SRAM區(qū)的起始1MB區(qū)域可以使用位帶技術(shù)實(shí)現(xiàn)位尋址。由于STM32所有的SRAM和外設(shè)都位于這個(gè)區(qū)域,因此STM32所有的存儲(chǔ)區(qū)域都可以用“字(word)”或“位(bit)”為最小單位實(shí)現(xiàn)數(shù)據(jù)操作。隨后的2GB地址空間是拓展外部SRAM和外部設(shè)備用的。最后的0.5GB是Cortex-M3處理器內(nèi)部設(shè)備區(qū),其中一部分為生產(chǎn)商將來(lái)對(duì)Cortex-M3處理器增加特殊功能而留。所有使用Cortex-M3內(nèi)核的微控制器,其Cortex-M3處理器的寄存器都位于同一地址處。這使得應(yīng)用代碼可以更加容易地在不同型號(hào)的Cortex-M3器件之間,甚至是在基于Cortex-M3核心的不同品牌的微控制器之間進(jìn)行移植。一旦學(xué)會(huì)使用一種Cortex-M3控制器、一套開(kāi)發(fā)工具就可以積累大量可重復(fù)使用的代碼,并可以在眾多基于Cortex-M3內(nèi)核的微控制器上使用。2.3.4位帶的概念早期的ARM7和ARM9處理器使用“&(與)”、“|(或)”指令來(lái)實(shí)現(xiàn)對(duì)SRAM區(qū)或者外設(shè)存儲(chǔ)區(qū)進(jìn)行位操作。這是一個(gè)“讀→修改→寫(xiě)”的過(guò)程,如圖2.3.2所示。由此為了實(shí)現(xiàn)單個(gè)的位操作將會(huì)耗費(fèi)數(shù)個(gè)時(shí)鐘周期,并增加了代碼量。圖2.3.2傳統(tǒng)位操作方式為了克服這一限制,有必要引入一種專(zhuān)用的位操作指令,或者一種完整的布爾過(guò)程,但這會(huì)增加Cortex-M3CPU的尺寸和復(fù)雜度。取而代之的做法是,Cortex-M3處理器引入了一種稱(chēng)為“位帶”的技術(shù)以實(shí)現(xiàn)設(shè)備區(qū)和SRAM存儲(chǔ)空間的位操作,而不需要任何特殊的指令。Cortex-M3系列處理器的可位尋址區(qū)由位帶區(qū)(即SRAM的起始1MB空間或外設(shè)寄存器區(qū))和2個(gè)大小為32MB的位帶別名區(qū)組成。位帶技術(shù)將位帶區(qū)的每一位映射到對(duì)應(yīng)的位帶別名區(qū)。因此,用戶只要對(duì)位帶別名區(qū)進(jìn)行字操作就可以實(shí)現(xiàn)對(duì)真實(shí)內(nèi)存的位操作。圖2.3.3顯示了位帶區(qū)的奧秘所在。圖2.3.3位帶存儲(chǔ)映射位帶技術(shù)允許用戶在不加入任何特殊指令的前提下實(shí)現(xiàn)位操作,同時(shí)仍然保持了Cortex-M3CPU尺寸的小巧性。在實(shí)際應(yīng)用中,要對(duì)一個(gè)外設(shè)寄存器或者SRAM進(jìn)位操作時(shí),需要計(jì)算與其對(duì)應(yīng)的位帶別名區(qū)中的地址。可以使用以下公式計(jì)算:位帶別名區(qū)地址=位帶別名區(qū)基地址+字偏移地址字偏移地址=字節(jié)相對(duì)位帶區(qū)的偏移×0x20+位數(shù)目×4舉個(gè)例子,若要對(duì)GPIOB的端口數(shù)據(jù)輸出寄存器(PortOutputDataRegister)的某個(gè)位進(jìn)行置位或者清除。已知GPIOB口的輸出寄存器物理地址是0x40010C0C,則通過(guò)上述公式可以計(jì)算出GPIOB的第8位(即對(duì)應(yīng)GPIOB端口的第8引腳)在位帶別名區(qū)中的地址:然后使用C語(yǔ)言以此地址定義一個(gè)指針,用來(lái)對(duì)GPIOB.08口進(jìn)行置位和清除:點(diǎn)亮LED(C語(yǔ)句):其產(chǎn)生的匯編代碼如下:熄滅LED:其產(chǎn)生的匯編代碼如下:可以看到,無(wú)論是置位還是清除操作,都只需要3句16位指令,以STM32的72MHz頻率計(jì)算,只需要花費(fèi)80ns的時(shí)間就可以完成執(zhí)行。位帶區(qū)的設(shè)備和SRAM當(dāng)然也可以直接使用字尋址,通過(guò)傳統(tǒng)的“與”、“或”操作實(shí)現(xiàn)位操作。點(diǎn)亮LED(C語(yǔ)句):其產(chǎn)生的匯編代碼如下:熄滅LED(C語(yǔ)句):其產(chǎn)生的匯編代碼如下:同樣可以看到,傳統(tǒng)的置位和清除操作都混合使用了16位和32位指令,其至少要花費(fèi)14個(gè)時(shí)鐘周期,同樣以STM32的72MHz頻率計(jì)算,需要花費(fèi)180ns的時(shí)間才能完成執(zhí)行。所以通過(guò)位帶技術(shù)對(duì)寄存器和SRAM使用位操作,可以有效減小代碼量、減少代碼的運(yùn)行時(shí)間,這帶來(lái)的效率提升對(duì)小型嵌入式應(yīng)用系統(tǒng)來(lái)說(shuō)是相當(dāng)可觀的。并且在絕大多數(shù)的開(kāi)發(fā)環(huán)境中,各個(gè)設(shè)備的位帶別名區(qū)地址都已經(jīng)計(jì)算定義好了,這樣又進(jìn)一步節(jié)省了開(kāi)發(fā)人員的時(shí)間。如此看來(lái),使用位帶技術(shù)是“毫無(wú)懸念”的選擇。2.3.5系統(tǒng)節(jié)拍定時(shí)器Cortex-M3處理器還包含了一個(gè)24位的系統(tǒng)節(jié)拍定時(shí)器(SystemTicktimer,SysTick),具備自動(dòng)重載和溢出中斷功能,所有基于Cortex-M3處理器的微控制器都可以由這個(gè)定時(shí)器獲得統(tǒng)一的定時(shí)間隔。SysTick是為了給RTOS提供系統(tǒng)節(jié)拍而設(shè)的,為任務(wù)調(diào)度提供一個(gè)周期性的中斷。用戶可以在位于Cortex-M3處理器系統(tǒng)控制單元中的系統(tǒng)節(jié)拍定時(shí)器控制與狀態(tài)寄存器(SysTickControlandStatusRegister,SCSR)選擇SysTick時(shí)鐘源。如果將SCSR中的CLKSOURCE位置位,SysTick會(huì)在CPU頻率下運(yùn)行;而將CLKSOURCE位清除則SysTick會(huì)以CPU主頻的1/8頻率運(yùn)行。SysTick單元有3個(gè)寄存器,分別為SysTick控制與狀態(tài)寄存器(SysTickControlandStatusRegister)、SysTick重裝載寄存器(SysTickReloadValueRegister)和SysTick當(dāng)前計(jì)數(shù)值寄存器(SysTickCurrentValueRegister)。當(dāng)前計(jì)數(shù)值和重裝值應(yīng)該在開(kāi)始計(jì)數(shù)前設(shè)置好。SCSR中的ENABLE位用來(lái)啟動(dòng)定時(shí)器運(yùn)行,TICKINT位則用來(lái)開(kāi)啟該定時(shí)器的溢出中斷。下面介紹Cortex-M3處理器的中斷結(jié)構(gòu),將嘗試使用SysTick產(chǎn)生一個(gè)中斷事件。2.3.6中斷處理Cortex-M3處理器相對(duì)于早期ARM處理器的一個(gè)關(guān)鍵性的進(jìn)步,就是它的中斷結(jié)構(gòu)和對(duì)異常的處理。ARM7和ARM9處理器有兩條中斷通道:快速中斷通道和通用中斷通道。任何一家芯片制造商在設(shè)計(jì)ARM微控制器時(shí),都必須使用這兩條通道來(lái)連接它們的中斷源,很明顯這種中斷結(jié)構(gòu)不適合變化多樣的應(yīng)用。所以當(dāng)這種中斷機(jī)制在廣泛應(yīng)用的同時(shí),其性能表現(xiàn)也在各個(gè)芯片生產(chǎn)商的手中區(qū)別開(kāi)來(lái)。ARM7和ARM9的中斷結(jié)構(gòu)存在兩個(gè)問(wèn)題。首先,它的中斷響應(yīng)時(shí)間不是絕對(duì)性的,即當(dāng)中斷產(chǎn)生時(shí),需要中斷或者終止當(dāng)前執(zhí)行指令所需的時(shí)間是不確定的。這在許多普通應(yīng)用中不會(huì)導(dǎo)致什么問(wèn)題,但是在實(shí)時(shí)控制場(chǎng)合可是個(gè)大問(wèn)題。其次,ARM7和ARM9中斷結(jié)構(gòu)本身不支持中斷嵌套,需要通過(guò)軟件上的設(shè)計(jì)才能實(shí)現(xiàn)(常見(jiàn)做法是使用匯編語(yǔ)句或者實(shí)時(shí)操作系統(tǒng)實(shí)現(xiàn))。Cortex-M3處理器的一個(gè)關(guān)鍵性的提升便是它克服了以上(ARM7和ARM9處理器的)缺點(diǎn),為開(kāi)發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的既快速又具備絕對(duì)性的中斷系統(tǒng)結(jié)構(gòu)。2.3.7嵌套中斷向量控制器嵌套中斷向量控制器(NestedVectorInterruptController,NVIC)是Cortex-M3處理器的標(biāo)準(zhǔn)配備。這意味著所有基于Cortex-M3核心的微控制器都有著相同的中斷結(jié)構(gòu),而不再取決于芯片制造商。因此,開(kāi)發(fā)人員不必對(duì)整個(gè)中斷控制寄存器組進(jìn)行重新認(rèn)識(shí)就可以將應(yīng)用代碼和操作系統(tǒng)方便地從某個(gè)Cortex-M3控制器平臺(tái)移植到另外一個(gè)同類(lèi)平臺(tái)上。NVIC的特征之一是具有非常低的中斷延時(shí),這也得益于Thumb-2指令集的特征:允許多周期指令(比如load和store)被打斷。而NVIC的中斷延時(shí)是絕對(duì)固定的,其具有的幾種先進(jìn)的中斷響應(yīng)特性讓NVIC對(duì)實(shí)時(shí)應(yīng)用有著良好的支持。也如“嵌套中斷向量控制器”這個(gè)名字的含義所示,NVIC支持中斷嵌套,在STM32上可以支持16級(jí)中斷優(yōu)先級(jí)。用戶可以全部使用C語(yǔ)言對(duì)NVIC進(jìn)行設(shè)置,不需要任何的宏匯編語(yǔ)言或者非ANSIC語(yǔ)言。雖然NVIC是Cortex-M3處理器的一個(gè)標(biāo)準(zhǔn)單元,但在進(jìn)行微控制器設(shè)計(jì)時(shí),為了保持控制器的低門(mén)數(shù),NVIC的中斷通道數(shù)量并不是固定的,控制器設(shè)計(jì)廠家可以根據(jù)需要來(lái)設(shè)定NVIC的中斷通道數(shù)。NVIC有一個(gè)非可屏蔽中斷和多達(dá)240個(gè)外部中斷通道供給外部設(shè)備連接。此外,還有額外的15個(gè)中斷源位于Cortex-M3核心內(nèi)部,用以響應(yīng)Cortex-M3核心的內(nèi)部異常。STM32的NVIC最大可擁有43個(gè)可屏蔽中斷通道。1.NVIC下的中斷進(jìn)入與退出當(dāng)一個(gè)外設(shè)請(qǐng)求中斷時(shí),NVIC會(huì)請(qǐng)求Cortex-M3CPU響應(yīng)這個(gè)中斷。一旦CPU進(jìn)入中斷模式,它首先會(huì)將一系列寄存器壓棧。此處特別指出,壓棧的過(guò)程是由CPU中的微代碼完成的,用戶不需要在應(yīng)用代碼中加入任何壓棧指令。當(dāng)壓棧完成之后,將要跳轉(zhuǎn)的中斷服務(wù)函數(shù)的入口地址就會(huì)被指令總線讀取。從外設(shè)請(qǐng)求中斷開(kāi)始到執(zhí)行中斷服務(wù)函數(shù)的第一條指令只需要12個(gè)時(shí)鐘周期,如圖2.3.4所示。圖2.3.4中斷進(jìn)出過(guò)程被微代碼壓棧的寄存器包括程序狀態(tài)寄存器(PSR)、程序計(jì)數(shù)器(PC)以及鏈接寄存器(LR)。這些寄存器包含CPU當(dāng)前執(zhí)行的信息。此外,R0~R3寄存器也會(huì)被保存,這些寄存器往往用于參數(shù)傳遞,只有將R0~R3寄存器保存后,CPU才可以在中斷服務(wù)函數(shù)里面使用這些寄存器。最后被壓棧的還有R12寄存器,R12是一個(gè)內(nèi)部調(diào)用寄存器,當(dāng)發(fā)生函數(shù)調(diào)用語(yǔ)句時(shí)會(huì)臨時(shí)產(chǎn)生一些內(nèi)部代碼,這些代碼就會(huì)使用R12寄存器裝載。舉個(gè)例子,如果在程序中使用了堆棧檢測(cè),則其額外產(chǎn)生的臨時(shí)代碼如果需要使用CPU寄存器的話,R12寄存器就派上用場(chǎng)了。當(dāng)中斷結(jié)束后,被打斷的后臺(tái)程序?qū)?huì)恢復(fù),CPU通過(guò)其內(nèi)部微代碼的驅(qū)使將堆?;謴?fù),同時(shí)(此處指同一時(shí)刻)將返回地址裝載完成中斷返回,所以后臺(tái)程序能夠在12個(gè)時(shí)鐘周期之內(nèi)恢復(fù)執(zhí)行。NVIC能夠非??焖俚仨憫?yīng)單一的中斷,同樣也可以在高實(shí)時(shí)性要求的應(yīng)用中快速地響應(yīng)多重中斷。NVIC有幾種辦法使其能夠以最小的延時(shí)時(shí)間響應(yīng)多重中斷,而且保證最高級(jí)的中斷得以?xún)?yōu)先執(zhí)行。2.中斷嵌套NVIC允許高優(yōu)先級(jí)中斷打斷正在執(zhí)行的低級(jí)中斷。在這種情況下,正在執(zhí)行的中斷服務(wù)程序會(huì)被中止,然后經(jīng)過(guò)標(biāo)準(zhǔn)的12個(gè)時(shí)鐘周期壓棧時(shí)間后,開(kāi)始執(zhí)行新的中斷服務(wù)程序。當(dāng)高級(jí)中斷完成執(zhí)行,堆棧會(huì)自動(dòng)彈出,低級(jí)中斷得以返回繼續(xù)執(zhí)行。3.尾鏈技術(shù)如果高級(jí)中斷正在執(zhí)行時(shí)有一個(gè)低級(jí)中斷請(qǐng)求到來(lái),Cortex-M3處理器的NVIC使用一種“尾鏈(TailChaining)”技術(shù)確保在這兩個(gè)中斷之間得到最小的執(zhí)行延時(shí)時(shí)間,描述如下:如果兩個(gè)中斷同時(shí)請(qǐng)求,則高優(yōu)先級(jí)中斷在12個(gè)時(shí)鐘周期之后優(yōu)先執(zhí)行。但是在高級(jí)中斷服務(wù)執(zhí)行完畢之后CPU并不會(huì)返回后臺(tái)程序,棧也不會(huì)被恢復(fù),而是將下一個(gè)最高級(jí)中斷的入口地址載入,這樣做的結(jié)果是只需要花費(fèi)6個(gè)時(shí)鐘周期就可以開(kāi)始執(zhí)行下一個(gè)中斷服務(wù)。在最后一個(gè)掛起中斷完成執(zhí)行之后,堆?;謴?fù),CPU載入返回地址,后臺(tái)程序就會(huì)在12個(gè)周期之內(nèi)得到執(zhí)行。圖2.3.5顯示了“尾鏈”技術(shù)的細(xì)節(jié)。圖2.3.5尾鏈技術(shù)但有一種特殊情況,如果一個(gè)低優(yōu)先級(jí)中斷在某個(gè)高級(jí)中斷的返回時(shí)刻來(lái)臨(見(jiàn)圖2.3.6),則堆?;謴?fù)(POP)的操作會(huì)被忽略,堆棧指針會(huì)恢復(fù)它原來(lái)(POP之前)的值,這需要額外的6個(gè)時(shí)鐘周期來(lái)裝載新中斷服務(wù)的地址。所以在這種情況下,新的中斷要得到執(zhí)行則需要7~18個(gè)時(shí)鐘周期的延時(shí)。圖2.3.6尾鏈技術(shù)的特殊情況4.晚到異常在嵌入式實(shí)時(shí)系統(tǒng)中經(jīng)常會(huì)遇到一種情況,當(dāng)一個(gè)低級(jí)中斷服務(wù)在執(zhí)行時(shí)發(fā)生一個(gè)高級(jí)中斷請(qǐng)求。“晚到異?!笔侵福呒?jí)中斷請(qǐng)求在低級(jí)中斷壓棧階段發(fā)生,此時(shí)NVIC當(dāng)然會(huì)馬上轉(zhuǎn)而處理高級(jí)中斷。而原本屬于低級(jí)中斷的壓棧操作會(huì)繼續(xù)執(zhí)行,但是這個(gè)壓棧操作取代了原本高級(jí)中斷應(yīng)當(dāng)執(zhí)行的壓棧操作,這樣從高級(jí)中斷開(kāi)始請(qǐng)求到其完成壓棧操作只需要6個(gè)時(shí)鐘周期,并且在此期間CPU還完成了新中斷服務(wù)入口地址的載入。而一旦高級(jí)中斷服務(wù)完成執(zhí)行,原本的低級(jí)中斷會(huì)在尾鏈技術(shù)的支持下,在6個(gè)時(shí)鐘周期之后返回執(zhí)行。NVIC對(duì)晚到異常的處理細(xì)節(jié)如圖2.3.7所示。圖2.3.7晚到異常5.NVIC的配置與使用在使用NVIC之前用戶需要做三件事。第一,在中斷向量表為將要使用的中斷源設(shè)置好中斷向量。第二,在NVIC的寄存器中使能和設(shè)置該中斷源的優(yōu)先級(jí)。第三,還要將相應(yīng)的外部設(shè)備設(shè)置好,打開(kāi)它的中斷功能。6.中斷向量表中斷向量表從Cortex-M3處理器整個(gè)地址空間的底部開(kāi)始,然而要注意的是,它并不是從0x00000000地址開(kāi)始,而是從0x00000004地址開(kāi)始,0x00000000地址用來(lái)存放棧頂?shù)刂?。?.3.1列出了各個(gè)中斷向量的詳情。表2.3.1STM32的中斷向量表中斷向量都以4字節(jié)寬度對(duì)齊,里面存儲(chǔ)的是對(duì)應(yīng)的中斷服務(wù)入口地址。最開(kāi)始的15個(gè)入口供給Cortex-M3處理器的內(nèi)部異常使用,包括復(fù)位異常、非可屏蔽中斷、出錯(cuò)管理、調(diào)試異常及系統(tǒng)節(jié)拍時(shí)鐘中斷。Thumb-2指令集包含有系統(tǒng)服務(wù)調(diào)用指令,當(dāng)調(diào)用時(shí)就會(huì)產(chǎn)生異常事件。用戶外設(shè)中斷從第16個(gè)入口開(kāi)始,由芯片制造商定義這些入口所鏈接的外設(shè)。軟件方面,中斷向量表一般位于啟動(dòng)文件中,其作用是將中斷服務(wù)地址定位到內(nèi)存基地址上。以下代碼即為使用匯編語(yǔ)言組織的Cortex-M3處理器的中斷向量表。若使用C語(yǔ)言聲明一個(gè)SysTick定時(shí)器的中斷服務(wù)入口,該入口名應(yīng)與向量表所定義的標(biāo)識(shí)相吻合,SysTick定時(shí)器的中斷服務(wù)應(yīng)對(duì)應(yīng)上中斷向量表最后一行:中斷向量表和中斷服務(wù)函數(shù)定義完畢后,就可以設(shè)置NVIC來(lái)響應(yīng)SysTick定時(shí)器中斷請(qǐng)求。一般需要兩個(gè)步驟:首先設(shè)置該中斷優(yōu)先級(jí),然后使能中斷源。Cortex-M3處理器內(nèi)部異常使用系統(tǒng)控制寄存器(SystemControlRegisters,SCR)和系統(tǒng)優(yōu)先級(jí)寄存器(SystemPriorityRegisters,SPR)設(shè)置,而用戶設(shè)備中斷使用中斷請(qǐng)求寄存器(InterrptReqest,IRQ)設(shè)置。SysTick中斷屬于內(nèi)部異常,所以它通過(guò)SCR和SPR寄存器設(shè)置。部分內(nèi)部異常是永久開(kāi)啟的,包括復(fù)位中斷、非可屏蔽中斷及SysTick定時(shí)器中斷。所以用戶并不需要通過(guò)NVIC打開(kāi)SysTick中斷,只要設(shè)置好SysTick定時(shí)器的計(jì)數(shù)值同時(shí)打開(kāi)它本身的中斷控制就完成了Systick的中斷設(shè)置。其過(guò)程如下代碼描述:Cortex-M3處理器內(nèi)部異常的優(yōu)先級(jí)可以通過(guò)SPR設(shè)置。復(fù)位中斷、非可屏蔽中斷以及硬件出錯(cuò)異常的優(yōu)先級(jí)都是固定的,以此確保Cortex-M3核心總是可以返回一個(gè)已知的異常。其他異常在SPR中擁有8個(gè)位的設(shè)置區(qū)。STM32只支持16級(jí)中斷優(yōu)先級(jí),所以只需要用到8位中的4個(gè)。需要注意的是,STM32優(yōu)先級(jí)設(shè)置操作使用的是這8位中的高4位。每一個(gè)用戶外設(shè)的中斷都由IRQ模塊控制。每一個(gè)用戶外設(shè)都有一個(gè)中斷使能位,這些位都集中在兩個(gè)32位寬度的IRQ使能寄存器里。相對(duì)應(yīng)的還有IRQ失能寄存器用來(lái)禁用某個(gè)中斷源。NVIC同樣包含中斷掛起和激活寄存器(PendingandActiveRegisters),用戶可以通過(guò)這兩個(gè)寄存器檢測(cè)到中斷源的當(dāng)前狀態(tài)。圖2.3.8顯示了NVIC的中斷設(shè)置過(guò)程。圖2.3.8中斷優(yōu)先級(jí)設(shè)置過(guò)程N(yùn)VIC一共有60個(gè)32位優(yōu)先級(jí)寄存器。每一個(gè)寄存器被分為4個(gè)區(qū),每個(gè)區(qū)都是8位的寬度,并分別單獨(dú)對(duì)應(yīng)一個(gè)中斷向量,這樣可以滿足對(duì)240個(gè)中斷的優(yōu)先級(jí)支持。STM32只使用了16個(gè)區(qū)8位中的高4位來(lái)完成對(duì)16級(jí)外部中斷優(yōu)先級(jí)的支持。默認(rèn)情況下,STM32的16個(gè)中斷優(yōu)先級(jí)中,0級(jí)最高,15級(jí)為最低。用戶還可以將這些優(yōu)先級(jí)設(shè)置區(qū)進(jìn)一步劃分為先占優(yōu)先級(jí)區(qū)和次占優(yōu)先級(jí)區(qū)。這種劃分雖然不會(huì)得到額外的優(yōu)先級(jí)數(shù),但是,當(dāng)程序中使用大量的中斷向量時(shí),可以幫助用戶更好地管理這些中斷之間的優(yōu)先級(jí)關(guān)系。先占優(yōu)先級(jí)和次占優(yōu)先級(jí)可以在應(yīng)用中斷和復(fù)位控制寄存器(ApplicationInterruptandResetControlRegister)中的PRIGROUP部分設(shè)置。表2.3.2列出了中斷優(yōu)先組的詳細(xì)情況。表2.3.2中斷優(yōu)先組詳情通過(guò)3個(gè)優(yōu)先級(jí)分組位(PRIGROUP)位可將4個(gè)優(yōu)先級(jí)設(shè)置位分為先占組和次占組。比如,PRIGROUP等于3時(shí),劃分出來(lái)兩個(gè)組,每個(gè)組都擁有4個(gè)優(yōu)先級(jí)。用戶可以在應(yīng)用代碼里面設(shè)置高優(yōu)先級(jí)組和低優(yōu)先級(jí)組,同時(shí)在每個(gè)組內(nèi)部又可以分為低、中、高和最高優(yōu)先級(jí)。前文提到,這樣并不會(huì)使程序擁有超過(guò)16個(gè)中斷優(yōu)先級(jí),但是可以讓中斷結(jié)構(gòu)變得更為直觀,這在管理數(shù)量多的中斷時(shí)會(huì)非常有用。對(duì)外部設(shè)備中斷的設(shè)置和對(duì)Cortex-M3處理器內(nèi)部異常的設(shè)置是相似的。最后以一個(gè)簡(jiǎn)單的例子,說(shuō)明ADC中斷的設(shè)置過(guò)程。①首先設(shè)置中斷向量以及構(gòu)建中斷服務(wù)函數(shù):②然后初始化ADC,打開(kāi)其中斷功能,并在NVIC中做相應(yīng)設(shè)置:2.4低功耗的新期待在這節(jié)里將介紹Cortex-M3處理器的電源管理功能。對(duì)STM32電源管理的介紹將在后面的篇幅中進(jìn)行。Cortex-M3處理器擁有睡眠模式,在該模式下,Cortex-M3內(nèi)核會(huì)保持在低功耗狀態(tài),停止執(zhí)行指令,只有NVIC的一小部分保持喚醒狀態(tài)。STM32的外部設(shè)備通過(guò)請(qǐng)求中斷就可以將Cortex內(nèi)核喚醒。2.4.1進(jìn)入低功耗模式Cortex-M3內(nèi)核可以通過(guò)執(zhí)行WFI(WaitForInterrupt)或者WFE(WaitForEvent)指令進(jìn)入睡眠模式。如果使用WFI指令,Cortex-M3內(nèi)核會(huì)在有中斷請(qǐng)求時(shí)從睡眠狀態(tài)恢復(fù),并執(zhí)行中斷服務(wù)。而一旦中斷服務(wù)執(zhí)行完畢,將要發(fā)生的情況有兩種可能:一是Cortex-M3CPU從中斷服務(wù)返回之后,開(kāi)始執(zhí)行后臺(tái)程序;二是如果設(shè)置了系統(tǒng)控制寄存器(SystemControlRegister)中的SLEEPONEXTI位,則Cortex-M3CPU從中斷服務(wù)返回之后會(huì)再次自動(dòng)進(jìn)入睡眠模式。這樣用戶就可以完全通過(guò)中斷來(lái)實(shí)現(xiàn)Cortex-M3CPU的低功耗應(yīng)用,如“內(nèi)核被喚醒→執(zhí)行中斷服務(wù)完畢→返回睡眠模式”流程。而且,實(shí)現(xiàn)這個(gè)過(guò)程所需要的代碼量是非常小的。若使用WFE指令使Cortex-M3內(nèi)核進(jìn)入睡眠模式,內(nèi)核遇到喚醒事件后就會(huì)被喚醒,并且從它進(jìn)入睡眠模式的斷點(diǎn)處恢復(fù)執(zhí)行,喚醒事件不會(huì)使CPU跳轉(zhuǎn)執(zhí)行相應(yīng)的中斷服務(wù)程序。在WFE模式下,喚醒事件可以只是簡(jiǎn)單的設(shè)備中斷事件,而不必在NVIC中開(kāi)啟對(duì)這個(gè)設(shè)備中斷的支持。這樣就允許用戶使用外部設(shè)備喚醒Cortex-M3內(nèi)核,而不必再通過(guò)中斷的方式。無(wú)論是WFI還是WFE指令都無(wú)法用C語(yǔ)言描述,但Thumb-2指令集在編譯器的支持下,可以在標(biāo)準(zhǔn)的C語(yǔ)言環(huán)境中嵌入宏匯編語(yǔ)句。如IAREWARM集成開(kāi)發(fā)環(huán)境中的ICC編譯器支持通過(guò)如下格式插入?yún)R編指令:此外,除了睡眠模式之外,Cortex-M3內(nèi)核可以在微控制器的配合驅(qū)動(dòng)下實(shí)現(xiàn)深度睡眠模式。通過(guò)設(shè)置系統(tǒng)控制寄存器(SystemControlRegisters)中的“深度睡眠位”即可將Cortex-M3內(nèi)核引入深度睡眠狀態(tài),此時(shí)PLL和用戶設(shè)備停止工作,微控制器此時(shí)的功率消耗將保持在極低的水平。2.4.2CoreSight調(diào)試組件每款A(yù)RM處理器都有屬于它自己的片上調(diào)試系統(tǒng)。ARM7和ARM9處理器帶有最小化的JTAG端口,允許用戶使用標(biāo)準(zhǔn)的調(diào)試工具連接CPU,并能夠?qū)⒂诚裎募?xiě)入內(nèi)部RAM或者Flash存儲(chǔ)器中。JTAG端口還支持對(duì)程序進(jìn)行基本的運(yùn)行控制(比如單步運(yùn)行和斷點(diǎn)設(shè)置等),可以查看存儲(chǔ)器內(nèi)容。ARM7和ARM9處理器還向用戶提供了一個(gè)實(shí)時(shí)跟蹤組件,這個(gè)設(shè)備被稱(chēng)為嵌入式跟蹤宏單元(ETM)。但即便ARMCPU處于正常工作狀態(tài)下,上述調(diào)試工具還是有一些局限性,例如JTAG調(diào)試端口只能在CPU停止后才能向調(diào)試工具提供調(diào)試信息。由此,對(duì)該ARM系統(tǒng)進(jìn)行實(shí)時(shí)更新就成為“不可能完成的任務(wù)”。其次硬件斷點(diǎn)也被限制在2個(gè)之內(nèi)——雖然ARM7和ARM9指令集包含有斷點(diǎn)指令,用戶可以使用開(kāi)發(fā)工具將其嵌入到代碼中(習(xí)慣稱(chēng)為軟件斷點(diǎn))。最后,要在實(shí)際應(yīng)用中實(shí)現(xiàn)實(shí)時(shí)跟蹤,還需要芯片制造商加入額外的資源來(lái)配合使用ETM,而且結(jié)果往往也無(wú)法得到好的跟蹤效果。而Cortex-M3內(nèi)核,為用戶帶來(lái)了一個(gè)全新的調(diào)試系統(tǒng):CoreSight。圖2.4.1為CoreSight調(diào)試系統(tǒng)的組成。圖2.4.1CoreSight調(diào)試系統(tǒng)如圖2.4.1所示,CoreSight調(diào)試系統(tǒng)擁有一個(gè)調(diào)試端口,使用戶也可以通過(guò)微控制器上的JTAG端口使用調(diào)試工具對(duì)內(nèi)核進(jìn)行鏈接。調(diào)試工具的接口可以是標(biāo)準(zhǔn)的5針JTAG接口或SWD雙線串行接口。在JTAG端口的基礎(chǔ)上,CoreSight調(diào)試系統(tǒng)包含了數(shù)據(jù)跟蹤查看器和ETM。為了支持軟件測(cè)試,CoreSight還包含內(nèi)部跟蹤設(shè)備和Flash補(bǔ)丁模塊。但STM32上的CoreSight系統(tǒng)將ETM省略掉了,由此也可以體現(xiàn)了Cortex-M3內(nèi)核的可裁剪性。STM32上的CoreSight調(diào)試系統(tǒng)向用戶提供了一個(gè)在實(shí)時(shí)性上有所增強(qiáng)的標(biāo)準(zhǔn)JTAG調(diào)試端口。STM32的CoreSight調(diào)試系統(tǒng)支持8個(gè)硬件斷點(diǎn),而且可以在不干預(yù)CPU運(yùn)行的情況下對(duì)斷點(diǎn)進(jìn)行設(shè)置和清除。數(shù)據(jù)跟蹤查看器同樣允許開(kāi)發(fā)人員不干預(yù)CPU運(yùn)行而查看內(nèi)存的內(nèi)容。CoreSight調(diào)試系統(tǒng)在Cortex-M3內(nèi)核進(jìn)入低功耗模式或睡眠模式時(shí),仍能保持工作狀態(tài),這使低功耗應(yīng)用中的微控制器調(diào)試技術(shù)走進(jìn)了嶄新的世界。此外,STM32的定時(shí)器也可以在CPU停止?fàn)顟B(tài)下使用CoreSight系統(tǒng)將其停止計(jì)數(shù),這樣用戶就可以在單步運(yùn)行代碼的同時(shí)保持定時(shí)器同步運(yùn)行。相對(duì)于早期的ARM7和ARM9控制器,CoreSight調(diào)試系統(tǒng)在相同硬件開(kāi)銷(xiāo)的情況下,顯著地提升了STM32微控制器的可實(shí)時(shí)調(diào)試能力。第3章

歡迎來(lái)到STM32的世界本章將對(duì)STM32微控制器進(jìn)行全面而深入的剖析,內(nèi)容涉及STM32的硬件設(shè)計(jì)方案、設(shè)備特性、安全特性和功耗特性等諸多方面。通過(guò)對(duì)本章的閱讀,讀者能真正地理解“STM32是什么”以及“STM32能用來(lái)做什么”這兩個(gè)主題。3.1讓STM32跑起來(lái)一個(gè)STM32的最小系統(tǒng)應(yīng)該是很“小”的。因?yàn)镾TM32內(nèi)部包含RC振蕩器和復(fù)位電路,所以要讓STM32工作起來(lái)甚至只需要為它提供一個(gè)電源。本節(jié)將講述STM32的最小系統(tǒng)需要哪些配備。3.1.1引腳分布和封裝尺寸STM32基本型和增強(qiáng)型的每個(gè)版本都有相對(duì)應(yīng)的封裝類(lèi)型,電路設(shè)計(jì)人員不需要將PCB重新設(shè)計(jì)就可以進(jìn)行STM32器件型號(hào)的更換。所有型號(hào)的STM32都有LQFP類(lèi)型的封裝,其引腳數(shù)為48~144。3.1.2電源的供應(yīng)方案如圖3.1.1所示,STM32使用單電源供電,其電壓范圍必須為2.0~3.6V,同時(shí)通過(guò)它內(nèi)部的一個(gè)電壓調(diào)整器,可以給Cortex-M3核心提供1.8V的工作電壓。STM32還有兩個(gè)可選電源的模塊:圖3.1.1STM32整體供電需求①實(shí)時(shí)時(shí)鐘和一小部分備份寄存器,它們可以在STM32進(jìn)入深度節(jié)電模式時(shí)在備份電池的支持下保持?jǐn)?shù)據(jù)不丟失。但如果STM32最小系統(tǒng)沒(méi)有使用備份電池,則VBAT引腳必須和VDD引腳相連接。②ADC模塊。如果要啟用ADC功能,則主電源VDD必須限制在2.4~3.6V。在引腳數(shù)大于(或等于)100的STM32版本型號(hào)里,ADC模塊有額外的參考電壓引腳VREF+和VREF-,則VREF-引腳必須與VDDA相連,而VREF+可以接入2.4V~VDD。在其他版本型號(hào)的STM32中,ADC的參考電壓都由內(nèi)部電壓源供給。每個(gè)電壓供應(yīng)引腳都需要一個(gè)去耦電容。STM32整體供電方案如圖3.1.2所示。圖3.1.2STM32整體供電方案3.1.3復(fù)位電路STM32微控制器含內(nèi)部復(fù)位電路,當(dāng)VDD引腳電壓小于2.0V時(shí)器件會(huì)保持在復(fù)位狀態(tài),但是會(huì)有40mV的延遲(即復(fù)位狀態(tài)在2.0V+40mV內(nèi)一直保持),如圖3.1.3所示。圖3.1.3STM32復(fù)位引腳電平變化過(guò)程3.1.4一個(gè)典型的STM32最小系統(tǒng)嚴(yán)格來(lái)說(shuō),STM32的外部復(fù)位電路不是必需的,但是在產(chǎn)品開(kāi)發(fā)階段,可以在nRST引腳上連接一個(gè)簡(jiǎn)單的復(fù)位電路以便進(jìn)行手動(dòng)復(fù)位。nRST還與JTAG調(diào)試端口相連,所以開(kāi)發(fā)調(diào)試工具同樣可以強(qiáng)行復(fù)位STM32控制器。圖3.1.4是一個(gè)典型的STM32最小系統(tǒng)原理圖。圖3.1.4典型的STM32最小系統(tǒng)設(shè)計(jì)3.1.5時(shí)鐘源的選擇STM32帶有內(nèi)部RC振蕩器,可以為內(nèi)部PLL(鎖相環(huán))提供時(shí)鐘,這樣STM32依靠?jī)?nèi)部振蕩器就可以在72MHz的滿速狀態(tài)運(yùn)行。但是內(nèi)部RC振蕩器相比外部晶振來(lái)說(shuō)不夠準(zhǔn)確,同時(shí)也不夠穩(wěn)定,所以在條件允許的情況下,建議盡量使用外部時(shí)鐘源。(1)高速外部振蕩器如圖3.1.5所示,外部主時(shí)鐘源主要作為Cortex-M3處理器和STM32外設(shè)的驅(qū)動(dòng)時(shí)鐘,一般稱(chēng)為高速外部振蕩器(HSEOSC)。它可以來(lái)源于石英/陶瓷共振體或者通過(guò)用戶提供。如果使用用戶提供的時(shí)鐘,則該時(shí)鐘波形可以是方波、正弦波或者三角波,但是必須具有50%左右的占空比,并且最大頻率不能超過(guò)25MHz。圖3.1.5STM32振蕩器電路(2)低速外部振蕩器STM32還可以使用第2個(gè)外部振蕩器,一般稱(chēng)為低速外部振蕩器(LSEOSC)。一般用于驅(qū)動(dòng)實(shí)時(shí)時(shí)鐘(RTC)以及窗口看門(mén)狗(IWDG)。像HSE一樣,LSE也可以使用外部晶振或者用戶自行供給;同樣用戶時(shí)鐘波形也可以是方波、三角波、正弦波,要求具有50%左右的占空比。LSE的典型頻率值為32.768kHz,因?yàn)檫@樣可以給實(shí)時(shí)時(shí)鐘提供準(zhǔn)確的時(shí)鐘頻率。雖然LSI也可以作為實(shí)時(shí)時(shí)鐘的驅(qū)動(dòng)源,但是它和HSI一樣不是很準(zhǔn)確,所以如果需要在設(shè)計(jì)中使用實(shí)時(shí)時(shí)鐘,則還是建議使用LSE。(3)時(shí)鐘輸出有一個(gè)GPIO引腳可以配置為STM32微控制器的時(shí)鐘輸出引腳(MCO),該引腳可以輸出頻率為內(nèi)部時(shí)鐘1/4的時(shí)鐘脈沖。3.1.6啟動(dòng)引腳和ISP編程STM32有3種啟動(dòng)方式。用戶可以通過(guò)STM32的兩個(gè)外部引腳BOOT0和BOOT1來(lái)選擇這3種啟動(dòng)方式。通過(guò)改變啟動(dòng)方式,STM32存儲(chǔ)空間的起始地址會(huì)對(duì)齊到不同的內(nèi)存空間上,這樣就可以選擇在用戶Flash、內(nèi)部SRAM或者系統(tǒng)存儲(chǔ)區(qū)上運(yùn)行代碼。一般情況下BOOT0必須連接到GND上。如果希望使用其他啟動(dòng)方式,則需要在這兩個(gè)BOOT引腳上提供跳線設(shè)置,如圖3.1.6所示。圖3.1.6STM32啟動(dòng)方式設(shè)計(jì)BOOT引腳的一個(gè)最典型應(yīng)用就是從啟動(dòng)引導(dǎo)(Bootloader)啟動(dòng),由此后可以進(jìn)行ISP編程,而USART1是ISP編程默認(rèn)使用的通信接口,可用來(lái)從PC端下載和燒寫(xiě)代碼,因此用戶還需要為此相應(yīng)地添加一個(gè)RS232驅(qū)動(dòng)器件。3.1.7調(diào)試端口為了讓STM32最小系統(tǒng)運(yùn)行起來(lái),還需要硬件調(diào)試端口,這樣才可以使用調(diào)試仿真器鏈接STM32。STM32的CoreSight調(diào)試系統(tǒng)支持兩種接口標(biāo)準(zhǔn):5針的JTAG端口和2針的SWD串行接口。這兩種接口都需要犧牲GPIO(即普通I/O口)來(lái)供給調(diào)試器仿真器使用。STM32復(fù)位之后,CPU會(huì)將這些引腳置于第2功能狀態(tài),所以此時(shí)調(diào)試端口就已經(jīng)可以使用了。如果用戶希望使用這些引腳作為GPIO,則必須在應(yīng)用程序中將它們切換回普通I/O狀態(tài)。STM32上的5針JTAG接口一般以20針的JTAG標(biāo)準(zhǔn)調(diào)試端口引出;而2針串行接口使用GPIOA.13作為串行數(shù)據(jù)線,使用GPIOA.14作為串行時(shí)鐘線。3.2認(rèn)識(shí)真正的STM32STM32的Cortex-M3核心通過(guò)特殊的指令總線與Flash存儲(chǔ)器連接,數(shù)據(jù)總線和系統(tǒng)總線又與先進(jìn)高速總線(AdvancedHighSpeedBuses,簡(jiǎn)稱(chēng)AHB)相連。STM32的內(nèi)部SRAM和DMA單元直接與AHB總線相連,外部設(shè)備則使用兩條先進(jìn)設(shè)備總線(AdvancedPeripheralBusses,簡(jiǎn)稱(chēng)APB)連接,而每一條APB總線又都與AHB總線矩陣相連。AHB總線的工作頻率與Cortex-M3內(nèi)核一致,但AHB總線上掛著許多獨(dú)立的分頻器,通過(guò)分頻器其輸出時(shí)鐘頻率可以減至較低水平以達(dá)到較低功耗。要注意,APB2總線可以最大為72MHz頻率運(yùn)行,而APB1總線只能以最大為36MHz頻率運(yùn)行。Cortex-M3核心和DMA單元都可以成為總線上的主機(jī)。因?yàn)檎麄€(gè)STM32內(nèi)部的總線矩陣是并行結(jié)構(gòu),所以Cortex-M3核心和DMA單元在同時(shí)申請(qǐng)連接SRAM、APB1或APB2時(shí)會(huì)發(fā)生仲裁事件。圖3.2.1表示了STM32微控制器內(nèi)部的總線結(jié)構(gòu)。圖3.2.1STM32內(nèi)部的總線結(jié)構(gòu)3.2.1存儲(chǔ)區(qū)映射雖然STM32內(nèi)部有多重總線,但是對(duì)于外界來(lái)說(shuō)它仍然只有一個(gè)大小為4GB的線性地址空間。STM32作為基于Cortex-M3內(nèi)核的微控制器,其內(nèi)部的存儲(chǔ)映射必須要遵從標(biāo)準(zhǔn)的存儲(chǔ)映射方案。如圖3.2.2中左側(cè)所示,代碼區(qū)起始地址從0x00000000開(kāi)始。片上SRAM從0x20000000開(kāi)始,所有的內(nèi)部SRAM都位于最底部的位帶區(qū)。用戶設(shè)備的存儲(chǔ)映射從0x40000000開(kāi)始,同樣所有用戶設(shè)備寄存器地址也必須位于外設(shè)位帶區(qū)。最后,Cortex-M3寄存器地址也遵從以上標(biāo)準(zhǔn),從0xE0000000處開(kāi)始。圖3.2.2STM32存儲(chǔ)映射與啟動(dòng)方式Flash存儲(chǔ)區(qū)由三部分組成,如圖3.2.2中間部分所示。首先是用戶Flash區(qū),從0x08000000開(kāi)始。其次是系統(tǒng)存儲(chǔ)區(qū),稱(chēng)為大端信息塊。系統(tǒng)存儲(chǔ)區(qū)是一個(gè)連續(xù)的4KB大小的Flash存儲(chǔ)空間,里面存儲(chǔ)著出廠啟動(dòng)引導(dǎo)(Bootloader)。最后一個(gè)部分從0x1FFFF800開(kāi)始,為小端信息塊,含有一組可配置字節(jié),允許用戶在此對(duì)STM32進(jìn)行一些系統(tǒng)設(shè)置。Bootloader的主要作用是允許用戶通過(guò)USART1將代碼下載進(jìn)STM32的RAM中,隨后將這些代碼寫(xiě)進(jìn)內(nèi)部用戶Flash。要將STM32置于Bootloader模式,需要把外部的BOOT0和BOOT1啟動(dòng)引腳分別置為低電平和高電平。這樣設(shè)置啟動(dòng)引腳后,系統(tǒng)存儲(chǔ)區(qū)將占用地址0x08000000。當(dāng)STM32復(fù)位后,首先執(zhí)行Bootloader代碼而不是用戶Flash中的應(yīng)用程序。Bootloader可以從ST官方網(wǎng)站下載得到。用戶程序可

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論