Micropython之開篇--基於F407VE Black F407VE的移植編譯

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,敬請關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章