Micropython之開篇–基於F407VE Black F407VE的移植
開篇先寫點什麼,網上比較熱的幾個項目:Arduino,Micropython,樹莓派,OpenMV,等等,每個項目都有其亮點,
網上也很多Micropython或基於樹莓派python的教程,接觸python有段時間了,一直想寫點什麼,就目前來看MDK及IAR更適應開發冷門模塊(有很多比較經典的模塊供參考),而Micropython參考模塊相對較少,所以沒有STM32之類開發經驗及python語言基礎做Micropython底層開發比較吃力,當然,優點很明顯做頂層應用小學生都可以入門。
爲什麼搞Micropython?
1.頂層應用簡單,不用很多專業知識就可以
2.Ai 嵌入式人臉識別,顏色識別,顏色追蹤經典例程都是python,Micropython
3.Micropython操作方便,只用一根數據線就可以寫程序,
4.調好的程序,可以在“編譯”過程中添加屬於自己的代碼,用戶可以調用,但無法查看到源碼,對科技含量比較高的代碼(比如算法等)提供保護。
5.通用性強,對各種模塊應用有較強的兼容性(比如SPI,IIC,UART,Can等)
6.方便兼容IOT—ESP8266,ESP32都有Micropython版,會用一個平臺,其它操作起來都比較簡單
Micropython的缺點:
1.除了Rt thread,沒有合適的RTOS與之兼容;
2.有些模塊(功能)尚未添加(比如:FSMC Driver 以及DMA,DSP應用等 ),當然Github上會經常爆出國外大牛的模塊驅動,多多收集,代碼Demo多了自己做驅動才更得心應手。
好了,先描述下項目背景:
無意中在淘寶翻到一塊不到30大洋的Micropython開發板–STM32F411CEU6如下圖背面支持Flash,剛好把自己手裏邊剩餘的一片25Q128 (16M)焊上,燒寫上店家給的外部Flash支持Micropython固件,Type-C數據線插上電腦:赫然出現了一個16M U盤,各種調試ILI9341顯示圖片是真香。
當然,筆者喜歡收集各種開發板,除了PYB(STM32F405RG)手裏單F407系列就有好幾塊:普中的(STM32F407ZG) 雙核開發板,正點原子的(STM32F407ZG)探索者,還有就是今天的主角:Black F407VE,直接上圖:
爲什麼叫選這個呢?1.ROM 512K : 夠用 Micropython一般需要ROM 大於290K左右的MCU上纔可以跑起來(詳見RT-Thread官網關於Micropython移植)2.方便移植 Micropython: 官方庫裏有F4Discovery例程,只需要修改比較少的參數 3.良心-便宜外設齊全: F407VE據ST官網報價大約在人民幣15-20元(步包含關稅),帶RTC電池,,25Q16 ,內存卡槽,40大洋還包郵,難怪老外都說便宜。
先上個電路原理圖,方便待會兒說明micropython的配置:
板子25Q16 用的是SPI1:PB3–SCK PB4–MISO PB5–MOSI PB0–CS Mark一下
LED燈 PA6–LED1 PA7–LED2 這裏吐槽下設計(好好的ADC 輸入及PWM輸出)少了2路 。
然後SD卡沒有特別的特別地方:
代碼配置如下:此配置可以選擇Flash芯片(爲了存更多東西,我把板載Flash換成25Q128 16M,當然不換也可以)作爲啓動還是像PYB一樣從內存卡(最大支持32G)啓動:
給板子起了個名字:Alisa( 冰雪奇緣的Alisa)
#define MICROPY_HW_BOARD_NAME "Alisa"
#define MICROPY_HW_MCU_NAME "STM32F407"
#define MICROPY_HW_FLASH_FS_LABEL "Alisa"
// 1 = use internal flash (512 KByte)
// 0 = use onboard SPI flash (2 MByte) Winbond W25Q16/128
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)
#define MICROPY_HW_HAS_SWITCH (1)
#define MICROPY_HW_HAS_FLASH (1)
#define MICROPY_HW_HAS_SDCARD (1)
#define MICROPY_HW_ENABLE_RNG (1)
#define MICROPY_HW_ENABLE_RTC (1)
#define MICROPY_HW_ENABLE_DAC (1)
#define MICROPY_HW_ENABLE_USB (1)
// HSE is 8MHz
#define MICROPY_HW_CLK_PLLM (8)
#define MICROPY_HW_CLK_PLLN (336)
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)
#define MICROPY_HW_CLK_LAST_FREQ (1)
// The board has a 32kHz crystal for the RTC
#define MICROPY_HW_RTC_USE_LSE (1)
#define MICROPY_HW_RTC_USE_US (0)
#define MICROPY_HW_RTC_USE_CALOUT (1)
// UART config
#define MICROPY_HW_UART1_TX (pin_A9)
#define MICROPY_HW_UART1_RX (pin_A10)
#define MICROPY_HW_UART2_TX (pin_A2)
#define MICROPY_HW_UART2_RX (pin_A3)
#define MICROPY_HW_UART2_RTS (pin_A1)
#define MICROPY_HW_UART2_CTS (pin_A0)
#define MICROPY_HW_UART3_TX (pin_B10)
#define MICROPY_HW_UART3_RX (pin_B11)
#if MICROPY_HW_HAS_SWITCH == 0
// NOTE: A0 also connects to the user switch. To use UART4 you should
// set MICROPY_HW_HAS_SWITCH to 0, and also remove SB20 (on the back
// of the board near the USER switch).
#define MICROPY_HW_UART4_TX (pin_A0)
#define MICROPY_HW_UART4_RX (pin_A1)
#endif
// NOTE: PC7 is connected to MCLK on the Audio chip. This is an input signal
// so I think as long as you're not using the audio chip then it should
// be fine to use as a UART pin.
#define MICROPY_HW_UART6_TX (pin_C6)
#define MICROPY_HW_UART6_RX (pin_C7)
// I2C busses
#define MICROPY_HW_I2C1_SCL (pin_B6)
#define MICROPY_HW_I2C1_SDA (pin_B7)
#define MICROPY_HW_I2C2_SCL (pin_B10)
#define MICROPY_HW_I2C2_SDA (pin_B11)
// SPI busses
#define MICROPY_HW_SPI1_NSS (pin_A4) // PA4
#define MICROPY_HW_SPI1_SCK (pin_A5) // PA5,PB3
#define MICROPY_HW_SPI1_MISO (pin_A6) // PA6,PB4
#define MICROPY_HW_SPI1_MOSI (pin_A7) // PA7,PB5
#define MICROPY_HW_SPI2_NSS (pin_B12) // PB12
#define MICROPY_HW_SPI2_SCK (pin_B13) // PB13
#define MICROPY_HW_SPI2_MISO (pin_B14) // PB14
#define MICROPY_HW_SPI2_MOSI (pin_B15) // PB15
#define MICROPY_HW_SPI3_NSS (pin_A15) // PA15
#define MICROPY_HW_SPI3_SCK (pin_B3) // PB3
#define MICROPY_HW_SPI3_MISO (pin_B4) // PB4
#define MICROPY_HW_SPI3_MOSI (pin_B5) // PB5
// CAN busses
#define MICROPY_HW_CAN1_TX (pin_B9) // PB9,PD1,PA12
#define MICROPY_HW_CAN1_RX (pin_B8) // PB8,PD0,PA11
#define MICROPY_HW_CAN2_TX (pin_B13)
#define MICROPY_HW_CAN2_RX (pin_B12)
// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_A0)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
#define MICROPY_HW_USRSW_EXTI_MODE (GPIO_MODE_IT_RISING)
#define MICROPY_HW_USRSW_PRESSED (1)
// LEDs
#define MICROPY_HW_LED1 (pin_A6) // red
#define MICROPY_HW_LED2 (pin_A7) // green
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
// If using onboard SPI flash
#if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
// Winbond W25Q128 SPI Flash = 16 Mbit (2 MByte)
//如果你用的主板自帶的25Q16,要這麼設置:
//#define MICROPY_HW_SPIFLASH_SIZE_BITS (16 * 1024 * 1024)
#define MICROPY_HW_SPIFLASH_SIZE_BITS (128 * 1024 * 1024)
#define MICROPY_HW_SPIFLASH_CS (pin_B0)
#define MICROPY_HW_SPIFLASH_SCK (pin_B3)
#define MICROPY_HW_SPIFLASH_MISO (pin_B4)
#define MICROPY_HW_SPIFLASH_MOSI (pin_B5)
#define MICROPY_BOARD_EARLY_INIT Black_F407VE_board_early_init
void Black_F407VE_board_early_init(void);
extern const struct _mp_spiflash_config_t spiflash_config;
extern struct _spi_bdev_t spi_bdev;
#define MICROPY_HW_BDEV_IOCTL(op, arg) ( \
(op) == BDEV_IOCTL_NUM_BLOCKS ? (MICROPY_HW_SPIFLASH_SIZE_BITS / 8 / FLASH_BLOCK_SIZE) : \
(op) == BDEV_IOCTL_INIT ? spi_bdev_ioctl(&spi_bdev, (op), (uint32_t)&spiflash_config) : \
spi_bdev_ioctl(&spi_bdev, (op), (arg)) \
)
#define MICROPY_HW_BDEV_READBLOCKS(dest, bl, n) spi_bdev_readblocks(&spi_bdev, (dest), (bl), (n))
#define MICROPY_HW_BDEV_WRITEBLOCKS(src, bl, n) spi_bdev_writeblocks(&spi_bdev, (src), (bl), (n))
#endif
// SD card detect switch
#define MICROPY_HW_SDCARD_DETECT_PIN (pin_E2)
#define MICROPY_HW_SDCARD_DETECT_PULL (GPIO_NOPULL)
#define MICROPY_HW_SDCARD_DETECT_PRESENT (GPIO_PIN_RESET)
// USB config
#define MICROPY_HW_USB_FS (1)
#define MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)
#define MICROPY_HW_USB_OTG_ID_PIN (pin_A10)
文件(包含生成的.dfu,.hex)已上傳CSDN平臺:
https://download.csdn.net/download/leotian966/12439502
跳線帽短接E2與GND 可以更改爲從內存卡啓動。
如果覺得帖子好,請給個關注,謝謝!
後續帖子會演示此主板的使用Demo,敬請關注。