スキップしてメイン コンテンツに移動

STM32F401CCU6 + 64Mbit SPI Flash に micropython をWSL2/Debian12でコンパイルしインストール

表題の通りなのですが、STM32F401CCU6 に 64Mbit(8MByte) SPI FLASHを載せてmicropythonをWSL2(Debian12)でコンパイルしインストールしてみました。
sudo apt-get install git build-essential binutils-arm-none-eabi gcc-arm-none-eabi
cd ~
mkdir stm32
cd stm32
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 ../ports/stm32/boards
git clone https://github.com/xreef/stm32f401cc_micropython_firmware
cp -a stm32f401cc_micropython_firmware/WeAct_F401CC WeAct_F401CC
cd ..
# mpconfigboard.hをバックアップ
cp -a boards/WeAct_F401CC/mpconfigboard.h boards/WeAct_F401CC/mpconfigboard.h.orig
以下をboards/WeAct_F401CC/WeAct_F401CC-mpconfigboard_h.patchとして保存します。
--- boards/WeAct_F401CC/mpconfigboard.h.orig    2023-11-15 06:20:45.685061505 +0900
+++ boards/WeAct_F401CC/mpconfigboard.h 2023-11-15 07:02:50.005053685 +0900
@@ -5,7 +5,7 @@

 /* BOARD Ver 2.0 set 1 ,other set 0 like V1.3 V2.1+ */
 #define VERSION_V20                 (0)
-#define USE_External_Flash          (0)
+#define USE_External_Flash          (1)
 #if !BUILDING_MBOOT
 #define MICROPY_HW_SPIFLASH_ENABLE_CACHE (1)
 #endif
@@ -16,7 +16,7 @@
 #define MICROPY_PY_USOCKET          (0)
 #define MICROPY_PY_NETWORK          (0)
 #define MICROPY_PY_STM              (0)
-#define MICROPY_PY_PYB_LEGACY       (0)
+#define MICROPY_PY_PYB_LEGACY       (1)

 #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)
 #define MICROPY_HW_ENABLE_RTC       (1)
@@ -25,6 +25,7 @@
 #define MICROPY_HW_ENABLE_TIMER     (1)
 #define MICROPY_HW_HAS_SWITCH       (0)
 #define MICROPY_HW_ENABLE_SERVO     (1)
+#define MICROPY_HW_USB_HID          (0)


 // HSE is 25MHz, CPU freq set to 84MHz
@@ -101,7 +102,7 @@
 // 4MB Flash 32Mbit
 // 8MB Flash 64Mbit
 // 16MB Flash 128Mbit
-#define MICROPY_HW_SPIFLASH_SIZE_BITS (32 * 1024 * 1024)
+#define MICROPY_HW_SPIFLASH_SIZE_BITS (64 * 1024 * 1024)
 #define MICROPY_HW_SPIFLASH_CS      (pin_A4)
 #define MICROPY_HW_SPIFLASH_SCK     (pin_A5)
 #if VERSION_V20
保存したパッチを当て、コンパイルします。
patch -p0 < boards/WeAct_F401CC/WeAct_F401CC-mpconfigboard_h.patch

make DEBUG=0 LTO=1 BOARD=WeAct_F401CC MICROPY_ROM_TEXT_COMPRESSION=1 CROSS_COMPILE=arm-none-eabi- -j 6

(前略)
LINK build-WeAct_F401CC/firmware.elf
   text    data     bss     dec     hex filename
 261380      16   31668  293064   478c8 build-WeAct_F401CC/firmware.elf
GEN build-WeAct_F401CC/firmware.bin
GEN build-WeAct_F401CC/firmware.hex
GEN build-WeAct_F401CC/firmware.dfu
今回はWSLのホームディレクトリ以下でビルドしたので、Windowsからは直接見えないためfirmware.???をたとえば以下のようにWindowsから見えるようにしてから、CubeProgrammerなどでターゲットに書き込みます。
mkdir -p /mnt/c/Temp
cp -a build-WeAct_F401CC/firmware.??? /mnt/c/Temp/
書き込み後母艦にUSBで接続します。正常に起動できていたらUSBシリアルデバイスとして認識されるのでTeraTermなどで115200/8/pn/1で接続しリセットすると以下のようになります。
MicroPython v1.21.0 on 2023-11-15; WeAct_Core with STM32F401CC
Type "help()" for more information.
>>> 
続いてspi flashが正常に機能しているか確認します。
>>> import os
>>> os.listdir("/")
['flash']
>>> os.listdir("/flash")
['boot.py', 'main.py', 'pybcdc.inf', 'README.txt', 'System Volume Information']
>>>
また母艦上では、USBStorageとしても認識されるので確認してみてください。
ちなみに、python shellでのLチカサンプルは以下の通りです。pybにdelayが含まれていなかったのでutimeのsleep_msを使いました。
>>> import pyb
>>> myled = pyb.LED(1)
>>> while True:
...     myled.toggle()
...     pyb.delay(500)
...
...
...
(ennterを3回入力。停止はctrl+c。)
401CCU6はRAMが64KByteなのですがFlashが8MByteあればそこそこつかえるのではないかなと思います。コンパイル+インストールし少し弄っただけですが、備忘録として挙げてみました。今回は以上です。それでは。

コメント

このブログの人気の投稿

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-