TOP > 開発環境構築 > STM32 > Maple Mini

Maple Mini

(2018.7.27 作成)

(2020.11.29 更新)

 このページでは右のMaple Mini基板について紹介したいと思います。

 これと似たようなSTM32F103C8T6という基板を別途紹介しているのですが、この基板はLeafLabsが作成したオリジナルのMaple Miniのクローンとなっており、本記事執筆時点でAliexpressで検索すると300円ちょっとで購入することができます

 そしてこのページではSTM32F103C8T6基板を紹介したときと同じく、Arduinoとしてではなく、安価なSTM32基板として使用する方法を紹介しようと思います。

 この2種類の基板の違いですが、Maple MiniではSTM32F103CBT6というマイコンが搭載されており、C8T6に対してROM容量が64kBから128kBへと増量されている点が異なっています。

本家LeafLabs製とクローンの違い

 本家とクローンの回路図は以下のところにあります。

この両者を見比べると電源部分が違っていることが分かります。

 この両者の違いですが、オリジナルではLDOが2個使用されておりアナログとディジタルの電源が分離されています。フェライトビーズも用いられているので、ADCなどを行うときにノイズが入りにくいよう配慮されている様子がうかがえます。一方クローンでは電源分離が行われていないため、ノイズが入りやすくなっていると想像されます。

 さらに管理にが購入したクローンは上記回路図からダイオードD6が除去されており、場合によってはUSBからVinへ電流が逆流する可能性があります。

 またLDOも図面のものと異なりAMS1117が使用されています。AMS1117についてはこちらのページで紹介していますが、5Vの入力、3.3V出力、500mA以下で使用している分には問題ないと思います。ただ印字されている15Vを入れるとどうなることやら。。。

USBのプルアップ抵抗

 この基板にはMiniUSB端子が取り付けられています。このUSBはマイコンのUSBペリフェラルへつながっているため適切なファームを書かなければ使えません。

 ところでこのUSB近傍の回路ですが、右図のようになっています。トランジスタを使って一見複雑なことをやっているように見えるのですが、似たような回路はNucleo基板のST-Linkにも用いられています。

 これはDISC端子(PB9)をHighにすることでUSBのDPラインが0Vになり、USBバスをリセットできるようにしているためと思われます。

 トランジスタQ1でNucleoと論理が逆になっていますが、ちょっとこの意図はよくわかりません。USBバスリセットが必要ないのであれば常にUSB-DPをPull UP = DISC端子(PB9)をLowでよいと思います。

 このような複雑な回路をわざわざ組み込んでいる理由ですが、DISC端子がなにも設定されていない場合USBバスがリセットされており、USB端子にケーブルをさしても何も反応しません。一方で明示的にDISC端子を0Vに設定するとUSBバスが機能します。しかしこの際USBペリフェラルが適切に設定されていないとPC側でエラーになってしまいます。

 結局何が言いたいかというとUSB通信を使用しないときはDISC端子をHighにすることでPC側でエラーを起こさず5Vの給電用にだけソケットを使えるようになるということだと思います。

ST-Linkとの接続

 MapleMiniでは他のSTM32基板と異なりST-Linkとの接続端子が明示的には出ていません。このため書き込み冶具を下の写真の様に接続し使用します。

 また最初に接続する際はST-Link Utilityを用いてFlashが読めることを確認することをお勧めします。管理人の購入した個体ではRead out protectionが入っていたため、ST-Link Utilityを使用して解除しました。

動作確認

 ST-Linkで接続できればあとは他の基板と同様に使用することができます。

 お試しにLチカを行いましたが、STM32F103C8T6基板と同様のコードで無事動くことが確認できました。インクルードしているライブラリはこちらで紹介しています。

#include "DKS_Common_F103xB.h"
#include "DKS_F103C8T6.h"

DKS::STM32F103C8T6 board(DKS::MapleMini);

int main(void){
        DKS::InitSystem();
        board.Init();

        while (1){
                HAL_Delay(500);
                board.led.toggle();
        }
}

宣伝