目錄
前言
準備工作
開始操作
問題回顧
后記
前言
? ? ? ?去年曾經嘗試Pico制作openmv固件,由于知識儲備不夠最后失敗了,留了一個大坑,有了前幾天的基礎,慢慢補齊知識,最近這一周一直在學習如何編譯Stm固件并燒錄到單片機里,之前編譯過lvgl for pico的固件,所以也算是熟門熟路了。
準備工作
- 我有五塊Stm32的單片機,頭兩個失敗原因是,編譯出來的固件超過FLASH了。
F103C8T6(失敗) | F401RCT6(失敗) | F411CEU6(成功) | F407VET6 (未試) | H743CEU6 (未試) | |
---|---|---|---|---|---|
CPU | 72MHz | 84MHz | 100MHz | 168MHz | 480MHz |
RAM | 20KB | 64KB | 128KB | 192KB | 1MB |
FLASH | 64KB | 256KB | 512KB | 512KB | 2MB |
- Make的安裝 =====> 用于管理整個編譯和鏈接過程
- Gcc的安裝 =====> 編譯mpy-cross
- arm-none-eabi-gcc的安裝 =====>用于將 C/C++ 源代碼編譯成適用于 ARM 嵌入式系統的機器代碼
- F411CEU6的?配置文件
- dfu文件的 燒錄工具
- 其他,用DfuSe不能識別,用STM32CubeProgrammer可以燒錄bin
開始操作
- 獲取Micropython的代碼,這里我選擇是1.24.0版本
git clone https://github.com/micropython/micropython.git
cd micropython
git checkout v1.24.0
git submodule update --init
- 獲取配置文件,并放置在micropython\ports\stm32\boards下,如果不需要修改配置文件,可直接編譯
make BOARD=WEACT_F411CEU6
- 可以看到在stm32文件夾下新生成了一個“build-WEACT_F411CEU6”,可以在這里邊找到
firmware.dfu
firmware0.bin
firmware1.bin
- 用單片機的typeC插到電腦上,使用Boot按鈕和Reset按鈕操作,直到電腦設備管理器中看到“Stm32 BootLoader”,如果沒有看到,則需要安裝驅動(可以用zadig安裝)
- 這時,使用dfu工具查看,會看到如下信息,可以看到 [0483:df11] 即為目標機
C:\Users\Administrator>dfu-util --list
dfu-util 0.11Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/Found DFU: [0483:df11] ver=2200, devnum=4, cfg=1, intf=0, path="1-1.3", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="3362334E3034"
Found DFU: [0483:df11] ver=2200, devnum=4, cfg=1, intf=0, path="1-1.3", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="3362334E3034"
Found DFU: [0483:df11] ver=2200, devnum=4, cfg=1, intf=0, path="1-1.3", alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="3362334E3034"
Found DFU: [0483:df11] ver=2200, devnum=4, cfg=1, intf=0, path="1-1.3", alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="3362334E3034"
- 執行燒錄
D:\A_GitCode\micropython\ports\stm32\build-WEACT_F411CEU6>dfu-util -a 0 -s :leave -D firmware.dfu
dfu-util 0.11Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/Match vendor ID from file: 0483
Match product ID from file: df11
Multiple alternate interfaces for DfuSe file
Opening DFU capable USB device...
Device ID 0483:df11
Device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Interface #0 ...
Determining device status...
DFU state(10) = dfuERROR, status(10) = Device's firmware is corrupt. It cannot return to run-time (non-DFU) operations
Clearing status
Determining device status...
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
File contains 1 DFU images
Parsing DFU image 1
Target name: ST...
Image for alternate setting 0, (2 elements, total size = 314432)
Setting Alternate Interface #0 ...
Parsing element 1, address = 0x08000000, size = 14704
Erase [=========================] 100% 14704 bytes
Erase done.
Download [=========================] 100% 14704 bytes
Download done.
Parsing element 2, address = 0x08020000, size = 299712
Erase [=========================] 100% 299712 bytes
Erase done.
Download [=========================] 100% 299712 bytes
Download done.
Done parsing DfuSe file
Submitting leave request...
Transitioning to dfuMANIFEST state
- 結束燒錄,可以看到設備管理器出現一個大容量存儲設備,這時就可以打開Thonny,編寫一段代碼查看燒錄的固件情況
問題回顧
- 這次遇到的問題,比前幾篇遇到的都多,前前后后大概一周時間,包括等F411到貨的時間
- F103和F401的問題是固件過大,套路摸的差不多,mpconfigboard.h定義組件信息,決定哪些硬件組件和功能在當前開發板上啟用、mpconfigboard.mk定義鏈接信息,指定固件構建過程中的源文件、庫文件、鏈接器腳本等、stm32f4xx_hal_conf.h定義庫信息,配置 STM32 HAL 庫的使用情況,決定哪些外設和功能被啟用、pins.csv定義引腳信息,指定開發板上各個引腳的名稱、類型、功能等,這些引腳不是那么重要,只是為了方便起個別名,最重的還有一個就是HSE,F411這個外置了一個25MHz的晶振
- 除了固件過大的問題,再就是生成的bin固件是兩個,一個0.bin,一個1.bin,走了很多彎路,最后得到結論,這兩個都要燒錄到單片機中(上文我選用的dfu,所以就不用管bin了),根據你mpconfigboard.mk中的地址來設置,如果沒設置,可以在make的時候設置V=1查看
后記
? ? ? ?還是吃了基礎薄弱的虧,弄了一下午,期間還走了用Daplink測串口、晶振計算錯誤等彎路,最后找到了這個標準的配置文件后,才算排除了一些因素,最后鎖定在bin燒錄問題上,最后換dfu才成功。好啦,接下來可以踏實的嘗試畫PCB了,回過頭來再繼續補坑Micropython+Pico2+Lvgl(官方的停止更新了)、Micropython+Pico1/Pico2+Openmv(官方不支持)。考慮到Lvgl的C版本還一直活躍,可以繼續嘗試C+Stm32+Lvgl。另外單片機支持TensorFlow Lite,做一些簡單的邊緣計算,還是可以玩玩的。