基于STM32Cube的嵌入式系統應用 課件 第3、7章 STM32CubeMX的應用、STM32定時器系統_第1頁
基于STM32Cube的嵌入式系統應用 課件 第3、7章 STM32CubeMX的應用、STM32定時器系統_第2頁
基于STM32Cube的嵌入式系統應用 課件 第3、7章 STM32CubeMX的應用、STM32定時器系統_第3頁
基于STM32Cube的嵌入式系統應用 課件 第3、7章 STM32CubeMX的應用、STM32定時器系統_第4頁
基于STM32Cube的嵌入式系統應用 課件 第3、7章 STM32CubeMX的應用、STM32定時器系統_第5頁
已閱讀5頁,還剩181頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章STM32CubeMX的應用本章講述了STM32CubeMX和HAL庫,包括安裝STM32CubeMX、安裝MCU固件包、軟件功能與基本使用和HAL庫。3.1安裝STM32CubeMXSTM32CubeMx軟件是ST有限公司為STM32系列微控制器快速建立工程,并快速初始化使用到的外設、GPIO等而設計的,大大縮短了開發時間。同時,該軟件不僅能配置STM32外設,還能進行第三方軟件系統的配置,例如FreeRTOS、FAT32、LWIP等;而且還有一個功能,就是可以用它進行功耗預估。此外,這款軟件可以輸出PDF、TXT文檔,顯示所開發工程中的GPIO等外設的配置信息,供開發者進行原理圖設計等。STM32CubeMX是ST官方出的一款針對ST的MCU/MPU跨平臺的圖形化工具,支持在Linux、MacOS、Window系統下開發,支持ST的全系列產品。目前包括:STM32L0,STM32L1,STM32L4,STM32L5,STM32F0,STM32F1,STM32F2,STM32F3,STM32F4,STM32F7,STM32G0,STM32G4,STM32H7,STM32WB,STM32WL,STM32MP1,其對接的底層接口是HAL庫,STM32CubeMX除了集成MCU/MPU的硬件抽象層,另外還集成了像RTOS,文件系統,USB,網絡,顯示,嵌入式AI等中間件,這樣開發者就能夠很輕松的完成MCU/MPU的底層驅動的配置,留出更多精力開發上層功能邏輯,能夠更進一步提高了嵌入式開發效率。STM32CubeMX架構如圖3-1所示。圖3-1STM32CubeMX架構STM32CubeMX軟件的特點:(1)集成了ST有限公司的每一款型號的MCU/MPU的可配置的圖形界面,能夠自動提示IO沖突并且對于復用IO可自動分配。(2)具有動態驗證的時鐘樹。(3)能夠很方便的使用所集成的中間件。(4)能夠估算MCU/MPU在不同主頻運行下的功耗。(5)能夠輸出不同編譯器的工程,比如能夠直接生成MDK、EWARM、STM32CubeIDE、MakeFile等工程。為了使開發人員能夠更加快捷有效地進行STM32的開發,ST有限公司推出了一套完整的STM32Cube開發組件。STM32Cube主要包括兩部分:一是STM32CubeMX圖形化配置工具,它是直接在圖形界面簡單配置下,生成初始化代碼,并對外設做了進一步的抽象,讓開發人員更只專注于應用的開發;二是基于STM32微控制器的固件集STM32Cube軟件資料包。從ST有限公司官網可下載STM32CubeMX軟件最新版本的安裝包,本書使用的版本是6.6.1。安裝包解壓后,運行其中的安裝程序,按照安裝向導的提示進行安裝。安裝過程中會出現圖3-2所示的界面,需要勾選第一個復選框后才可以繼續安裝。第二個復選框可以不用勾選。圖3-2需要同意ST的隱私政策和使用條款才可以繼續安裝在安裝過程中,用戶要設置軟件安裝的目錄。安裝目錄不能帶有漢字、空格和非下劃線的符號,因為STM32CubeMX對中文的支持不太好。STM32Cube開發方式還需要安裝器件的MCU固件包,所以最好將它們安裝在同一個根目錄下,例如,一個根目錄“C:\ProgramFiles\STMicroelectronics\STM32Cube\”,然后將STM32CubeMX的安裝目錄設置為“C:\ProgramFiles\STMicroelectronics\STM32Cube\STM32CubeMX”。在安裝完STM32CubeMX后,若要進行后續的各種操作,必須在STM32CubeMX中設置一個軟件庫文件夾(RepositoryFolder),在STM32CubeMX中安裝MCU固件包和STM32Cube擴展包時都安裝到此目錄下。雙擊桌面上的STM32CubeMX圖標運行該軟件,軟件啟動后的界面如圖3-3所示。3.2.1軟件庫文件夾設置3.2安裝MCU固件包圖3-3軟件啟動后的界面在圖3-3界面的最上方有3個主菜單項,單擊菜單項Help→UpdaterSettings,會出現圖3-4所示的對話框。首次啟動STM32CubeMX后,立刻單擊這個菜單項可能提示軟件更新已經在后臺運行,需要稍微等待一段時間后再單擊此菜單項。圖3-4UpdaterSettings對話框圖3-4界面上的CheckandUpdateSettings單選框用于設置STM32CubeMX軟件的更新方式,DataAuto-Refresh單選框用于設置在STM32CubeMX啟動時是否自動刷新已安裝軟件庫的數據和文檔。設置了軟件庫文件夾,就可以安裝MCU固件包和擴展包了。在圖3-3所示的界面上,單擊主菜單項Help→Manageembeddedsoftwarepackages,出現圖3-5所示的EmbeddedSoftwarePackagesManager(嵌入式軟件包管理)對話框。這里將STM32CubeMCU固件包和STM32Cube擴展包統稱為嵌入式軟件包。3.2.2管理嵌入式軟件包圖3-5EmbeddedSoftwarePackagesManager對話框圖3-5所示的界面有多個界面,STM32CubeMCUPackages界面管理STM32所有系列MCU的固件包。每個系列對應一個節點,節點展開后是這個系列MCU不同版本的固件包。固件包經常更新,在STM32CubeMX里最好只保留一個最新版本的固件包。如果在STM32CubeMX里打開一個用舊的固件包設計的項目,會有對話框提示將項目遷移到新的固件包版本,一般都能成功自動遷移。STMicroelectronics界面的管理內容如圖3-6所示,這個界面是ST有限公司提供的一些STM32Cube擴展包,包括人工智能庫X-CUBE-AI、圖形用戶界面庫X-CUBE-TOUCHGFX等,以及一些芯片的驅動程序,如MEMS、BLE、NFC芯片的驅動庫。圖3-6STMicroelectronics嵌入式軟件包管理界面在設置了軟件庫文件夾并安裝了STM32CubeF1固件包之后,就可以開始用STM32CubeMX創建項目并進行操作了。在開始針對開發板開發實際項目之前,我們需要先熟悉STM32CubeMX的一些界面功能和操作。3.2安裝MCU固件包1.初始主界面啟動STM32CubeMX之后的初始界面如圖3-3所示。STM32CubeMX從5.0版本開始使用了一種比較新穎的用戶界面,與一般的Windows應用軟件界面不太相同,也與4.x版本的STM32CubeMX界面相差很大。圖3-3的界面主要分為3個功能區,分別描述如下。(1)主菜單欄。窗口最上方是主菜單欄,有3個主菜單項,分別是File、Window和Help。這3個菜單項有下拉菜單,可供用戶通過下拉菜單項進行一些操作。主菜單欄右端是一些快捷按鈕,單擊這些按鈕就會用瀏覽器打開相應的網站,如ST社區、ST官網等。3.3.1軟件界面(2)標簽導航欄。主菜單欄下方是標簽導航欄。在新建或打開項目后,標簽導航欄可以在STM32CubeMX的3個主要視圖之間快速切換。這3個視圖如下。①Home(主頁)視圖,即圖3-2所示的界面。②新建項目視圖,新建項目時顯示的一個對話框,用于選擇具體型號的MCU或開發板創建項目。③項目管理視圖,用于對創建或打開的項目進行MCU圖形化配置、中間件配置、項目管理等操作。(3)工作區。窗口其他區域都是工作區。STM32CubeMX使用的是單文檔界面,工作區會根據當前操作的內容顯示不同的界面。圖3-3的工作區顯示的是Home視圖,Home視圖的工作區可以分為如下3個功能區域。①ExistingProjects區域,顯示最近打開過的項目,單擊某個項目就可以打開此項目。②NewProject區域,有3個按鈕用于新建項目,選擇MCU創建項目,選擇開發板創建項目,或交叉選擇創建項目。③Managesoftwareinstallations區域,有兩個按鈕:CHECKFORUPDATES按鈕用于檢查STM32CubeMX和嵌入式軟件包的更新信息;INSTALL/REMOVE按鈕用于打開圖3-4所示的對話框。Home視圖上的這些按鈕的功能都可以通過主菜單里的菜單項實現操作。2.主菜單功能STM32CubeMX有3個主菜單項,軟件的很多功能操作都是通過這些菜單項實現的。(1)File菜單。該菜單主要包括如下菜單項。①NewProject(新建項目),打開選擇MCU新建項目對話框,用于創建新的項目。STM32CubeMX的項目文件后綴是.ioc,一個項目只有一個文件。新建項目對話框是軟件的3個視圖之一,界面功能比較多,在后面具體介紹。②LoadProject(加載項目),通過打開文件對話框選擇一個已經存在的.ioc項目文件并載入項目。③ImportProject(導入項目),選擇一個ioc項目文件并導入其中的MCU設置到當前項目。注意,只有新項目與導入項目的MCU型號一致且新項目沒有做任何設置,才可以導入其他項目的設置。④SaveProject(保存項目),保存當前項目。如果新建的項目第一次保存,會提示選擇項目名稱,需要選擇一個文件夾,項目會自動以最后一級文件夾的名稱作為項目名稱。⑤SaveProjectAs(項目另存為),將當前項目保存為另一個項目文件。⑤CloseProject(關閉項目),關閉當前項目。⑥GenerateReport(生成報告),為當前項目的設置內容生成一個PDF報告文件,PDF報告文件名稱與項目名稱相同,并自動保存在項目文件所在的文件夾里。⑦RecentProjects(最近的項目),顯示最近打開過的項目列表,用于快速打開項目。⑧Exit(退出),退出STM32CubeMX。(2)Window菜單。該菜單主要包括如下菜單項。①Outputs(輸出),一個復選的菜單項,被勾選時,在工作區的最下方顯示一個輸出子窗口,顯示一些輸出信息。②Fontsize(字體大?。?。有3個子菜單項,用于設置軟件界面字體大小,需重啟STM32CubeMX后才生效。(3)Help菜單。該菜單主要包括如下菜單項。①Help(幫助),顯示STM32CubeMX的英文版用戶手冊PDF文檔,文檔有300多頁,是個很齊全的使用手冊。②About(關于),顯示關于本軟件的對話框。③Docs&Resources(文檔和資源),只有在打開或新建一個項目后此菜單項才有效。選擇此項會打開一個對話框,顯示與項目所用MCU型號相關的技術文檔列表,包括數據手冊、參考手冊、編程手冊、應用筆記等。這些都是ST有限公司官方的資料文檔,單擊即可打開PDF文檔。首次單擊一個文檔時會自動從ST官網下載文檔并保存到軟件庫根目錄下,例如,目錄“D:\STM32Dev\Repository”。這避免了每次查看文檔都要上ST有限公司官網搜索的麻煩,也便于管理。④RefreshData(刷新數據),會顯示圖3-7所示的DataRefresh對話框,用于刷新MCU和開發板的數據,或下載所有官方文檔。圖3-7DataRefresh對話框⑤UserPreferences(用戶選項),會打開一個對話框用于設置用戶選項,只有一個需要設置的選項,即是否允許軟件收集用戶使用習慣。⑥CheckforUpdates(檢查更新),會打開一個對話框,用于檢查STM32CubeMX軟件、各系列MCU固件包、STM32Cube擴展包是否有新版本需要更新。⑦Manageembeddedsoftwarepackages(管理嵌入式軟件包),會打開圖3-4所示的對話框,對嵌入式軟件包進行管理。⑧UpdaterSettings(更新設置),會打開圖3-3所示的對話框,用于設置軟件庫文件夾,設置軟件檢查更新方式和數據刷新方式。1.選擇MCU創建項目單擊主菜單項File→NewProject,或Home視圖上的ACCESSTOMCUSELECTOR按鈕,都可以打開圖3-7所示的NewProjectfromaMCU/MPU對話框。該對話框用于新建項目,是STM32CubeMX的3個主要視圖之一,用于選擇MCU或開發板以新建項目。NewProjectfromaMCU/MPU對話框有3個界面,MCU/MPUSelector界面用于選擇具體型號的MCU創建項目:BoardSelector界面用于選擇一個開發板創建項目;CrossSelector界面用于對比某個STM32MCU或其他廠家的MCU,選擇一個合適的STM32MCU創建項目。圖3-8所示的是MCU/MPUSelector界面,用于選擇MCU。3.3.2新建項目圖3-8NewProjectfromaMCU/MPU對話框圖3-8左側的MCU/MPUFilters框內是用于MCU篩選的一些功能操作。MCU的篩選主要通過下方的幾組條件進行設置。(1)Core(內核),篩選內核,選項中列出了STM32支持的所有Cortex內核,如圖3-9所示。(2)Series(系列),選擇內核后會自動更新可選的STM32系列列表,圖3-10只顯示了列表的一部分。(3)Line(產品線),選擇某個STM32系列后會自動更新產品線列表中的可選范圍。例如,選擇了STM32F1系列之后,產品線列表中只有STM32F1xx的器件可選。圖3-11是產品線列表的一部分。(4)Package(封裝),根據封裝選擇器件。用戶可以根據已設置的其他條件縮小封裝的選擇范圍。圖3-12是封裝列表的一部分。(5)Other(其他),還可以設置價格、IO引腳數、Flash大小、RAM大小、主頻等篩選條件。如圖3-9選擇Cortex內核圖3-10選擇STM32系列圖3-11選擇產品線圖3-10選擇STM32系列2.選擇開發板新建項目用戶還可以在NewProjectfromaMCU/MPU窗口里選擇開發板新建項目,其界面如圖3-13所示。STM32CubeMX目前僅支持ST官方的開發板。圖3-13選擇開發板新建項目1. 交叉選擇MCU新建項目NewProjectfromaMCU/MPU對話框的第三個界面是CrossSelector,用于交叉選擇MCU新建項目,界面如圖3-14所示。圖3-14交叉選擇MCU新建項目選擇一個MCU創建項目后,界面上顯示的是項目操作視圖。新建項目后的工作界面如圖3-15所示,界面主要由主菜單欄、標簽導航欄和工作區三部分組成。窗口最上方的主菜單欄一直保持不變,標簽導航欄現在有3個層級,最后一個層級顯示了當前工作界面的名稱。導航欄的最右側有一個GENERATECODE按鈕,用于圖形化配置MCU后生成C語言代碼。工作區是一個多頁界面,有4個工作界面。(1)Pinout&Configuration(引腳與配置)界面,這是對MCU的系統內核、外設、中間件和引腳進行配置的界面,是主要的工作界面。(2)ClockConfiguration(時鐘配置)界面,通過圖形化的時鐘樹對MCU的各個時鐘信號頻率進行配置的界面。(3)ProjectManager(項目管理)界面,對項目進行各種設置的界面。3.3.3MCU圖形化配置界面總覽圖3-15MCU引腳配置界面(4)Tools(工具)界面,進行功耗計算、DDRSDRAM適用性分析(僅用于STM32MP1系列)的操作界面。引腳與配置界面是MCU圖形化配置的主要工作界面,如圖3-14所示。這個界面包括ComponentList(組件列表)、Mode&Configuration(模式與配置)、Pinoutview(引腳視圖)、Systemview(系統視圖)和一個工具欄。1. 組件列表位于工作區左側的是MCU可以配置的系統內核、外設和中間件列表,每一項稱為一個組件(Component)。組件列表有兩種顯示方式:分組顯示和按字母順序顯示。單擊界面上的Categories或A->Z頁標簽就可以在這兩種顯示方式之間切換。3.3.4MCU配置在分組顯示狀態下,主要有如下的一些分組(每個分組的具體條目與MCU型號有關,這里選擇的MCU是STM32F103ZE)。①SystemCore(系統內核),有DMA、GPIO、IWDG、NVIC、RCC、SYS和WWDG。②Analog(模擬),片上的ADC和DAC。③Timers(定時器),包括RTC和所有定時器。④Connectivity(通信連接),各種外設接口,包括CAN、ETH、FSMC、I2C、SDIO、SPI、UART、USART、USB_OTG_FS、USB_OTG_HS等接口。⑤Multimedia(多媒體),各種多媒體接口,包括數字攝像頭接口DCMI和數字音頻接口I2S。⑥Security(安全),只有一個RNG(隨機數發生器)。⑦Computing(計算),計算相關的資源,只有一個CRC(循環冗余校驗)。⑧Middleware(中間件),MCU固件庫里的各種中間件,主要有FatFS、FreeRTOS、LibJPEG、LwIP、PDM2PCM、USB_Device、USB_Host等。⑨AdditionalSoftware(其他軟件),組件列表里默認是沒有這個分組的。在初始狀態下,組件列表的各個項前面沒有任何圖標,在對MCU的各個組件做一些設置后,組件列表的各個項前面會出現一些圖標(如圖3-16所示),表示組件的可用性信息。因為MCU引腳基本都有復用功能,設置某個組件可用后,其他一些組和可用標記件可能就不能使用了。這些圖標的意義如表3-1所示。圖3-16組件的上下文幫助功能和可用標記表3-1組件列表條目前圖標的意義2. 組件的模式和配置在圖3-15的組件列表中單擊一個組件后,就會在其右側顯示模式與配置(ModeandConfiguration)界面。這個界面分為上下兩個部分,上方是模式設置界面,下方是參數配置界面,這兩個界面的顯示內容與選擇的具體組件有關。例如,圖3-15顯示的是SystemCore分組里RCC組件的模式和配置界面。RCC用于設置MCU的兩個外部時鐘源,模式選擇界面上高速外部(HighSpeedExternal,HSE)時鐘源的下拉列表框有如下3個選項。(1)Disable,禁用外部時鐘源。(2)BYPASSClockSource,使用外部有源時鐘信號源。(3)Crystal/CeramicResonator,使用外部晶體振蕩器作為時鐘源。3. MCU引腳視圖圖3-15工作區的右側顯示了MCU的引腳圖,在圖上直觀地表示了各引腳的設置情況。通過組件列表對某個組件進行模式和參數設置后,系統會自動在引腳圖上標識出使用的引腳。例如,設置RCC組件的HSE使用外部晶振后,系統會自動將Pin23和Pin24引腳設置為RCC_OSC_IN和RCC_OSC_OUT,這兩個名稱就是引腳的信號(signal)。在MCU的引腳圖上,當鼠標指針移動到某個引腳上時會顯示這個引腳的上下文幫助信息,主要顯示的是引腳編號和名稱。在引腳上單擊鼠標左鍵時,會出現一個引腳功能選擇菜單。圖3-17是單擊引腳PA9時出現的引腳功能選擇菜單。圖3-17引腳PA9的引腳功能選擇菜單用戶還可以在一個引腳上單擊鼠標右鍵調出一個快捷菜單,如圖3-18所示。不過,只有設置了功能的引腳,才有右鍵快捷菜單。此快捷菜單有3個菜單項。圖3-18引腳的快捷菜單(1)EnterUserLabel(輸入用戶標簽),用于輸入一個用戶定義的標簽,這個標簽將取代原來的引腳信號名稱顯示在引腳旁邊。例如,在將PA10設置為USART1_RX引腳后,可以再為其定義標簽GPS_RX,這樣在實際的電路中更容易看出引腳的功能。(2)SignalPinning(信號綁定),單擊此菜單項后,引腳上將會出現一個圖釘圖標,表示將這個引腳與功能信號(如USART1_TX)綁定了,這個信號就不會再自動改變引腳,只可以手動改變引腳。對于已經綁定信號的引腳,此菜單項會變為SignalUnpinning,就是解除綁定。對于未綁定信號的引腳,軟件在自動分配引腳時可能會重新為此信號分配引腳。(3)PinStacking/PinUnstacking(引腳疊加/引腳解除疊加),這個菜單項的功能不明確,手冊里沒有任何說明,ST官網上也沒有明確解答。不要單擊此菜單項,否則影響生成的C語言代碼。4.Pinout菜單在引腳視圖的上方還有一個工具欄,上面有兩個按鈕:Additiona1Software和Pinout。單擊AdditionalSoftware按鈕會打開一個對話框,用于選擇已安裝的STM32Cube擴展包,添加到組件面板的AdditionalSoftware組里。單擊Pinout按鈕會出現一個下拉菜單,菜單項如圖3-19所示。圖3-19引腳視圖上方的Pinout菜單圖3-20Pins/SignalsOptions對話框SetunusedGPIOs(設置未使用的GPIO引腳),用于打開一個圖3-21所示的對話框,對MCU未使用的GPIO引腳進行設置,可設置為Input、Output或Analog模式。一般設置為Analog,以降低功耗。注意,要進行此項設置,必須在SYS組件中設置了調試引腳,例如,設置為5線JTAG。圖3-21設置未使用GPIO引腳的對話框4. 系統視圖在圖3-15所示的芯片圖片的上方有兩個按鈕:Pinoutview(引腳視圖)和Systemview(系統視圖),單擊這兩個按鈕可以在引腳視圖和系統視圖之間切換顯示。圖3-22是系統視圖界面,界面上顯示了MCU已經設置的各種組件,便于對MCU已經設置的系統資源和外設有一個總體的了解。圖3-22系統視圖界面MCU圖形化設置的第二個工作界面是時鐘配置界面。為了充分演示時鐘配置的功能,我們先設置RCC的模式,將HSE和LSE都設置為Crystal/CeramicResonator,并且啟用MasterClockOutput2(MCO2),如圖3-23所示。3.3.5時鐘配置圖3-23RCC模式設置1.功能概述對MCU系統功能和各種外設的圖形化配置,主要是在引腳配置和時鐘配置兩個工作界面完成的,完成這些工作后,一個MCU的配置就完成了。STM32CubeMX的重要作用就是將這些圖形化的配置結果導出為C語言代碼。STM32CubeMX工作區的第3個界面是ProjectManager界面,如圖3-24所示。這個界面是一個多頁界面,有如下3個工作界面。3.3.6項目管理圖3-24項目管理器的Project界面(1)Project界面,用于設置項目名稱、保存路徑、導出代碼的IDE軟件等。(2)CodeGenerator界面,用于設置生成C語言代碼的一些選項。(3)AdvancedSettings界面,生成C語言代碼的一些高級設置,例如,外設初始化代碼是使用HAL庫還是LL庫。2.項目基本信息設置新建的STM32CubeMX項目首次保存時會出現一個選擇文件夾的對話框,用戶選擇一個文件夾后,項目會被保存到文件夾下,并且項目名稱與最后一級文件夾的名稱相同。例如,保存項目時選擇的文件夾是:“D:\Demo\MDK\1-LED\”那么,項目會被保存到此目錄下,并且項目文件名是LED.ioc。(1)ApplicationStructure(應用程序結構),有Basic和Advanced兩個選項。①Basic:建議用于只使用一個中間件,或者不使用中間件的項目。在這種結構里,IDE配置文件夾與源代碼文件夾同級,用子目錄組織代碼。②Advanced:當項目里使用多個中間件時,建議使用這種結構,這樣對于中間件的管理容易一點。(2)Donotgeneratethemain()復選框,如果勾選此項,導出的代碼將不生成main()函數。但是C語言的程序肯定是需要一個main()函數的,所以不勾選此項。(3)ToolchainFolderLocation,也就是導出的IDE項目所在的文件夾,默認與STM32CubeMX項目文件在同一個文件夾。(4)Toolchain/IDE,從一個下拉列表框里選擇導出C語言程序的工具鏈或IDE軟件,下拉列表的選項如圖3-25所示。本書使用的IDE軟件是KeilMDK,Toolchain/IDE選擇MDK-ARM。(1)LinkerSettings(鏈接器設置),用于設置應用程序的堆(Heap)的最小大小,默認值是0x200和0x400。圖3-25可選的工具鏈/IDE軟件列表(2)McuandFirmwarePackage(MCU和固件包),MCU固件庫默認使用已安裝的最新固件庫版本。如果系統中有一個MCU系列多個版本的固件庫,就可以在此重選固件庫。如果勾選UseDefaultFirmwareLocation復選框,則表示使用默認的固件庫路徑,也就是所設置的軟件庫目錄下的相應固件庫目錄。3.代碼生成器設置CodeGenerator界面如圖3-26所示,用于設置生成代碼時的一些特性。圖3-26CodeGenerator界面的設置內容4.高級設置AdvancedSettings界面如圖3-27所示,分為上下兩個列表。(1)DriverSelector列表,用于選擇每個組件的驅動庫類型。該列表列出了所有已配置的組件,如USART、RCC等,第2列是組件驅動庫類型,有HAL和LL兩種庫可選。HAL是高級別的驅動程序,MCU上所有的組件都有HAL驅動程序。HAL的代碼與具體硬件的關聯度低,易于在不同系列的器件之間移植。圖3-27AdvancedSettings界面的設置內容(2)GeneratedFunctionCalls列表,對生成函數的調用方法進行設置。在對MCU進行各種配置以及對項目進行設置后,用戶就可以生成報告和代碼。單擊主菜單項File→GenerateReport,會在STM32CubeMX項目文件目錄下生成一個同名的PDF文件。這個PDF文件里有對項目的基本描述、MCU型號描述、引腳配置圖、引腳定義表格、時鐘樹、各種外設的配置信息等,是對STM32CubeMX項目的一個很好的總結性報告。3.3.7生成報告和代碼保存STM32CubeMX項目并在項目管理界面做好生成代碼的設置后,用戶隨時可以單擊導航欄右端的GENERATECODE按鈕,為選定的MDK-ARM軟件生成代碼。如果是首次生成代碼,將自動生成MDK-ARM項目框架,生成項目所需的所有文件;如果MDK-ARM項目已經存在,再次生成代碼時只會重新生成初始化代碼,不會覆蓋用戶在沙箱段內編寫的代碼,也不會刪除用戶在項目中創建的程序文件。STM32CubeMX軟件的工作區還有一個Tools界面,用于進行MCU的功耗計算,這會涉及MCU的低功耗模式。HAL庫就是ST有限公司目前主推的研發方式,其更新速度比較快,可以通過官方推出的STM32CubeMX工具直接一鍵生成代碼,開發周期大大縮短了。使用HAL庫的優勢主要就是不需要開發工程師再設計所用的MCU的型號,只需要專注于所要的功能的軟件開發工作即可。3.4HAL庫STM32HAL固件庫是HardwareAbstractionLayer的縮寫,中文名稱是:硬件抽象層。HAL庫是ST有限公司TM32的MCU最新推出的抽象層嵌入式軟件,為更方便的實現跨STM32產品的最大可移植性。和標準外設庫(也稱標準庫)對比起來,STM32的HAL庫更加抽象。ST有限公司為開發者提供了非常方便的開發庫:有標準外設庫(SPL庫)、HAL庫(HardwareAbstractionLayer,硬件抽象層庫)、LL庫(Low-Layer,底層庫)三種。前者是ST的老庫已經停止更新了,后兩者是ST現在主推的開發庫。3.4.1HAL庫簡介相比標準外設庫,STM32CubeHAL庫表現出更高的抽象整合水平,HALAPI集中關注各外設的公共函數功能,這樣便于定義一套通用的用戶友好的API函數接口,從而可以輕松實現從一個STM32產品移植到另一個不同的STM32系列產品。HAL庫是ST有限公司未來主推的庫,ST有限公司新出的芯片已經沒有標準庫了,比如F7系列。目前,HAL庫已經支持STM32全線產品。通過文字描述可以知道HAL庫的幾個特點:(1)最大可移植性。(2)提供了一整套一致的中間件組件,如RTOS,USB,TCP/IP和圖形等。(3)通用的用戶友好的API函數接口。(4)ST有限公司新出的芯片已經沒有標準庫。(5)HAL庫已經支持STM32全線產品。通常新手在入門STM32的時候,首先都要先選擇一種要用的開發方式,不同的開發方式會導致你編程的架構是完全不一樣的。一般大多數都會選用標準庫和HAL庫,而極少部分人會通過直接配置寄存器進行開發。1. 直接配置寄存器不少先學了MCS-51單片機的讀者可能會知道,會有一小部分人是通過匯編語言直接操作寄存器實現功能的,這種方法到了STM32就變得不太容易行得通了,因為STM32的寄存器數量是MCS-51單片機的數十倍,如此多的寄存器根本無法全部記憶,開發時需要經常的翻查芯片的數據手冊,此時直接操作寄存器就變得非常的費力了。但還是會有很小一部分人,喜歡去直接操作寄存器,因為這樣更接近原理,知其然也知其所以然。2. 標準庫STM32有非常多的寄存器,而導致了開發困難,所以為此ST有限公司就為每款芯片都編寫了一份庫文件,也就是工程文件里stm32F1xx…之類的。在這些.c和.h文件中,包括一些常用量的宏定義,把一些外設也通過結構體變量封裝起來,如GPIO口等。所以只需要配置結構體變量成員就可以修改外設的配置寄存器,從而選擇不同的功能。也是目前最多人使用的方式,也是學習STM32接觸最多的一種開發方式,這里就不多闡述了。3. HAL庫HAL庫是ST有限公司目前主力推的開發方式,全稱就是HardwareAbstractionLayer(硬件抽象層)。同樣的功能,標準庫可能要用幾句話,HAL庫只需用一句話就夠了。并且HAL庫也很好的解決了程序移植的問題,不同型號的STM32芯片它的標準庫是不一樣的,例如在STM32F4上開發的程序移植到STM32F1上是不通用的,而使用HAL庫,只要使用的是相同的外設,程序基本可以完全復制粘貼。4. HAL庫和標準固件庫區別STM32的開發中,可以操作寄存器:GPIOF->BSRR=0x00000001;//這里是針對STM32F1系列這種方法當然可以,但是這種方法的劣勢需要去掌握每個寄存器的用法,才能正確使用STM32,而對于STM32這種級別的MCU,數百個寄存器記起來又是談何容易。于是ST有限公司推出了官方標準固件庫,標準固件庫將這些寄存器底層操作都封裝起來,提供一整套接口(API)供開發者調用,大多數場合下,不需要去知道操作的是哪個寄存器,只需要知道調用哪些函數即可。比如上面的控制BRR寄存器實現電平控制,官方庫封裝了一個函數:voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint_tGPIO_Pin{GPIOx->BRR=GPIO_Pin}這個時候不需要再直接去操作BRR寄存器了,只需要知道怎么使用GPIO_ResetBits()這個函數就可以了。在對外設的工作原理有一定的了解之后,再去看標準庫函數,基本上函數名字能告訴這個函數的功能是什么,該怎么使用,這樣開發就方便很多。標準固件庫自推出以來受到廣大工程師推崇,現在很多工程師和公司還在使用標準庫函數開發。不過,ST官方已經不再更新STM32標準固件庫,而是力推新的固件庫:HAL庫。比如上面的控制BSRRL寄存器實現電平控制,官方HAL庫封裝了一個函數:voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState){/*Checktheparameters*/assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if(PinState!=GPIO_PIN_RESET){GPIOx->BSRR=GPIO_Pin;}

else{GPIOx->BSRR=(uint32_t)GPIO_Pin<<16u;}}這個時候不需要再直接去操作BSRRL寄存器了,只需要知道怎么使用HAL_4.HAL庫移植使用的基本步驟HAL庫移植使用的基本步驟如下:(1)復制stm32f1xx_hal_msp_template.c,參照該模板,依次實現用到的外設的HAL_PPP_MspInit()和HAL_PPP_MspDeInit。(2)復制stm32f1xx_hal_conf_template.h,用戶可以在此文件中自由裁剪,配置HAL庫。(3)在使用HAL庫時,必須先調用函數:HAL_StatusTypeDefHAL_Init(void)(該函數在stm32f1xx_hal.c中定義,也就意味著第一點中,必須首先實現HAL_MspInit(void)和HAL_MspDeInit(void))(4)HAL庫與標準庫不同,HAL庫使用RCC中的函數來配置系統時鐘,用戶需要單獨寫時鐘配置函數(標準庫默認在system_stm32f1xx.c中)(5)關于中斷,HAL提供了中斷處理函數,只需要調用HAL提供的中斷處理函數。用戶自己的代碼,不建議先寫到中斷中,而應該寫到HAL提供的回調函數中。(6)對于每一個外設,HAL都提供了回調函數,回調函數用來實現用戶自己的代碼。整個調用結構由HAL庫自己完成。例如:UART中,HAL庫提供了voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);函數,用戶只需要觸發中斷后,用戶只需要調用該函數即可,同時,自己的代碼寫在對應的回調函數中即可!如下:voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);使用了哪種就用哪個回調函數即可。綜上所述,使用HAL庫編寫程序(針對某個外設)的基本結構(以串口為例)如下:(1)配置外設句柄例如,建立UartConfig.c,在其中定義串口句柄UART_HandleTypeDefhuart;,接著使用初始化句柄(HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDefhuart))(2)編寫MSP函數例如,建立UartMsp.c,在其中實現voidHAL_UART_MspInit(UART_HandleTypeDefhuart)和voidHAL_UART_MspDeInit(UART_HandleTypeDef*huart)(3)實現對應的回調函數例如,建立UartCallBack.c,在其中實現上文所說明的三大回調函數中的完成回調函數和錯誤回調函數。ST有限公司為開發者提供了非常方便的開發庫。到目前為止,有標準外設庫、HAL庫和LL庫三種。其中標準外設庫與HAL庫是最常用的庫,LL庫只是最近新添加的庫。(1)標準外設庫(StandardPeripheralsLibrary)是對STM32芯片的一個完整的封裝。以前對芯片外設的操作都是直接操作寄存器,這使得開發非常困難。ST有限公司為了解決這個難題,給每款芯片都編寫了一份庫文件,也就是標準外設庫。這也是目前使用最多的ST庫,幾乎全部使用C語言實現。但是,標準外設庫是針對某一系列芯片而言的,沒有可移植性。3.4.2HAL庫和標準外設庫及LL庫的區別(2)HAL庫是ST有限公司目前主推的開發方式。它的出現比標準庫要晚,但其實和標準庫一樣,都是為了節省程序開發的時間,而且HAL庫更有效。如果說標準庫為了實現對芯片外設的操作功能,把需要配置的寄存器集成了,那么HAL庫的一些函數甚至做到了某些特定功能的集成。也就是說,同樣的功能,標準庫可能要用幾句話,HAL庫只需用一句話就夠了,并且HAL庫也很好地解決了程序移植的問題。(3)LL庫(LowLayer)是ST最近新增的庫,與HAL庫捆綁發布,文檔也是和HAL庫文檔在一起的,比如:在STM32F3x的HAL庫說明文檔中,ST有限公司新增了LL庫這一章節,但是在STM32F2x的HAL文檔中就沒有。LL庫更接近硬件層,對需要復雜上層協議棧的外設不適用。LL庫直接操作寄存器,支持所有外設。使用方法包括:①獨立使用,該庫完全獨立實現,可以完全拋開HAL庫,只用LL庫編程完成。在使用STM32CubeMX生成項目時,直接選LL庫即可。如果使用了復雜的外設,例如USB,則會調用HAL庫②混合使用,和HAL庫結合使用。1.什么是回調函數回調函數就是一個被作為參數傳遞的函數。在C語言中,回調函數只能使用函數指針實現,在C++、Python、ECMAScript等更現代的編程語言中還可以使用仿函數或匿名函數。回調函數的使用可以大大提升編程的效率,這使得它在現代編程中被非常多地使用。同時,有一些需求必須要使用回調函數來實現。函數指針的調用,即是一個通過函數指針調用的函數。如果把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,就說這是回調函數。即:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調用執行,就叫做回調。如果代碼立即被執行就稱為同步回調,如果在之后晚點的某個時間再執行,則稱為異步回調。3.4.3回調函數2.為什么要使用回調函數回到函數作用:“解耦”,普通函數代替不了回調函數的這個特點。這是回調函數最大的特點。#include<stdio.h>#include<freeLib.h>//CallbackFunctionintCallback(){//TODOfunc();return0;}//Mainprogramintmain(){//TODOLibrary(Callback);return0;}MSP,全稱為MCUsupportpackage,MCU支持包,函數名字中帶有MspInit的函數,它們的作用是進行MCU級別硬件初始化設置,并且它們通常會被上一層的初始化函數所調用,這樣做的目的是為了把MCU相關的硬件初始化剝奪出來,方便用戶代碼在不同型號的MCU上移植。3.4.4MSP的作用1.基本數據類型對STM32系列MCU編程使用的是C語言或C++語言。C語言整數類型的定義比較多,STM32編程中一般使用簡化的定義符號,這些常用整數類型的類型符號及其等效定義如表3-2所示。3.4.5HAL庫的基本問題表3-2STM32編程中的數據類型簡化定義符號2.一些通用定義在HAL庫中,有一些類型或常量是經常用到的,包括如下的一些。(1)文件stm32f1xx_hal_def.h中定義的表示函數返回值類型的枚舉類型HAL_StatusTypeDef,定義如下:typedefenum{HAL_OK=0x000,HAL_ERROR=0x010,HAL_BUSY=0x02U,HAL_TIMEOUT=0x03U}HAL_StatusTypeDef;很多函數返回值的類型是HAL_StatusTypeDef,以表示函數運行是否成功或其他狀態(2)文件stm32f1xx.h中定義的幾個通用的枚舉類型和常量,定義如下:typedefenum{RESET=0U,RESET=0USET=!RESET}FlagStatus,ITStatus;//一般用于判斷標志位是否置位typedefenum{DISABLE=OU,ENABLE=!DISABLE}FunctionalState;//一般用于設置某個邏輯型參數的值typedefenum{SUCCESS=0U,ERROR=!SUCCESS}ErrorStatus;//一般用于函數返回值,表示成功或失敗兩種狀態第7章STM32定時器

