最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255
第1章 初學STM32F429的准備工作
俗話說萬事開頭難,學習一門新的知識,難的往往不是知識本身,而是如何快速上手,需要什么資料和開發環境。一旦上手后,深入的學習就相對容易些了。
1.1 初學者重要提示
1.2 開發環境說明
1.3 F1和F429系列的區別
1.4 STM32F429開發資源查找
1.5 HAL庫介紹
1.6 CMSIS軟件包
1.7 STM32CubeMX圖形平台
1.8 STM32F429調試方法
1.9 STM32F429出現硬件異常的解決辦法
1.10總結
1.1 初學者重要提示
- 關於學習方法問題,可以看附件章節A。
- 學會 STM32F429相關資源的獲取方法,做到心中有數,否則心里老是沒底。
- 關於MDK和IAR兩種編譯器,推薦都掌握,以其中一個為主,另一個為輔。因為很多時候我們需要參考的工程代碼不是自己熟悉的編譯器,就會很被動。
- 這幾年涌現出好幾款非常棒的調試工具(如Event Recoder,SEGGER RTT),教程的后面章節會為大家做講解。
1.2 開發環境說明
1、 IDE:支持兩種IDE開發環境,MDK和IAR
- MDK推薦使用MDK5.26正式版及其以上版本。
- IAR固定使用IAR8.3版本,由於IAR向下兼容性稍差,其它版本未做支持。
2、 調試器使用JLINK,CMSIS-DAP,ULINK或者STLINK均可。
3、 配套開發板是安富萊的:STM32-V6開發板,MCU是STM32F429BIT6。
1.3 F1和F429系列的區別
F1和F4系列的區別。
- F1采用Crotex M3內核,F429采用Crotex M4內核。
- F1最高主頻 72MHz, F429最高主頻180MHz。
- F429具有單精度浮點運算單元,F1沒有浮點運算單元。
- F429的具備增強的DSP指令集。F429的執行16位DSP指令的時間只有F1的30%~70%。F429執行32位DSP指令的時間只有F1的25%~60%。
- F1內部SRAM最大64K字節,F429 SRAM有256K字節(192K+64K+16K+64KB)。
- F429有備份域SRAM(通過Vbat供電保持數據),F1沒有備份域SRAM。
- F429從內部SRAM和外部FMC存儲器執行程序的速度比F1快很多。F1的指令總線I-Bus只接到Flash上,從SRAM和FMC取指令只能通過S-Bus,速度較慢。F429的I-Bus不但連接到Flash上,而且還連接到SRAM和FMC上,從而加快從SRAM或FMC取指令的速度。
- F1最大封裝為144腳,可提供112個GPIO;F429最大封裝有216腳,可提供168個GPIO。
- F1的GPIO的內部上下拉電阻配置僅僅針對輸入模式有用,輸出時無效。而F429的GPIO在設置為輸出模式時,上下拉電阻的配置依然有效。即F429可以配置為開漏輸出,內部上拉電阻使能,而F1不行。
- F429的GPIO最高翻轉速度為90MHz,F1最大翻轉速度只有18MHz。
- F1最多可提供5個UART串口,F429最多可以提供8個UART串口。
- F1可提供2個I2C接口,F429可以提供3個I2C接口。
- F1和F429都具有3個12位的獨立ADC,F1可提供21個輸入通道,F429可以提供24個輸入通道。F1的ADC最大采樣頻率為1Msps,2路交替采樣可到2Msps(F1不支持3路交替采樣)。F4的ADC最大采樣頻率為2.4Msps,3路交替采樣可到7.2Msps。
- F1只有12個DMA通道,F429有16個DMA通道。F429的每個DMA通道有4*32位FIFO,F1沒有FIFO。
- F1的SPI時鍾最高速度為 18MHz, F429可以到45MHz。
- F1沒有獨立的32位定時器(32位需要級聯實現),F429的TIM2和TIM5具有32位上下計數功能。
- F1和F429都有2個I2S接口,但是F1的I2S只支持半雙工(同一時刻要么放音,要么錄音),而F429的I2S支持全雙工,放音和錄音可以同時進行。
- 從編程的角度來說,M3和M4幾乎沒有區別。而性能上區別可以看此貼:http://www.armbbs.cn/forum.php?mod=viewthread&tid=21850
總的來說,主要有上面這四點不同,其它地方與使用F1,F4系列是相同的。
1.4 STM32F429開發資源查找
學習一款新的芯片,需要大家從官方獲取兩方面的資料,一個是相關的技術文檔,比如參數手冊、數據手冊、應用筆記等;另一個是軟件包,官方在軟件包中提供了外設驅動庫和基於此庫的大量例程。
1.4.1 開發文檔
學習STM32F429主要下載哪些相關手冊呢?主要有以下幾個,這幾個手冊是我們經常要使用到的,不光學習STM32需要這類手冊,學習FPGA、DSP也是這些類型的手冊,熟練查閱和使用這些手冊也是電子工程師必備的知識之一。
- 參考手冊(Reference Manual)
對芯片每個外設的具體描述和功能介紹,比如我們要查USART,SPI,DMA相關寄存器和功能的介紹就可以使用這個手冊。
- 數據手冊(Data Sheet)
在我們要畫PCB的時候用到這個手冊的情況比較多,這個手冊上面有關於這個系列芯片的引腳定義、電氣特性、機械封裝、料號定義等信息。
- 勘誤手冊(Errata Sheet)
描述了芯片某些功能的局限性,並給出解決辦法。這個手冊也比較重要,有時候我們覺得有些地方調試老是出問題,就需要查找一下,看看是否是硬件bug。
- 閃存編程手冊(Flash Programming Manual)
芯片的片上Flash操作指南,比如芯片的擦除,編程,閃存讀寫保護,選項字節信息等。
- 內核編程手冊(Cortex-M Programming Manual)
對內核的系統控制塊的介紹。這個手冊有時候也要用到,比如我們需要了解NVIC和SysTick相關的寄存器,就需要使用這個手冊。這個手冊可以在ARM官方網站下載,也可以到ST官網下載,區別是ARM官網下載的手冊是通用的,而ST的是針對自家芯片做的。有時候在參考手冊上面找不到相關寄存器的信息時,就需要用到這個手冊。
- 應用筆記(Application Note)
針對不同應用主題的描述性文檔,部分筆記還會有配套的固件例程。應用筆記的重要性不言而喻,很多時候官方對一些應用做出了解決方案,都會以應用筆記的形式發布。
- 用戶手冊(User Manual)
一般是對某個軟件庫的說明文檔。
- Cortex-M3/M4權威指南
這也是非常重要的參考資料,對於有興趣了解M3/M4內核的同學,這個資料相當重要,了解了內核才能更好的利用M3/M4。論壇下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=2161 。
了解了這些手冊的作用以后,我們學習如何在官網上面查找這些文檔。前幾年ST官方升級后,通過頁面超鏈接的方式查找非常不方便,當前推薦直接在官方右上角的方框里面檢索即可,比如使用的是STM32F429,直接輸入STM32F429檢索:
- 第1步:進入ST官方地址www.st.com,頁面上側中間編輯框輸入STM32F429檢索。
- 第2步:檢索后會彈出所有STM32F429的芯片(隨着時間推移,會增加新型號)。
- 第3步:比如我們用的是STM32F429BI,點擊進入第2步截圖中的STM32F429BI選項即可。進入后,所有的相關資源就都在這個頁面下了。
數據手冊標識:
應用筆記標識:
參考手冊標識:
編程手冊標識:
勘誤手冊標識:
基本上大家所需的開發文檔都在這個頁面下了。
1.4.2 軟件包
通過上面小節整理完畢相關文檔后,就是STM32F429軟件包的下載了。軟件包也比較好找,同樣推薦1.4.1小節的方式。
- 第1步:進入ST官方地址www.st.com ,頁面上側中間編輯框輸入STM32CubeF4檢索。
- 第2步:檢索后會彈出STM32CubeF4的軟件包選項。
- 第3步:進入STM32CubeF4的頁面地址后,就在頁面的最底端看到這個軟件包了(隨着時間推移,版本會不斷更新)。
- 第4步:點擊按鈕“Get Software”后,彈出如下界面
點擊ACCEPT進入下面界面:
點擊Login/Register
通過上面四步就獲取了STM32F429的軟件包。軟件包的目錄結構如下:
1.5 HAL庫介紹
HAL庫就包含在大家下載的STM32CubeF4軟件包里面。軟件包的框圖如下:
HAL庫全稱Hardware Abstraction Layer,即硬件抽象層,其實就是STM32F429的外設驅動包。代碼文件位於路徑:\Drivers\STM32F4xx_HAL_Driver。如下是部分截圖:
單從人性化角度,這些外設驅動寫的還是比較用心的,特別是每個C文件開頭的使用說明。比如文件stm32f4xx_hal_gpio.c開頭的說明:
============================================================================== ##### GPIO Peripheral features ##### ============================================================================== [..] Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software in several modes: (+) Input mode (+) Analog mode (+) Output mode (+) Alternate function mode (+) External interrupt/event lines [..] During and just after reset, the alternate functions and external interrupt lines are not active and the I/O ports are configured in input floating mode. [..] All GPIO pins have weak internal pull-up and pull-down resistors, which can be activated or not. [..] In Output or Alternate mode, each IO can be configured on open-drain or push-pull type and the IO speed can be selected depending on the VDD value. [..] All ports have external interrupt/event capability. To use external interrupt lines, the port must be configured in input mode. All available GPIO pins are connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. [..] The external interrupt/event controller consists of up to 23 edge detectors (16 lines are connected to GPIO) for generating event/interrupt requests (each input line can be independently configured to select the type (interrupt or event) and the corresponding trigger event (rising or falling or both). Each line can also be masked independently. ##### How to use this driver ##### ============================================================================== [..] (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef structure. (++) In case of Output or alternate function mode selection: the speed is configured through "Speed" member from GPIO_InitTypeDef structure. (++) In alternate mode is selection, the alternate function connected to the IO is configured through "Alternate" member from GPIO_InitTypeDef structure. (++) Analog mode is required when a pin is to be used as ADC channel or DAC output. (++) In case of external interrupt/event selection the "Mode" member from GPIO_InitTypeDef structure select the type (interrupt or event) and the corresponding trigger event (rising or falling or both). (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using HAL_NVIC_EnableIRQ(). (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). (#) To set/reset the level of a pin configured in output mode use HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). (#) During and just after reset, the alternate functions are not active and the GPIO pins are configured in input floating mode (except JTAG pins). (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has priority over the GPIO function. (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as general purpose PH0 and PH1, respectively, when the HSE oscillator is off. The HSE has priority over the GPIO function.
HAL庫的使用方法跟之前F4系列的標准庫差不多,只是HAL庫封裝的稍顯臃腫。事情都是兩面的,代碼臃腫了,易用性會好些。
1.6 CMSIS軟件包介紹
CMSIS(微控制器軟件接口標准,Cortex Microcontroller Software Interface Standard)是ARM官方設計的驅動包,框圖如下:
ARM推出CMSIS軟件包意在統一各大芯片廠商的外設驅動,DSP數字信號處理,下載器和各個主流RTOS的API統一。幾年下來,各個廠商一直是各自為戰,所以CMSIS的驅動一直沒有被各個芯片廠商采用。而且ARM做得也不夠完善,沒有ADC、DAC、定時器之類的外設驅動。
這兩年情況好了不少,特別是ARM為ST做的CMSIS-Driver明顯完善了很多。針對我們這個教程來說,當前還用不到這些東西,主要用到CMSIS軟件包里面的如下頭文件即可(不同版本,截圖中的文件可能不同,這個軟件包是一直在更新中的,下面的截圖的版本是V5.5.1):
這個軟件包可以在三個地方獲取:
- STM32CubeF4軟件包里面。
每個版本的Cube軟件包都會攜帶CMSIS文件夾。
- MDK安裝目錄(下面是5.5.1版本的路徑)。
大家安裝了新版MDK后,CMSIS軟件包會存在於路徑:ARM\PACK\ARM\CMSIS\5.5.1\CMSIS。
- GitHub。
通過GitHub獲取也比較方便,地址:https://github.com/ARM-software/CMSIS_5 。點擊右上角就可以下載CMSIS軟件包了。
當然,也可以在ARM官網下載,只是這兩年ARM官網升級得非常頻繁,通過檢索功能找資料非常麻煩。所以不推薦大家到ARM官網下載資料了。
下面為大家簡單介紹下CMSIS軟件包里面這幾個文件夾:
- Core
Cortex-M處理器內核和外設的API。 它為Cortex-M0,Cortex-M0 +,Cortex-M3,Cortex-M4,Cortex-M7,Cortex-M23,Cortex-M33,SC000和SC300提供了標准化接口。 還包括用於Cortex-M4,Cortex-M7和Cortex-M33 的SIMD指令。當前這個文件下只有一個示例文件,還用不上。
- Core_A
同上,只是用於Cortex-A5/A7/A9。
- DAP
這個是ARM官方推出的下載器固件,也就是大家所說的CMSIS-DAP下載器。
- Documentation
這個是CMSIS軟件包的Help文檔,打開后效果如下:
- Driver
這個是ARM做好的驅動框架,支持的外設如下:
針對不同廠商,ARM會出一個完整的驅動包,比如STM32F4系列,在MDK安裝目錄的此路徑下(前提是大家安裝了STM32F4軟件包):ARM\PACK\Keil\STM32F4xx_DFP\2.13.0\CMSIS\Driver。
ARM做的這個驅動跟HAL庫有什么區別呢?ARM做的這個庫要調用到HAL的一些API,然后封裝了一些比較好用的API,方便用戶調用。
- DSP_Lib
這個是ARM提供的DSP庫,此庫支持以CM0、CM3、CM4以及CM7為內核的所有MCU,含源碼。詳細介紹可以看我們的DSP教程:http://www.armbbs.cn/forum.php?mod=viewthread&tid=3886 。
- Include
這個文件比較重要,雖然是頭文件,但是封裝了很多內核方面的API,是大家工程里面務必包含的路徑。
- Lib
這個文件是GCC和MDK格式的DSP庫文件。
- NN
這個是ARM新出的神經網絡庫,框圖如下:
- Packs
這個文件沒什么用,大家不用管。
- RTOS
這個是RTX4以及CMSIS-RTOS V1封裝層,含源碼,免費,Apache-2.0授權。
- RTOS2
這個是RTX5以及CMSIS-RTOS V2封裝層,含源碼,免費,Apache-2.0授權。
- SVD
SVD的全稱是System View Description,系統視圖描述。對芯片的外設、存儲器等進行了詳細描述,編譯器要用到這個文件,不同系列芯片有不同的SVD文件。以STM32F429為例,在MDK的option選項里面可以看到以svd為后綴的文件被調用。
- Utilities
這個文件里面提供了一些實用的小軟件或者文件。
關於CMSIS軟件包就為大家介紹這么多,后面用到哪個文件時,再為大家詳細介紹。
1.7 STM32CubeMX開發平台
STM32CubeMX是ST在2014年推出的圖形開發軟件,方便用戶配置時鍾、外設、引腳以及RTOS和各種中間件。整體框圖如下:
通過這個圖形軟件,可以讓大家方便地生成工程代碼,支持MDK,IAR,TrueSTUDIO等編譯器。針對STM32CubeMX的使用,后面會專門做幾期專題教程。
1.8 STM32F429調試方法
STM32F429的調試方法主要分為兩大類:
- MDK和IAR編譯器自帶的調試
MDK調試方法在第5章進行了詳細講解。
IAR調試方法在第7章進行了詳細講解。
- 終極調試組件Event Recoder的使用方法。
在8章節進行了詳細講解。
1.9 STM32F429出現硬件異常的解決辦法
大家做項目時,經常會遇到硬件異常問題,所以專門為此做了一個章節(具體在11章節進行了詳細講解)。
1.10 總結
本章節就為大家講解這么多,建議初學者花些時間對 STM32F429的開發文檔的章節結構了解一下,隨着以后的學習最好可以達到熟練查看這些開發文檔的程度。