[20日目] 100%オリジナルで高品質新しいSTM32F103完全に交換自由な船積み


本記事は、Cerevoスタッフが業務や趣味について思うままに書き綴るアドベントカレンダー企画「Cerevo アドベントカレンダーTechBlog 2019」の第20日目です。

Cerevo アドベントカレンダーTechBlog 2019
https://tech-blog.cerevo.com/archives/category/adventcalendar/2019/

STM32について

弊社では様々なメーカのMCUを使用していますが、汎用のMCUとして用いるものの一つとしてSTMicroelectronics社製のSTM32シリーズを使うことがあります。安価なARM Cortex-M0のSTM32F0シリーズに始まり、最近では Cortex-A7とCortex-M4のヘテロジニアスマルチコアでパフォーマンス豊かなSTM32MP1シリーズなど、スケーラブルなラインナップで非常に選択しやすい製品ラインナップがあります。

そんな中で、中国製のSTM32クローンチップの存在が指摘されています。数年前にOlimexのblogが話題になりました。

Chinese clones attack STM32 microcontrollers

https://olimex.wordpress.com/2015/11/09/chinese-clones-attack-stm32-microcontrollers/

ちょっと興味が湧いたのでクローンチップについて調べてみることにしました。STM32はその中でも、私の個人的な感覚としてよく使われる型番に偏りががあり、STM32F103C8T6をよく見かける気がします。これをターゲットにクローンチップを調査してみることにしました。

xx32F103C8T6

一般的な半導体の命名規則として、先頭の数文字でメーカ名を示し、続くその後にシリーズ名や定格、パッケージなどの情報を各メーカが各々の英数字で与えることが多いと思います。クローンチップでは先頭こそそれぞれのメーカ名を与えているものの、その後の型番についてはオリジナルのSTM32と全く同一の命名規則を使っているようです。

そこで、xx32F103C8T6の型番を持つクローンチップをざっと比較してみたものが以下の表です。MCUコアやフラッシュメモリ、SRAM、ペリフェラルなど目ぼしいスペックは全く同じに揃えてきていますが、最大動作周波数や電源電圧に各メーカのオリジナリティを感じます。なぜちょっと背伸びをしたのか。

Specification

STM32 vs GD32

この中から最近話題のGigaDevice社のGD32F103C8T6とSTM32F103C8T6を詳しく比較してみます。余談ですが GD32VF103は コアがRISC-Vなので よく似た別物です。そのうち試してみたい。

データシートより、Pinoutの図を拝借します。

(左)STM32F103xx(右)GD32F103Cx

電源ピンや特殊機能のピンは同じ場所へ割り当てているようです。ということは、少なくともポン付けで置き換えても何らかの動作はしそうです。タイマに関するピンやUSART等も合わせているようです。バッチバチに意識してますね。

続いて、メモリマップはどうでしょう? 書き方が異なるので少し見づらいですがペリフェラルに関するレジスタマップを拝借してきます。それぞれメモリ上のアドレス範囲と対応するペリフェラルを示しています。

(左)STM32F103(右)GD32F103

似ているものの、少しづつ違いがあることがおわかりいただけるでしょうか?reservedとなっている領域を比較するとわかりやすいかと思います。GD32はSTM32では予約されている領域にもレジスタを割り当てているようです。

試しにGPIOのPort Aレジスタを覗いてみましょう。これは何れのチップであっても同じアドレス(0x4001 0800)に位置しています。その中身にはどのような違いが見られるでしょうか。

(左)STM32F103(右)GD32F103

あれ? 完全に同じに見えますね。部分的にならば同じオブジェクトコードで動いてしまいそうです。しかしながら、ペリフェラルによっては異なる部分もあるので、全く同一のバイナリで動くかというと……どうなんでしょう?

CKS32F103C8T6

ひょんな事からクローンチップの載ったボードを手に入れました。通称Blue pillと呼ばれるSTM32F103の載ったボードのコピー品のようです。

Blue pill…?
チップ拡大

さて、これを動かしてみましょう。通常のSTM32開発時と同じ用にCubeIDEでプロジェクトを作ります。オンボードのLEDを使って単純なLチカコードを書いてビルドしました。それでは、ST-Linkを繋いでデバッグを始めましょう。このボードにはリセットピンが出ていないのでデバッガがアタッチするタイミングを見計らってボード上のリセットボタンを押すとアタッチできます。

すると、こんなエラーが出てきました。

一筋縄ではいかないようです。そこで、ST-Link Utilityを使用してみます。

認識しました

先程CubeIDEで書いたLチカプロジェクトからhexファイルを出力してこれを書き込んでみます。

書き込めました

すると、リセットがかかって

光った!

という事でシンプルなLチカプログラムは動いてしまいました。GPIO以外の他のペリフェラルが同様にSTM32と同じバイナリで動くかどうかは追々検証してみようと思います。それでは。

Cerevo 採用情報
Cerevoではエンジニアや広報など、様々な職種の採用活動を行なっています。
IoTプロダクト開発やスタートアップ支援、企画、営業に関心が高い方からのご応募をお待ちしております。

Wantedlyを見る採用情報を見る