系統本章講述了STM32定時器系統,包括STM32定時器概述、基本定時器、通用定時器、STM32定時器HAL庫函數、采用STM32Cube和HAL庫的定時器應用實例。7.1STM32定時器概述從本質上講定時器就是“數字電路”課程中學過的計數器(Counter),它像“鬧鐘”一樣忠實地為處理器完成定時或計數任務,幾乎是所有現代微處理器必備的一種片上外設。很多讀者在初次接觸定時器時,都會提出這樣一個問題:既然Arm內核每條指令的執行時間都是固定的,且大多數是相等的。那么我們可以來用軟件的方法實現定時嗎?例如、在168MHz系統時鐘下要實現1μs的定時,完全可以通過執行168條不影響狀態的“無關指令”實現。既然這樣,STM32中為什么還要有“定時/計數器”這樣一個完成定時工作的硬件結構呢?確實可以通過插入若干條不產生影響的“無關指令”實現固定時間的定時。但這會帶來兩個問題:其一,在這段時間中,STM32不能做其他任何事情,否則定時將不再準確。其二,這些“無關指令”會占據大量程序空間。而當嵌入式處理器中集成了硬件的定時以后,它就可以在內核運行執行其他任務的同時完成精確的定時,并在定時結束后通過中斷/事件等方法通知內核或相關外設。簡單地說。定時器最重要的作用就是將STM32的Arm內核從簡單、重復的延時工作中解放出來。定時與計數的應用十分廣泛。在實際生產過程中,許多場合都需要定時或者計數操作。例如產生精確的時間,對流水線上的產品進行計數等。因此,定時/計數器在嵌入式單片機應用系統中十分重要。定時和計數可以通過以下方式實現:1. 軟件延時單片機是在一定時鐘下運行的,可以根據代碼所需的時鐘周期來完成延時操作,軟件延時會導致CPU利用率低。因此主要用于短時間延時,如高速A/D轉換器。延時的純軟件方式實現起來非常簡單,但具有以下缺點:(1)對于不同的微控制器,每條指令的執行時間不同,很難做到精確延時。例如,在上面講到的LED閃爍應用案例中,如果要使LED點亮和熄滅的時間精確到各為500ms,對應軟件實現的循環語句中決定延時時間的變量nCount的具體取值很難由計算準確得出。(2)延時過程中CPU始終被占用,CPU利用率不高。

