Previous Post | Top | Next Post |
TOC
基本のSTM32F系の安価だけど、純正STMチップ(同等品でない)が載っていそうな 小型のデモボードとして、WeActのblackpillをAliexpressの正規ショップ から購入しました。STM32F411CEが載っています。
- WeActのデバイス情報 https://github.com/WeActTC/MiniSTM32F4x1
PCB回路要点
IC PIN | 機能 | 動作 |
---|---|---|
7 | NRST | RESET SW, PUSH=0 , NORMAL=1 |
44 | BOOT0 | BOOT SW, PUSH=1, NORMAL=0 |
20 | PB2 / BOOT1 | NORMAL=0 (pull down res.) |
10 | PA0 / WKUP1 | USER KEY, NORMAL=1, PUSH=0 |
2 | PC13 / | BLUE LED, LED_ON=0 |
STM32のメモリー
0x0000 0000 - 0x0007 FFFF
(REMAPされる) – The code area- 通常 BOOT0は押されていないので: Flash memoryをさしている
- つまりユーザー作成のFirmware実行
- BOOT0 pushed: System memory (BOOT0 pushed)
- CU内臓のBOOTLOADERの実行, STM32F411の場合はUSB経由のDFUもサポート
- 通常 BOOT0は押されていないので: Flash memoryをさしている
0x2000 0000 - 0x2002 0000
SRAM1 (128 KB) – The data area0x0800 0000 - 0x0807 FFFF
Flash memory Flash memory (512KB)0x1FFF 0000 - 0x1FFF 77FF
System memory (32MB)
起動
- the CPU fetches the top-of-stack value from address 0x0000 0000,
- the CPU starts code execution from the boot memory starting from 0x0000 0004.
リセットのモード
STM32F411xx は のBOOTMODEはPattern1で起動する。つまり、BOOTMODE実行条件は:
Boot0(pin) = 1
(BOOT SW, PUSHed)Boot1(pin) = 0
(Blackpillデフォルト)
つまり、REMAPを使い
- RESETだけを押すと、
Boot0(pin)=0
なので、Main Flash memory を実行。 - RESETとBOOT0 を押すと、
Boot0(pin)=1
なので、System memory を実行。
Standbyからの起動
PA0 / WKUP1
が 0->
1 でwakeup (つまり、USERのSWを離した時点)
使用上の注意(A9-A12
ピン)
A9-A12
は、USBコネクターと共用ピンなので、これらを使うとUSB接続ができなくなります。
これに気づくのにかなりの時間のロスをしました。結局、REDDITの記事で原因に気づきました。
PIN接続 (cgg56)
Blackpill (TOP VIEW)
USB-C
+---+-----+---+
R0 ------- B12 |* | | *|5V
R1 ------- B13 |* | | *|GND ----- JS_GND
R2 ------- B14 |* | | *|3V3 ----- JS_V
R3 ------- B15 |* +-----+ *|B10
C6 ------- A8 |* B N @|B2 --- BOOT1
[USB] XXX A9 |* O R @|B1 XXX
[USB] XXX A10 |* O S @|B0 XXX
[USB] XXX A11 |* T T *|A7 XXX
[USB] XXX A12 |* 0 *|A6 XXX
C4 ------- A15 |* *|A5 ------ JS_R1
C3 ------- B3 |* *|A4 ------ JS_R2
C2 ------- B4 |* *|A3 ------ C7
C1 ------- B5 |* *|A2 ------ C8
C0 ------- B6 |* *|A1 ------ C9
C11 ------- B7 |* *|A0 ------ C10
C5 ------- B8 |* K *|R ---- NRST (/RST, ~RST)
B9 |* E *|C15 ----- C12
5V |* Y *|C14 ----- C13
GND |* *|C13 -- BLUE LED
3V3 |* @ @ @ @ *|VB
+-------------+
^ ^ ^ ^
| | | |
3V3 ---------------+ | | |
SWDIO -----------PA13--+ | |
SWSCK -----------PA14----+ |
GND ---------------------+
- XXX PINs had mechanical interferences
A0-B1
can be used for ADC (A4
,B5
actually used for joystick)- Avoid pins used internally (USB I/O, …) and for DIO.
- blackpillにはピンヘッダーをハンダ付けし、キーボードSWにハンダ付けした AWG30のワイヤーをワイアラップで接続しています。(おかげで、間違って
A12
に繋いでいた線をB8
に移動するのが簡単でした。
FACTORY SETTING
とりあえず、PCに繋いでみました。
$ journalctl -f
...
... usb 4-2: new full-speed USB device number 13 using xhci_hcd
... usb 4-2: config 1 interface 0 altsetting 0 endpoint 0x81 has an invalid bInterval 0, changing to 10
... usb 4-2: config 1 interface 0 altsetting 0 endpoint 0x1 has an invalid bInterval 0, changing to 10
... usb 4-2: New USB device found, idVendor=0483, idProduct=572a, bcdDevice= 2.00
... usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
... usb 4-2: Product: WeAct Studio HID Bootloader
... usb 4-2: Manufacturer: WeAct Studio
... usb 4-2: SerialNumber: ************
... hid-generic 0003:0483:572A.001A: hiddev1,hidraw1: USB HID v1.11 Device [WeAct Studio WeAct Studio HID Bootloader] on usb-0000:08:00.3-2/input0
... checking bus 4, device 13: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2"
... bus: 4, device: 13 was not an MTP device
... checking bus 4, device 13: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2"
... bus: 4, device: 13 was not an MTP device
どうも、FLASHにはすでにHIDのBOOTLOADERがすでに入っていて、電源投入で普通に起動する模様です。
FIRMWARE書き込み (QMK DFU)
FIRMWAREはAT90USB1286とほぼ同じコードなんで、以下のrules.mk
設定で、(A12
ピン問題を解決したら)コンパイルして書き込みました。
# MCU name
MCU = STM32F411
BOARD = BLACKPILL_STM32_F411
# Bootloader selection
BOOTLOADER = stm32-dfu
...
そして。。。
$ make cgg56:default:flash
QMK Firmware 0.16.5
⚠ cgg56: DEVICE_VER in config.h is overwriting usb.device_ver in info.json
⚠ cgg56: DIODE_DIRECTION in config.h is overwriting diode_direction in info.json
⚠ cgg56: MANUFACTURER in config.h is overwriting manufacturer in info.json
⚠ cgg56: PRODUCT_ID in config.h is overwriting usb.pid in info.json
⚠ cgg56: VENDOR_ID in config.h is overwriting usb.vid in info.json
⚠ cgg56: Matrix pins are specified in both info.json and config.h, the config.h values win.
Making cgg56 with keymap default and target flash
...
Linking: .build/cgg56_default.elf [OK]
Creating binary load file for flashing: .build/cgg56_default.bin [OK]
Creating load file for flashing: .build/cgg56_default.hex [OK]
Size after:
text data bss dec hex filename
0 24088 0 24088 5e18 cgg56_default.bin
Copying cgg56_default.bin to qmk_firmware folder [OK]
Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/#/newbs_flashing
Trying again every 0.5s (Ctrl+C to cancel).....................................................
dfu-util 0.11
Copyright 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/
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 "
Downloading element to address = 0x08000000, size = 56376
Erase [=========================] 100% 56376 bytes
Erase done.
Download [=========================] 100% 56376 bytes
Download done.
File downloaded successfully
Submitting leave request...
Transitioning to dfuMANIFEST state
キーボードで動いています。とりあえず、一見落着です。
(Joystickはまだ動いていません。)
ちなみに、A12
ピン問題を解決する前は、ファームウエアーを書き込みはできるのに、USBデバイスの初期化すらができずホスト側からUSBデバイスとしてさえ認識されないひどい状況でした。
思い返すと、AVRのARDUINOで不用意にJTAG機能をONにするFUSE設定をして、一部のI/OのPINが使えなくなって悩んだのとある意味似た状況でした。
Previous Post | Top | Next Post |