初衷
我是做Android開發的,因此本文許多地方會比較繁瑣,各位做單片機開發的輕噴呀
有幸接觸到stm32這個平臺,之前都是在學校接觸過單片機(年代久遠),平常工作中一直是以Android開發爲主,對於系統底層的硬件是怎麼交互的一點兒也沒了解,初次接觸stm32以下幾個地方引起了我的好奇心,想要一探究竟:
- 最小系統板stm32F103C8T6相信很多和我類似的朋友都會接觸到,1688價格只有8塊錢,裏面可以運行程序,各種四軸飛行器、充電樁、智能電錶等裏面都是它,好驚奇
- 上面包含了大量硬件接口:UART、GPIO、SPI、I2C、USB、CAN等一堆接口,這小東西真是五臟俱全呢
- 主頻72mhz,想起來快接近諾基亞塞班手機當時的頻率了哈哈哈,上面可以跑個小型的操作系統,例如
rt-thread
,人家是國內開源的,不禁想去了解下一個操作系統是怎麼搞起來的,怎麼應對和解決系統資源的分配利用的,好奇 - 內存20kb,存儲128kb,這個垃圾,我大Android起步都是512mb,想去了解下這能幹個啥,好奇
- Android的HAL層是用戶態實現的硬件驅動,想去了解下這些外設硬件都是怎麼交互的,剛好有這個stm32,容我去一探究竟
前提準備
硬件環境
巧婦難爲無米之炊,硬件首先得有呀,下面是我在調試使用過程中用到的硬件:
STM32F103C8T6
:在1688上搜索STM32F103C8T6最小系統
,找8塊錢那個就行了
elink32
:stm32的調試工具有st-link、elink、jlink等多種,我這裏使用elink-32,唯一在我的ubuntu機器上不會很快損壞的設備,之前在淘寶的16塊錢的st-link被我搞壞了5個,你敢信,購買鏈接請自行淘寶,elink-32使用cmsis-dap/swd方式進行調試
USB轉串口線
:以我目前淺顯的知識來說,要這傢伙是用來輸出log的,剛開始在沒有adb的情況下愣是沒習慣這種打個log還需要自己動手的情況,而且由於debug對於某些性能敏感的情況會出現調試沒bug,運行稀爛一地的情況,雖然串口輸出也沒見得多高效,汗- -!
軟件環境
工欲善其事必先利其器,軟件不得到位,下面是我用到的軟件(我是在Ubuntu系統下開發的,因此選用了跨平臺的開發工具STM32CubeIDE
而不是更強大的IAR之類的):
STM32CubeIDE
:這他喵是個ST官方出的跨平臺的stm32開發工具,可以在ST官網下載,基於eclipse開發,有下面的特點:
- 跨平臺,windows、mac、linux都可以用
- 包含交叉編譯,不用自己糾結咋麼編譯
- 支持團隊管理,各種版本管理軟件eclipse上熟悉的工具走起
- 支持stlink、elink等多種調試工具
- 集成了
CubeMx
:這個就是神器了,它是stm32平臺使用UI界面配置stm32引腳功能、時鐘、中間件等一系列東西的工具,有了它再也不用翻stm32的文檔去糾結怎麼配置時鐘了,一鍵搞定,美得很。(沒有這個工具,我們就需要手動對着ST的操作手冊一個一個去配置寄存器來修改引腳和時鐘,太災難了)
硬件連接
請按照下圖連接elink32
和stm32
(用於調試和安裝ROM,類似於Android上通過usb進行adb調試),只需連接3V3
、GND
、DIO
、SCK
四個引腳即可
Windows中可能需要安裝elink32的驅動,請自行解決
stm32支持Serial Wire、JTag、串口等多個方式進行安裝rom,其中區別請自行了解,這裏只選取了硬件比較便宜,操作方便的方法
Hello world應用
在STM32CubeIDE中創建新工程
- 和Android應用不同的是:stm32不同的板卡有不同的引腳佈局、外設引腳配置、軟件庫等選擇,因此首先需要確定是哪個型號的芯片才能創建工程,這裏選擇
STM32F103C8T6
Target Project Type
選擇STM32Cube
,這樣就會關聯stmCubeMx這個引腳配置工具,而不用自己手寫寄存器操作來修改時鐘。
配置引腳
- 配置調試引腳:
這一步非常重要! 如果忘記配置會導致板子在一次刷寫後不能再訪問,需要通過串口或者其他方式刷入支持SWD的固件才能恢復。在helloworld.ioc
打開後的配置頁面中,左側System Core
-SYS
-Debug
中選擇Serial Wire
- 配置helloworld的小燈引腳:
使用鼠標左鍵點擊右邊引腳圖中的PC13
引腳選擇GPIO_Output
即可在STM32的helloworld中,第一個應用不是打印或者顯示一個helloworld的字符串,而是把板子上的小燈點亮,它裏面的log輸出需要麻煩點,需要自己配置串口和相關的接口,這個下回再說
3. 點擊左上角的保存按鈕,選擇自動生成代碼
修改代碼
將main
方法修改成下面的樣子,來頻繁打開/關閉PC13引腳上的小燈
/**
* @brief The application entry point.
* @retval int
*/
int main(void) {
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// 等待100ms
HAL_Delay(100);
// 開關PC13引腳
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
/* USER CODE END 3 */
}
運行及調試
由於我這裏使用了elink32
作爲調試工具,所以不能使用工程中默認的stlink32的調試配置,需要修改下:
- 在項目名稱上右鍵
Run as
-STM32 Cortex-M C/C++ Application
- 在
Debuger
的Debug probe
選項中選擇STLINK(Open ocd)
- 在
Configuration Script
中選擇User Defined
- 將生成的
helloworld.cfg
文件修改爲下面的樣子:
# This is an genericBoard board with a single STM32F103C8Tx chip
#
# Generated by STM32CubeIDE
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)
interface cmsis-dap
transport select swd
adapter_khz 5000
set WORKAREASIZE 0x5000
set CHIPNAME STM32F103C8Tx
set BOARDNAME genericBoard
# Enable debug when in low power modes
set ENABLE_LOW_POWER 1
# Stop Watchdog counters when halt
set STOP_WATCHDOG 1
# Reset configuration
# use software system reset if reset done
reset_config none
set CONNECT_UNDER_RESET 0
set CORE_RESET 0
# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333
source [find target/stm32f1x.cfg]
- 再次運行即可看到板子上的小燈開始閃爍起來了,helloworld搞定!
- 調試也可以直接使用:
恭喜,至此第一個STM32的單片機應用就跑起來了,開心不
源碼
如果在運行過程中出現任何問題,可以嘗試下載我這兒的工程源碼,用IDE打開測試
百度網盤鏈接 提取碼: s8kn