雖然純軟件定時/計數方式有以上缺點,但由于其簡單方便、易于實現等優點,在當今的嵌入式應用中,尤其在短延時和不精確延時中,被頻繁地使用。例如,高速ADC的轉換時間可能只需要幾個時鐘周期,這種情況下,使用軟件延時反而效率更高。2. 可編程定時/計數器微控制器中的定時器本質上是一個計數器,可以對內部脈沖或外部輸入進行計數,不僅具有基本的延時/計數功能,還具有輸入捕獲、輸出比較和PWM波形輸出等高級功能。在嵌入式開發中,充分利用定時器的強大功能,可以顯著提高外設驅動的編程效率和CPU利用率,增強系統的實時性。STM32內部集成了多個定時/計數器。根據型號不同,STM32系列芯片最多包含8個定時/計數器。其中,TIM6和TIM7為基本定時器,TIM2~TIM5為通用定時器,TIM1和TIM8為高級控制定時器,功能最強。三種定時器具備的功能如表7-1所示。此外,在STM32中還有兩個看門狗定時器和一個系統滴答定時器。

在嵌入式系統應用中,使用定時器可以完成以下功能:(1)在多任務的分時系統中用作中斷來實現任務的切換。(2)周期性執行某個任務,如每隔固定時間完成一次A/D采集。(3)延時一定時間執行某個任務,如交通燈信號變化。(4)顯示實時時間,如萬年歷。(5)產生不同頻率的波形,如MP3播放器。(6)產生不同脈寬的波形,如驅動伺服電機。(7)測量脈沖的個數,如測量轉速。(8)測量脈沖的寬度,如測量頻率。STM32F407相比于傳統的51單片機要完善和復雜得多,它是專為工業控制應用量身定做,定時器有很多用途,包括基本定時功能、生成輸出波形(比較輸出、PWM和帶死區插入的互補PWM)和測量輸入信號的脈沖寬度(輸入捕獲)等。STM32F407微控制器共有17個定時器,包括2個基本定時器(TIM6和TIM7)、10個通用定時器(TIM2~TIM5和TIM9~TIM14)及2個高級定時器(TIM1和TIM8)、2個看門狗定時器和1個系統嘀嗒定時器(SysTick)。STM32F407基本定時器TIM6和TIM7各包含一個16位自動裝載計數器,由各自的可編程預分頻器驅動。它們可以作為通用定時器提供時間基準,特別是可以為數模轉換器(DAC)提供時鐘。TIM6和TIM7定時器的主要功能包括:(1)16位自動重裝載累加計數器。(2)16位可編程(可實時修改)預分額器,用于對輸入的時鐘按系數為1~65536之間的任意數值分頻。7.2STM32基本定時器7.2.1基本定時器介紹(3)觸發DAC的同步電路。(4)在更新事件(計數器溢出)時產生中斷/DMA請求?;径〞r器內部結構如圖7-1所示。圖7-1基本定時器結構框圖7.2.2基本定時器的功能1.時基單元可編程通用定時器的主要部分是一個16位計數器和與其相關的自動裝載寄存器。這個計數器可以向上計數、向下計數或者向上向下雙向計數。此計數器時鐘由預分頻器分頻得到。計數器、自動裝載寄存器和預分頻器寄存器可以由軟件讀寫,在計數器運行時仍可以讀寫。時基單元包含:計數器寄存器(TIMx_CNT)、預分頻器寄存器(TIMx_PSC)和自動裝載寄存器(TIMx_ARR)。預分頻器可以將計數器的時鐘頻率按1~65536的任意值分頻。它是基于一個(在TIMx_PSC寄存器中的)16位寄存器控制的16位計數器。時基單元包含:(1)計數器寄存器(TIMx_CNT)。(2)預分頻寄存器(TIMx_PSC)。(3)自動重裝載寄存器(TIMx_ARR)。1. 軟件延時單片機是在一定時鐘下運行的,可以根據代碼所需的時鐘周期來完成延時操作,軟件延時會導致CPU利用率低。因此主要用于短時間延時,如高速A/D轉換器。延時的純軟件方式實現起來非常簡單,但具有以下缺點:(1)對于不同的微控制器,每條指令的執行時間不同,很難做到精確延時。例如,在上面講到的LED閃爍應用案例中,如果要使LED點亮和熄滅的時間精確到各為500ms,對應軟件實現的循環語句中決定延時時間的變量nCount的具體取值很難由計算準確得出。(2)延時過程中CPU始終被占用,CPU利用率不高。

