https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97%E5%A4%96%E8%AE%BE%E9%A9%B1%E5%8A%A8%E6%B7%BB%E5%8A%A0%E6%8C%87%E5%8D%97.md
STM32 系列外設驅動添加指南
1. 簡介
本文檔是爲需要給現有的 STM32 BSP 添加更多外設驅動的開發者準備的。通過閱讀本文,開發者可以按照自己的實際情況給現有 BSP 添加自己需要的驅動。
2. 前提要求
- 熟練使用 ENV 工具,參考:RT-Thread env 工具用戶手冊
- 熟悉 Kconfig 語法
- 熟悉 STM32CubeMX 工具
- 對 RT-Thread 設備驅動框架有一定了解
3. 如何添加更多的外設驅動選項
本章節以添加片上外設驅動爲例,講解如何爲 BSP 添加更多可用驅動。如果想使用的片上外設是 片上外設配置菜單
裏沒有的,就需要開發者自己添加了。下面我們將演示如何爲 stm32f429-atk-apollo BSP 添加 SPI3 驅動。
沒有安裝 stm32cubemx 軟件的可以訪問 STM32cube中文網:http://www.stm32cube.com/ ,在
資源下載
裏下載 stm32cubemx 軟件。
阿波羅 BSP 默認只支持 SPI1、SPI2 和 SPI5,是不支持 SPI3 的。開發者如果需要使用 SPI3,則需要自己添加。
添加 SPI3 的外設支持需要以下幾步:
1)打開 STM32CubeMX 工程
打開 BSP 的 STM32CubeMX 配置文件。
2)按原理圖配置 SPI3 的引腳,並生成代碼
按圖示順序配置 SPI3,並生成代碼。
爲 BSP 添加驅動時,STM32CubeMX 工具可以快速的完成使能外設和配置管腳的工作。而外設初始化,中斷配置,DMA配置等等則由 RT-Thread 提供的驅動文件來完成。也就是說,雖然 STM32CubeMX 生成了多個文件用來初始化外設,但 RT-Thread 只使用了 STM32CubeMX 生成的
stm32fxx_hal_msp.c
文件和stm32fxx_hal_conf.h
文件。對於不同的外設驅動,通過 STM32CubeMX 工具配置的內容也不一樣。開發者可以參考本文檔的附錄 CubeMX 配置說明章節來了解不同外設的配置方法。
3)修改 Kconfig 文件
打開 board 文件夾下的 Konfig 文件,拷貝 SPI2 的配置項,並重命名 SPI2 爲 SPI3。
4)重新配置工程
經過上一步的修改,此時重新打開 ENV 工具,在 menuconfig 中就會出現添加的 SPI3 的配置項。
5)生成工程,檢查驅動文件
使用 ENV 重新生成工程並打開,檢查原有驅動文件是否支持新添加的驅動(查看是否有新驅動的配置文件,中斷函數,DMA配置和中斷函數等等),如不支持,需參考現有驅動添加相關的代碼。
6)編譯下載
檢查完工程後,編譯下載到開發板,程序會自動開始運行。輸入 list_device
命令,可以看到 spi3 總線已經註冊到內核,說明驅動已經添加成功。
4. 注意事項
- 部分驅動如果沒有適配 BSP 所屬的 STM32 系列,請等待 RT-Thread 團隊更新。
- 驅動文件對 STM32 系列的支持情況可以查看 STM32系列驅動介紹文檔。
- 對於驅動文件或文檔說明,有任何建議或者意見,歡迎反饋到 RT_Thread GitHub 網站或 RT-Thread 官方論壇。
5. 附錄
5.1 CubeMX配置說明
本小節介紹 stm32 系列的 BSP 是如何利用 CubeMX 工具對 BSP 進行配置的。
就像文檔中提到的那樣,stm32 系列的 BSP 只利用了 CubeMX 工具生成的 stm32XXxx_hal_conf.h
和 stm32XXxx_hal_msp.c
文件。在 HAL 庫中, stm32XXxx_hal_conf.h
文件裏提供的宏開關會決定 HAL 庫將哪些外設驅動添加到工程中。 而stm32XXxx_hal_msp.c
文件中則存放了在 CubeMX 工具中開啓的外設驅動的配置代碼。
5.2 外設配置總結
當開發者想要在 BSP 中添加更多驅動時,需要使用 CubeMX 工具來配置這些外設。對於絕大多數驅動的配置,只需要在工具中使能相應的外設即可。但是對於一些複雜的外設,則需要更多的配置內容。下表展示了不同驅動在 CubeMX 工具配置步驟的總結:
序號 | 驅動 | CubeMx 工程中的配置情況(加粗部分爲必做步驟) |
---|---|---|
1 | GPIO | 無需任何操作 |
2 | UART | 開啓該外設 ,然後配置所需要的引腳(或者使用默認引腳) |
3 | SPI | 開啓該外設 ,然後配置所需要的引腳(或者使用默認引腳) |
4 | I2C | 依賴於PIN 驅動,無需任何操作 |
5 | TIMER | 使能 internal Clock 時鐘 ,詳細內容可參考5.3章節 |
7 | PWM | 首先使能 internal Clock 時鐘,然後爲 channelx 選項選擇PWM Generation CHx, 最後配置所需要的引腳(或者使用默認引腳) ,詳細內容可參考5.3章節 |
8 | ADC | 開啓該外設,然後選擇使用的通道 ,詳細內容可參考5.3章節 |
9 | RTC | 開啓該外設,然後在時鐘樹狀圖裏將 RTC 選擇爲 LSE 時鐘 |
10 | Watchdog | 開啓該外設 |
11 | EMAC | 配置 ETH 外設的工作模式(一般爲 RMII 模式) |
12 | SDRAM | 需要根據板載的 SDRAM 型號配置片選腳,地址線,數據線等 |
13 | SDIO | 開啓該外設,配置引腳(或者使用默認引腳),SDIO會改變時鐘結構,故需重新配置時鐘並修改board.c |
5.3 複雜外設配置說明
本章節着重介紹配置步驟較爲複雜的驅動。
5.3.1 TIMER 外設驅動添加說明
- 打開 STM32CubeMX 工程,設置 timer 在 Cube 裏的選項,如下圖所示:
- 打開 stm32/stm32f429-atk-apollo/board/Kconfig ,添加 Kconfig 選項。選中自己添加的選項後,生成一遍工程,如下圖所示:
- 打開工程進行編譯,工程會提示 TIM11_CONFIG 未定義。 可以在 stm32/libraries/HAL_Drivers/config/f4/tim_config.h 中進行定義,如下圖所示:
5.3.2 PWM 外設驅動添加說明
- 打開 STM32CubeMX 工程,設置 PWM 在 Cube 裏的選項,如下圖所示:
- 打開 stm32/stm32f429-atk-apollo/board/Kconfig ,添加 Kconfig 選項。選中自己添加的選項後,生成一遍工程,如下圖所示:
- 打開工程進行編譯,工程會提示 PWM2_CONFIG 未定義。 可以在 stm32/libraries/HAL_Drivers/config/f4/pwm_config.h 中進行定義,如下圖所示:
5.3.3 ADC 外設驅動添加說明
- 打開 STM32CubeMX 工程,設置 ADC 在 Cube 裏的選項,如下圖所示:
- 打開 stm32/stm32f429-atk-apollo/board/Kconfig ,添加 Kconfig 選項。選中自己添加的選項後,生成一遍工程,如下圖所示:
- 打開工程進行編譯,工程會提示 ADC1_CONFIG 未定義。 可以在 stm32/libraries/HAL_Drivers/config/f4/adc_config.h 中進行定義,如下圖所示:
5.3.4 編碼器外設驅動添加說明
- 打開 STM32CubeMX 工程,設置 TIMER 在 Cube 裏的選項,如下圖所示:
- 打開 stm32/stm32f407-atk-explorer/board/Kconfig ,添加 Kconfig 選項。選中自己添加的選項後,生成一遍工程,如下圖所示:
- 打開工程進行編譯,工程會提示 PULSE_ENCODER4_CONFIG 未定義。 可以在 stm32/libraries/HAL_Drivers/config/f4/pulse_encoder_config.h 中進行定義,如下圖所示: