STM32F407VET6が載ったボードでF4VE BLACK/BLACK_F407VEというのがあり、micropython 向けのportもあるのですが、そのままでは2023/11現在最新の v1.21.0 ではコンパイルできませんでした。しかし少し手を入れるとビルドできたので備忘録として挙げてみることにしました。
まず、portをcloneします。
SDCardについてはmicropythonでの運用に少し癖があるといってよく、注意が必要ですね。
ちなみに、SDCardが正常に機能していると、SDCardを挿したまま起動した場合、SDCardがデフォルトデバイスとして認識され、sdcard上にmain.pyを配置すると起動時に実行してくれます。このボードにはLEDが二つあるので例えば以下のようにするとLEDがそれぞれ2Hzと4Hzで点滅します。
まず、portをcloneします。
mkdir -p ~/stm32/micropython cd ~/stm32/micropython git clone https://github.com/mcauser/BLACK_F407VEつづいてmicropythonをcloneしておきます。
git clone https://github.com/micropython/micropython.git -b v1.21.0 micropython-v1.21.0 cd micropython-v1.21.0 git submodule update --init cd mpy-cross make -j6 cd .. cp -a ../BLACK_F407VE ports/stm32/boards/次に、一部修正が必要なので編集します。
boards/BLACK_F407VE/mpconfigboard.mk 変更前 9 MICROPY_PY_USSL = 1 変更後 9 MICROPY_PY_SSL = 1変更はここだけです。つづいてビルドしますが、v1.21.0をWSL2/Debian 12.1でビルドするとリンク時にエラーがでました。
../../lib/mbedtls/library/ssl_tls.c:3328:5: error: 'mbedtls_sha512_finish_ret' accessing 64 bytes in a region of size 48 [-Werror=stringop-overflow=]なのでビルド時に、CFLAGを追加してmakeします。
cd ports/stm32 CFLAGS="-Wno-stringop-overflow" make DEBUG=0 LTO=1 BOARD=BLACK_F407VE CROSS_COMPILE=arm-none-eabi- -j 6ビルドは以上です。後はCubeProgrammerなどを使ってターゲットに書き込んで下さい。(初めての場合は不要かもしれませんが、少なくとも二回目以降の書き込みはBoot 0 ピンを3.3V側にしてから、再接続して書き込む必要があります。) 初回USBに接続するとinternal flash fsをフォーマットするため接続エラーが出るかもしれませんが、フォーマットが終わるまでしばらく待って再度接続すればWindowsの場合以下のように認識されます。 この場合はMCU内蔵のFlashデバイスですが、このボードには2MByteのSPIフラッシュが載っているのでこれを使う場合は、以下のようにします。
// boards/BLACK_F407VE/mpconfigboard.h 5 // 1 = use internal flash (512 KByte) 6 // 0 = use onboard SPI flash (2 MByte) Winbond W25Q16 7 #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0) 8 #define MICROPY_HW_SPIFLASH_ENABLE_CACHE (1)なお、SDCardによってはそもそもmicropythonで認識できないものもありましたが、linux上で以下のようにフォーマットすると、大抵の場合正常に動作しました。
mkfs.vfat -I -n 16GB_02 /dev/sdc16GB_02はラベルですので任意に変えてください。またフォーマットする前にsdcの部分はdmesg | tail -n 50 などで確認してください。間違うとシステムディスク等をフォーマットしてしまい大変なことになりますので、ご注意を。 追記:以下のように1パーティションを作成しフォーマットしても認識できました。
#df で確認しマウントされていたらアンマウントする。 $ sudo umount /dev/sdc1 $ sudo dd if=/dev/zero of=/dev/sdc bs=1024k count=64 $ sudo fdisk /dev/sdc Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS (MBR) disklabel with disk identifier 0x586ec73f. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-16078847, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-16078847, default 16078847): Created a new partition 1 of type 'Linux' and of size 7.7 GiB. Command (m for help): t Selected partition 1 Hex code or alias (type L to list all): 0c Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. $ sudo mkfs.vfat -n 8GB_00 /dev/sdc1また、micropythonを使って os.VfsFat.mkfs(pyb.SDCard()) とした場合、micropythonではマウントできるのですが、Windowsからは認識はするがマウントできませんでした。
SDCardについてはmicropythonでの運用に少し癖があるといってよく、注意が必要ですね。
ちなみに、SDCardが正常に機能していると、SDCardを挿したまま起動した場合、SDCardがデフォルトデバイスとして認識され、sdcard上にmain.pyを配置すると起動時に実行してくれます。このボードにはLEDが二つあるので例えば以下のようにするとLEDがそれぞれ2Hzと4Hzで点滅します。
# main.py -- put your code here! import pyb pyb.LED(1).on() pyb.LED(2).on() tim_a = pyb.Timer(4) tim_a.init(freq=2) tim_a.callback(lambda t:pyb.LED(1).toggle()) tim_b = pyb.Timer(5) tim_b.init(freq=4) tim_b.callback(lambda t:pyb.LED(2).toggle())今回は以上です。それでは。
コメント
コメントを投稿