2.時鐘源從STM32F407定時器內部結構圖可以看出,基本定時器TIM6和TIM7只有一個時鐘源,即內部時鐘CK_INT。對于STM32F407所有的定時器,內部時鐘CK_INT都來自RCC的TIMxCLK,但對于不同的定時器,TIMxCLK的來源不同?;径〞r器TIM6和TIM7的TIMxCLK來源于APB1預分頻器的輸出,系統默認情況下,APB1的時鐘頻率為72MHz。3.預分頻器預分頻可以以系數介于1~65536之間的任意數值對計數器時鐘分頻。它是通過一個16位寄存器(TIMx_PSC)的計數實現分頻。因為TIMx_PSC控制寄存器具有緩沖作用,可以在運行過程中改變它的數值,新的預分頻數值將在下一個更新事件時起作用。圖7-2是在運行過程中改變預分頻系數的例子,預分頻系數從1變到2。圖7-2預分頻系數從1變到2的計數器時序圖4.計數模式STM32F407基本定時器只有向上計數工作模式,其工作過程如圖7-3所示,其中↑表示產生溢出事件。圖7-3向上計數工作模式基本定時器工作時,脈沖計數器TIMx_CNT從0累加計數到自動重裝載數值(TIMx_ARR寄存器),然后重新從0開始計數并產生一個計數器溢出事件。由此可見,如果使用基本定時器進行延時,延時時間可以由以下公式計算:延時時間=(TIMx_ARR+1)(TIMx_PSC+1)/TIMxCLK當發生一次更新事件時,所有寄存器會被更新并設置更新標志:傳送預裝載值(TIMx_PSC寄存器的內容)至預分頻器的緩沖區,自動重裝載影子寄存器被更新為預裝載值(TIMx_ARR)。以下是一些在TIMx_ARR=0x36時不同時鐘頻率下計數器工作的圖示例子。圖7-4內部時鐘分頻系數為1,圖7-5內部時鐘分頻系數為2。圖7-4計數器時序圖(內部時鐘分頻系數為1)圖7-5計數器時序圖(內部時鐘分頻系數為2)7.2.3STM32基本定時器的寄存器現將STM32F407基本定時器相關寄存器名稱介紹如下,可以用半字(16位)或字(32位)的方式操作這些外設寄存器,由于是采用庫函數方式編程,故不作進一步的探討。(1)TIM6和TIM7控制寄存器1(TIMx_CR1)。(2)TIM6和TIM7控制寄存器2(TIMx_CR2)。(3)TIM6和TIM7DMA/中斷使能寄存器(TIMx_DIER)。(4)TIM6和TIM7狀態寄存器(TIMx_SR)。(5)TIM6和TIM7事件產生寄存器(TIMx_EGR)。(6)TIM6和TIM7計數器(TIMx_CNT).(7)TIM6和TIM7預分頻器(TIMx_PSC)。(8)TIM6和TIM7自動重裝載寄存器(TIMx_ARR)。STM32內置10個可同步運行的通用定時器(TIM2、TIM3、TIM4、TIM5、TIM9、TIM10、TIM11、TIM12、TIM13、TIM14),TIM2和TIM5定時器的計數長度為32位,其余定時器的計數長度為16位,每個通道都可用于輸入捕獲、輸出比較、PWM和單脈沖模式輸出。任一標準定時器都能用于產生PWM輸出。每個定時器都有獨立的DMA請求機制。通過定時器鏈接功能與高級控制定時器共同工作,提供同步或事件鏈接功能。7.3STM32通用定時器7.3.1通用定時器介紹通用TIMx(TIM2、TIM3、TIM4和TIM5)定時器功能包括:(1)16位或32位向上、向下、向上/向下自動裝載計數器。(2)16位或32位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻系數為1~65536之間的任意數值。(3)4個獨立通道:①輸入捕獲。②輸出比較。③PWM生成(邊緣或中間對齊模式)。④單脈沖模式輸出。(4)使用外部信號控制定時器和定時器互連的同步電路。(5)如下事件發生時產生中斷/DMA:①更新,計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)。②觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)。③輸入捕獲。④輸出比較。(6)支持針對定位的增量(正交)編碼器和霍爾傳感器電路。(7)觸發輸入作為外部時鐘或者按周期的電流管理。通用定時器內部結構如圖7-6所示,相比于基本定時器其內部結構要復雜得多,其中最顯著的地方就是增加了4個捕獲/比較寄存器TIMx_CCR,這也是通用定時器之所以擁有那么多強大功能的原因。7.3.2通用定時器的功能描述圖7-6通用定時器內部結構框圖1. 時基單元可編程通用定時器的主要部分是一個16位計數器和與其相關的自動裝載寄存器。這個計數器可以向上計數、向下計數或者向上向下雙向計數。此計數器時鐘由預分頻器分頻得到。計數器、自動裝載寄存器和預分頻器寄存器可以由軟件讀寫,在計數器運行時仍可以讀寫。時基單元包含:計數器寄存器(TIMx_CNT)、預分頻器寄存器(TIMx_PSC)和自動裝載寄存器(TIMx_ARR)。2. 計數模式TIM2~TIM5可以向上計數、向下計數、向上向下雙向計數。(1)向上計數模式向上計數模式工作過程同基本定時器向上計數模式,工作過程如圖7-4所示。在向上計數模式中,計數器在時鐘CK_CNT的驅動下從0計數到自動重裝載寄存器TIMx_ARR的預設值,然后重新從0開始計數,并產生一個計數器溢出事件,可觸發中斷或DMA請求。當發生一個更新事件時,所有的寄存器都被更新,硬件同時設置更新標志位。對于一個工作在向上計數模式下的通用定時器,當自動重裝載寄存器TIMx_ARR的值為0x36,內部預分頻系數為4(預分頻寄存器TIMx_PSC的值為3)的計數器時序圖如圖7-7所示。圖7-7計數器時序圖(內部時鐘分頻因子位4)(2)向下計數模式通用定時器向下計數模式工作過程如圖7-8所示。圖7-8向下計數工作模式對于一個工作在向下計數模式下的通用定時器,當自動重裝載寄存器TIMx_ARR的值為0x36,內部預分頻系數為2(預分頻寄存器TIMx_PSC的值為1)的計數器時序圖如圖7-9所示。圖7-9計數器時序圖(內部時鐘分頻因子位4)(3)向上/向下計數模式向上/向下計數模式又稱為中央對齊模式或雙向計數模式,其工作過程如圖7-10所示。圖7-10向上/向下計數模式對于一個工作在向上/向下計數模式下的通用定時器,當自動重裝載寄存器TIMx_ARR的值為0x06,內部預分頻系數為1(預分頻寄存器TIMx_PSC的值為0)的計數器時序圖如圖7-11所示。圖7-11計數器時序圖(內部時鐘分頻因子為1)3.時鐘選擇相比于基本定時器單一的內部時鐘源,STM32F407通用定時器的16位計數器的時鐘源有多種選擇,可由以下時鐘源提供。(1)內部時鐘(CK_INT)(2)外部輸入捕獲引腳TIx(外部時鐘模式1)(3)外部觸發輸入引腳ETR(外部時鐘模式2)(4)內部觸發器輸入ITRx4.捕獲/比較通道每一個捕獲/比較通道都是圍繞一個捕獲/比較寄存器(包含影子寄存器),包括捕獲的輸入部分(數字濾波、多路復用和預分頻器)和輸出部分(比較器和輸出控制)。1.輸入捕獲模式在輸入捕獲模式下,當檢測到ICx信號上相應的邊沿后,計數器的當前值被鎖存到捕獲/比較寄存器(TIMx_CCRx)中。當捕獲事件發生時,相應的CCxIF標志(TIMx_SR寄存器)被置為1,如果使能了中斷或者DMA操作,則將產生中斷或者DMA操作。如果捕獲事件發生時CCxIF標志已經為高,那么重復捕獲標志CCxOF(TIMx_SR寄存器)被置為1。寫CCxIF=0可清除CCxIF,或讀取存儲在TIMx_CCRx寄存器中的捕獲數據也可清除CCxIF。寫CCxOF=0可清除CCxOF。7.3.3通用定時器的工作模式2.PWM輸入模式該模式是輸入捕獲模式的一個特例,除下列區別外,操作與輸入捕獲模式相同:(1)2個ICx信號被映射至同一個TIx輸入。(2)這2個ICx信號為邊沿有效,但是極性相反。(3)其中一個TIxFP信號被作為觸發輸入信號,而從模式控制器被配置成復位模式。例如,需要測量輸入到TI1上的PWM信號的長度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具體步驟如下(取決于CK_INT的頻率和預分頻器的值):(1)選擇TIMx_CCR1的有效輸入:置TIMx_CCMR1寄存器的CC1S=01(選擇TI1)。(2)選擇TI1FP1的有效極性(用來捕獲數據到TIMx_CCR1中和清除計數器):置CC1P=0(上升沿有效)。(3)選擇TIMx_CCR2的有效輸入:置TIMx_CCMR1寄存器的CC2S=10(選擇14478(4)選擇TI1FP2的有效極性(捕獲數據到TIMx_CCR2):置CC2P=1(下降沿有效)。(5)選擇有效的觸發輸入信號:置TIMx_SMCR寄存器中的TS=101(選擇TI1FP1)。(6)配置從模式控制器為復位模式:置TIMx_SMCR中的SMS=100。(7)使能捕獲:置TIMx_CCER寄存器中CC1E=1且CC2E=1。3. 強置輸出模式在輸出模式(TIMx_CCMRx寄存器中CCxS=00)下,輸出比較信號(OCxREF和相應的OCx)能夠直接由軟件強置為有效或無效狀態,而不依賴于輸出比較寄存器和計數器間的比較結果。4.輸出比較模式此項功能是用來控制一個輸出波形,或者指示一段給定的時間已經到時。5. PWM模式PWM輸出模式是一種特殊的輸出模式,在電力、電子和電機控制領域得到廣泛應用。(1)PWM簡介PWM是PulseWidthModulation的縮寫,中文意思就是脈沖寬度調制,簡稱脈寬調制。它是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,其控制簡單、靈活和動態響應好等優點而成為電力、電子技術最廣泛應用的控制方式,其應用領域包括測量、通信、功率控制與變換,電動機控制、伺服控制、調光、開關電源,甚至某些音頻放大器,因此研究基于PWM技術的正負脈寬數控調制信號發生器具有十分重要的現實意義。(2)PWM實現目前,在運動控制系統或電動機控制系統中實現PWM的方法主要有傳統的數字電路、微控制器普通I/O模擬和微控制器的PWM直接輸出等。①傳統的數字電路方式:用傳統的數字電路實現PWM(如555定時器),電路設計較復雜,體積大,抗干擾能力差,系統的研發周期較長。②微控制器普通I

溫馨提示

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

評論

0/150

提交評論