▌01 STM32F4x1开发板
STM32F401CC/TM32F411CE STM32F4x1 核心板 开发板 MicroPython .下面测试一下这款基于STM32F401的模块是否可以下载MicroPython固件,并进行开发。
资料下载链接:https://pan.baidu.com/s/1-EVa3bFTcsqEJSJUCQ2IBQ
提取码:782h
▲ 资料下载在暖色
firmware_4m_flash_stm32f401ce_v3.dfu
firmware_4m_flash_stm32f401ce_v3.hex
firmware_internal_rom_stm32f401ce_v3.dfu
firmware_internal_rom_stm32f401ce_v3.hex
▲ 电路板上的芯片为STM32F401CCU6
1.加入PCB的USB
(1)出现Flash Disk
加入PC之后,出现量 mcudev SD Flash Disk USB device. Windows提示是否需要将它进行格式化。
▲ 格式化新出现的F硬盘
▲ 出现MCUDEV SDFlash Disk USB Disk
在电路板上具有 W25Q32 (32M-bit/4M-byte)Flash。
▲ 电路板上的Flash
(2)进入DFU模式
直接接入PCB之后,没有出现在 利用STM32F405RG制作pyBoard实验板 所对应的STM Device in DFU Mode设备。因此,也无法使用DfuSel 下载来自MicroPython 中的 Firmware for pyboard v1 。
需要将SWD接口中的BT0与3.3V短接,然后在按动RST,此时模块边进入了DFU模式,此时可以使用DfuSel进行编程。
▲ 将BT0与3.3V短接,按动RST进入 DFU模式
下图显示了利用DfuSe Demo(v3.0.5)下载STM32F401的固件:
▲ 使用DfuSe Demo(v3.0.5)下载固件
2.使用UART1进行REPL
下载完之后,重新RST,但是系统并没有出现对应的USB虚拟的串口,问题来了: 究竟该如何进行软件开发呢?
。
(1)REPL串口
答案来了:在 MicroPython WeAct Core Board 使用教程 | WeAct 工作室 中介绍UART的时候,特别之处,UART_REPL:UART1。
简易MAX3232接口定义:
PIN1 | PIN2 | PIN3 | PIN4 | PIN5 |
---|---|---|---|---|
3.3V | T1 | R1 | R2 | GN |
(2)连接REPL串口
▲ 建议MAX3232接口
STM32F401模块的UART对应的PA9(TX1)、PA10(RX1):
但是经过测量,在模块上电后,PA9(TX1),PA10(RX1)都是高阻状态。
这说明这个模块并没有对于UART1进行初始化成对应的REPL端口。
▲ 模块的接口定义
3.问题分析
最终确认电路板上的MCU为STM32F401CCU6,而不是F401CEU6,所以下载给定的MicroPython的版本(它们都是CEU6)无法工作,确认现在的电路板实际上没有能够工作起来。
▌02 STM32F401CEU6
1. STM32F401CEU6模块
为了验证STM401的MicroPython 开发功能,下面是刚刚购买到的STM401CEU6模块。
▲ 新购买到的STM32F401CEUT开发板
STM32F401CC/TM32F411CE STM32F4x1 核心板 开发板 MicroPython 的资料下载:
- 资料下载链接:https://pan.baidu.com/s/1-EVa3bFTcsqEJSJUCQ2IBQ
提取码:782h
从资料网盘下载的资料存储在:
▲ STM32F401CEU6模块的原理图
2.下载UDF文件
(1)下载程序
D:\zhuoqing\DesignCenter\MicroPython\STM32F4x1\STM32F4x1核心板-2020 (F401版本)\F401-MicroPython(无技术支持)\F401-MicroPython\firmware_4m_flash_stm32f401ce_v3.dfu
D:\zhuoqing\DesignCenter\MicroPython\STM32F4x1\STM32F4x1核心板-2020 (F401版本)\F401-MicroPython(无技术支持)\F401-MicroPython\firmware_internal_rom_stm32f401ce_v3.dfu
a)下载带有4Mflash版本
首先选择firmware_4m_flash_stm32f401ce_v3.dfu下载。这主要是因为在目标板上具有4MFlash的模块。
▲ 使用DfuSe Demo(v3.0.5)下载UDF文件
结论: 这种下载带有Flash的版本,每次qids的时候,都会引起对于Flash重新进行格式化。这说明模块上的Flash可能不符合固件的要求;
b)下载Internal_ROM版本
下载之后,在对应的 WECTF401CE(F:)磁盘上会出现以下四个文件。
-
main.py
-
pybcdc.inf
-
README.txt
-
boot.py
README.txt中的内容:
This is a MicroPython board
You can get started right away by writing your Python code in 'main.py'.
For a serial prompt:
- Windows: you need to go to 'Device manager', right click on the unknown device,
then update the driver software, using the 'pybcdc.inf' file found on this drive.
Then use a terminal program like Hyperterminal or putty.
- Mac OS X: use the command: screen /dev/tty.usbmodem*
- Linux: use the command: screen /dev/ttyACM0
Please visit http://micropython.org/help/ for further help.
(2)重新RST
在计算机出现pyBoard USB Comm Port(COM34):
打开Thonny通过Configuration的Interpreter,设置MicroPython(Generic):Port:PyBoard USB Comm Port(CM34)来进行连接。
▲ 设置Thonny的Interpreter
▲ 使用Thonny连接STM32F401
MicroPython v1.12-540-gdd65eb920-dirty on 2020-06-16; WeAct_Core with STM32F401CE
Type "help()" for more information.
>>> help()
Welcome to MicroPython!
For online help please visit http://micropython.org/help/.
Quick overview of commands for the board:
pyb.info() -- print some general information
pyb.delay(n) -- wait for n milliseconds
pyb.millis() -- get number of milliseconds since hard reset
pyb.Switch() -- create a switch object
Switch methods: (), callback(f)
pyb.LED(n) -- create an LED object for LED n (n=1,2,3,4)
LED methods: on(), off(), toggle(), intensity(<n>)
pyb.Pin(pin) -- get a pin, eg pyb.Pin('X1')
pyb.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p
Pin methods: init(..), value([v]), high(), low()
pyb.ExtInt(pin, m, p, callback) -- create an external interrupt object
pyb.ADC(pin) -- make an analog object from a pin
ADC methods: read(), read_timed(buf, freq)
pyb.DAC(port) -- make a DAC object
DAC methods: triangle(freq), write(n), write_timed(buf, freq)
pyb.RTC() -- make an RTC object; methods: datetime([val])
pyb.rng() -- get a 30-bit hardware random number
pyb.Servo(n) -- create Servo object for servo n (n=1,2,3,4)
Servo methods: calibration(..), angle([x, [t]]), speed([x, [t]])
pyb.Accel() -- create an Accelerometer object
Accelerometer methods: x(), y(), z(), tilt(), filtered_xyz()
Pins are numbered X1-X12, X17-X22, Y1-Y12, or by their MCU name
Pin IO modes are: pyb.Pin.IN, pyb.Pin.OUT_PP, pyb.Pin.OUT_OD
Pin pull modes are: pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP, pyb.Pin.PULL_DOWN
Additional serial bus objects: pyb.I2C(n), pyb.SPI(n), pyb.UART(n)
Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode
For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>>
▌调试结论
通过调试,证明了STM32F401模块使用MicroPython开发的可能性。请注意,STM32F401具有两个版本:
- STM32F401CCU6: 不能够下载MicroPython开发
- STM32F401CEU6:能够使用MicroPython下载开发。
3.基础实验
(1)测试LED
from pyb import LED,ADC,delay,Pin
led = LED(1)
while True:
led.on()
delay(100)
led.off()
delay(100)
▲ LED flash测试
对于LED的生命,也可以使用字符串。
from pyb import LED,ADC,delay,Pin
led = Pin('LED_BLUE', Pin.OUT)
while True:
led.on()
delay(500)
led.off()
delay(500)
(2)测量Pin
from pyb import LED,ADC,delay,Pin
led = Pin('C13', Pin.OUT)
while True:
led.on()
delay(5)
led.off()
delay(5)
▲ 测量Pin的波形
▲ Pin13输出的波形
(3)测试ADC
根据STM32F401CEu6的Datasheet,可以看到对应的ADC总共有16个,他们分别2位于PA,PB,PC的端口上。
▲ STM32F401CE端口配置
▌测试问题
在使用Thonny调试的时候,通常会出现运行不正常的情况,也就是反复下载程序的过程中,会出现程序不执行的情况。
上面情况,在下载“Internal_ROM”版本之后,情况消失。
经过测试之后,也会发现,出现这种延迟执行的情况。不知道为什么,只是在开始的几次执行的时候,程序响应比较快。
(1)测试ADC
信号从ADC0(PA0)输入到模块。
from pyb import LED,ADC,delay,Pin
adc = ADC(0)
led = LED(1)
while True:
adcm = [adc.read() for _ in range(256)]
print(sum(adcm) / len(adcm))
delay(10)
print('Stop.')
▲ 读取ADC并进行显示
▌附件
1.MicroPython固件刷入说明
在F401-MicroPython中包括两个说明文件:
- README.md:英文说明文件
- README-zh.md:中文说明文件
下面的内容来自于中文说明文件。
(1)重要说明
如果板子背面没有WeAct
和版本号
,芯片批次是537
或旧的,插针和板子是装在一个袋子里,丝印印刷是错误的
(3V3
印成了V3V
),肯定是盗版。可以issues我们或通过电子邮件(WeAct_TC@163.com)告知我们。
a. WeAct Studio STM32F401CEU6
板子没有焊接flash刷入名称含有internal
的固件,焊接了flash,根据flash的大小选择对应的固件8M
,4M
。
最新固件为:firmware_xxxxxxx_stm32f401_vxx_v1.12-540
4MB SPI Flash:
-
硬件版本:版本号 V2.1,V2.2,V3.0对应固件为:firmware_4m_flash_stm32f401_v21+&&V13_v1.12-540.hex
-
硬件版本:版本号V2.0对应固件为:firmware_4m_flash_stm32f401_v20_v1.12-35.hex
8MB SPI Flash:
- 硬件版本:版本号 V2.1,V2.2,V3.0对应固件为:firmware_8m_flash_stm32f401_v21+&&V13_v1.12-540.hex
内置Flash Internal Rom:
- firmware_internal_rom_stm32f401_v1.12-540.hex
遇到特殊问题需要擦除外置SPI Flash的:
刷入该固件可以擦除外挂的SPI Flash,
LED
50ms快闪为识别Flash失败,长亮为擦除进行中,0.5s快闪为擦除成功,0.5s慢闪擦除失败
- SPIFlash_Erase_Firmware.hex
micropython入门使用中文教程:https://www.weact-tc.cn/2020/01/01/micropython/
更多资料请访问:https://gitee.com/WeActTC/WeAct_F411CE.git
(2)如何编译micropython 需使用linux (ubuntu或Win10企业版linux子系统)
不建议自己编译固件,使用我们提供的固件即可,如确实需要编译,请自备linux基础使用知识,以下均为linux下的操作
git clone https://github.com/micropython/micropython.git
cd micropython
git submodule update --init
cd mpy-cross
make -j4
cd ../ports/stm32/boards
复制当前资料文件夹下的WeAct_F401CE
到linux系统相应的文件下
复制 WeAct_F401CE 到 micropython/ports/stm32/boards
然后
cd YourPath/micropython/ports/stm32/
make BOARD=WeAct_F401CE CROSS_COMPILE=/mnt/e/MCU/tools/gcc-arm-none-eabi-8-2018-q4-major/bin/arm-none-eabi- -j
# 或者
make BOARD=WeAct_F401CE -j
注意:CROSS_COMPILE 修改为自己的编译器路径
(3)mpconfigboard.h 相应修改
/* 板子版本为 V2.0 设置为 1 ,其他设置为 0 例如.V1.3,V2.1 V3.0 */
#define VERSION_V20 (1)
/* 使用内置flash改1 使用外置flash改0 */
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (1)
// Flash Size:
// 4MB Flash 32Mbit
// 8MB Flash 64Mbit
// 16MB Flash 128Mbit
#define MICROPY_HW_SPIFLASH_SIZE_BITS (32 * 1024 * 1024)
SPI FLASH:
#define MICROPY_HW_SPIFLASH_CS (pin_A4)
#define MICROPY_HW_SPIFLASH_SCK (pin_A5)
#if VERSION_V20
#define MICROPY_HW_SPIFLASH_MISO (pin_B4)
#else
#define MICROPY_HW_SPIFLASH_MISO (pin_A6)
#endif
#define MICROPY_HW_SPIFLASH_MOSI (pin_A7)