STM32Fxテンプレート発売

2016年MCUシェア第5位のSTマイクロエレクトロニクス(STMicroelectronics、本社スイス)のSTM32F0:Cortex-M0とSTM32F1:Cortex-M3向けのテンプレートを開発しましたので、販売開始します。従来テンプレートと同額の1000円(税込)です。

STM32Fxテンプレートの特徴

STM32Fxテンプレート構成
STM32Fxテンプレート構成
  • Cortex-M0とCortex-M3両コア動作のテンプレート
  • 移植性、可読性が高いHALドライバを使ったので、他コアへの流用、応用性も高い
  • カウントダウンループを使ったCortex-M系コードテクニックで開発

従来テンプレートは、ARM Cortex-M0/M0+とルネサスS1/S2/S3コアが対象でした。

つまり、8/16ビットMCUの置換えを狙ったCortex-M0/M0+と、RL78汎用MCUへテンプレートを供給していました。しかし、IoTの通信処理や要求セキュリティを考慮すると、より高性能なMCUも視野に入れた方が良いと感じていました。また、Cortex-M3デバイスの低価格化も期待できます。

初めてCortex-M3のSTM32F103RB:NUCLEO-F103RBへもベアメタルのテンプレートを開発したのは、以上のような背景、理由です。

ST提供のHAL:Hardware Abstraction Layerドライバは、移植性、可読性が高く、Cortex-M0/M3両対応のテンプレートも簡単に開発できました。Cortex-M3よりもさらに高性能なMCUが、ベアメタル開発を行うかは疑問ですが、HALを使ったので適用できると思います。

動作確認評価ボードは、STM32F072RB:Cortex-M0/48MHzとSTM32F103RB:Cortex-M3/64MHzですので、これはあくまで私見、見込みですが…、HALドライバならば問題なく適用できるハズです。

HALドライバ作成にSTM32CubeMXを使うと、異なるコア動作速度(M0:48MHz、M3:64MHz)でも、同じ周辺回路ならば、同じHAL APIが使えます。

今日現在、このSTM32CubeMX周辺回路のGUI設定に関する詳しい資料が見当たりません。そこで、テンプレート添付資料では、テンプレートのSTM32CubeMX設定方法や、SW4STM32開発ヒントやTipsなど開発に役立つ情報を満載しています。初めての方でもSTM32MCUの開発障壁を低く出来ます。

また、本テンプレートをプロトタイピング開発に使って、MCU性能の過不足を評価するのも便利です。ボードレベルでピンコンパチなSTM32 NUCLEO評価ボードですので、評価ボード単位の載せ替え/交換も可能です。

さらに、デクリメントループを使ってループ終了を行っているなど、Cortex-M系のコード作成にも注意を払いました。

*  *  *

マイコンテンプレートサイトへ、STM32Fxテンプレートを掲載します(9月2日追記:サイト更新完了しました)。
添付資料のP1~P3、もくじの内容を掲載しております。P1~P3は、資料ダウンロードが可能です。STM32Fxテンプレートをご購入の上、是非、ご活用ください。

STM32CubeMXの使い方Tips

STM32CubeMXは、STM32Fxマイコンのコード生成ツールとして良く出来ています。但し、現状1つ残念なことがあります。HAL:Hardware Abstraction Layerに加え、BSP:Board Support Packagesをドライバとして出力しないことです。そこで、現状のHALドライバのみ出力に対策を加えます。

STM32CubeMX
STM32CubeMX

STM32Fxファームウエア構成

STM32Fx Software Structure
STM32Fx Software Structure

STM32Fxファームウエア構成が上図緑線の個所です。STM32Fxマイコンサンプルソフトは、使用するファームウエアライブラリに応じて、Low Layer examples、Mixed HAL & Low Layer examples、HAL examplesの3種類あります。

各ファームウエアの差や、サンプルソフトの場所は、以前記事で解説しました。ここでは、STM32F0からSTM32F1へのポータビリティが最も高いHALライブラリ(=ドライバ)を使うサンプルソフト:HAL examplesに的を絞って解説します。

HAL Examples

このサンプルソフトの優れた点は、評価ボード実装済みの青SW(USER Blue)と緑LED(LD2)のみで全てのサンプルソフト動作を確認できることです。SW入力と、LED点滅間隔を変えることで、正常/NG/入力待ちなど様々なサンプルソフトの動作状態を表現します。

この青SWと緑LEDを制御するには、GPIO定義とHALライブラリを組合せた一種のサブルーティンがあると便利です。このサブルーティンが、BPS:Board Support Packagesです。例えば、下記などです。

BSP_LED_On()、BSP_LED_Off()、BPS_LED_Toggle()、BPS_PB_GetState()

BSP_が先頭に付いているので、一目で評価ボード実装済みの青SWや緑LEDを制御していることが判りますし、HALライブラリを使って表現するよりも、可読性もより高まります。BPSの中身は、HAL自身ですので、Drivers層のBSP、HALともに同じ黄緑色で表示しています。

HAL exampleは、これらBSPとHAL両方を使って記述されています。

STM32CubeMX

STM32CubeMXは、最初に使用する評価ボードを選択後、コード生成が行えます。

STM32CubeMX Board Selector
STM32CubeMX Board Selector

但し、生成コードに含まれるのは、HALドライバのみです。BSPは、HALサブルーティンですので、自作もできますが、評価ボードを選択するのですから、せめてHALのみか、それともHALとBSPの両方をドライバとして出力するかの選択ができるように改善してほしい、というのが私の希望(最初に言った現状の残念なこと)です。

もしHALとBPSドライバ両方がSTM32CubeMXで出力されると、多くのHAL Examplesを殆どそのまま流用できるメリットが生じます。HAL Examplesは、残念ながらエキスパートの人手で開発したソースですが、これを自動コード生成の出力へ、より簡単に流用できる訳です。

STM32CubeMX出力ファイルへのBSP追加方法

BSPドライバを自動出力しない現状のSTM32CubeMXで、上記希望をかなえる方法は、簡単です。

STM32CubeMX出力ファイルへのBSP追加
STM32CubeMX出力ファイルへのBSP追加

手動でBSPのstm32f0xx_nucleo.cとstm32f0xx_nucleo.hをSTM32CubeMX生成プロジェクトのSrcとIncフォルダへコピーし、main.cのL43へ、#include “stm32f0xx_nucleo.h”を追記すればOKです。
※stm32f0xx_nucleo.c/hは、\STM32Cube\Repository\STM32Cube_FW_F0_V1.8.0\Driversにあります。

たとえSTM32CubeMXで再コード生成しても、stm32f0xx_nucleo.c/hはそのままですし、追記した部分もそのまま転記されます。この方法で、HAL Examplesの流用性が向上します。

HAL Examplesを読むと、周辺回路の細かい設定内容が解ります。この設定をそのままSTM32CubeMXに用いれば、周辺回路の動作理解が進み、さらに自動コード生成ソースへ、Examplesソースをそのまま流用できるので、評価ボードでの動作確認も容易です。

まとめ

現状のSTM32CubeMXは、BSPドライバを出力しません。対策に、手動でBSPドライバを追加する方法を示しました。これによりエキスパートが開発したサンプルソフトを、より簡単に自動生成ソフトへ組込むことができます。

開発中の弊社STM32Fxテンプレートも、サンプルソフトを流用/活用が使いこなしのポイントです。そこで、このBPSを組込む方法をSTM32Fxテンプレートへも適用し、サンプルソフト流用性向上を図っています。

評価ボードNUCLEO-F072RB/F103RBのピン選択指針

STマイクロエレクトロニクスの評価ボード、NUCLEO-F072RBやNUCLEO-F103RBを使って、ボード外部と接続する際の、ピン選択に関する指針を示します。

NUCLEO-F072RBの外部接続ピン
NUCLEO-F072RBの外部接続ピン

評価ボードのピン配置とSTM32CubeMXのピン選択

評価ボードには、外部接続用のピンとしてArduinoピン(ピンク色)と、NUCLEOボード独自のMorphoピン(青色)があり、Morphoピンの一部は、Arduinoピンと共用(赤囲み)です。2つの黄色マークは後述します(評価ボードのユーザマニュアルは、コチラを参照)。

Arduinoピンは、メスコネクタ、一方Morphoピンは、オスコネクタを使っており、ブレッドボードや弊社マイコンテンプレートで使うBaseboardとの接続には、Arduinoピンを使いオスーオス結線が便利です(Baseboardやオスーオス結線のメリットはコチラの記事を参照)。

評価ボードNUCLEO-F072RB (=STM32F072RB)やNUCLEO-F103RB (=STM32F103RB)を使う時のコード生成ツールが、STM32CubeMXです(STM32CubeMXはこちらの記事などを参照)。

STM32CubeMXは、MCUパッケージイメージから使用ピンを選択、設定します。色付きピンは、既に評価ボードで使用済みのピン、灰色ピンが未使用ピンです。

例えば、灰色ピンのPB7は、I2C 1_SDA~GPIO_EXIT7までの広い範囲で自由に機能を設定可能です。

STM32CubeMXのピン選択
STM32CubeMXのピン選択

STM32F072RBとSTM32F103RBは、どちらもLQFP64パッケージでピンコンパチです。緑色のB1 [Blue Push Button] :PC13と、LD2 [Green LED] :PA5の2ピンを評価ボードで使用しますので、前述の評価ボード接続ピンに、既に使用済みという意味で黄色マークを付けました。

長くなりましたが、ここまでが、前置きです。これらの前置きを知ったうえで、STM32CubeMXで自由に設定できる灰色ピンの内どれを使うと、効果的な評価ボード開発ができるのかを明らかにするのが本記事の目的です。

STM32CubeMXのピン選択指針

STM32F072RBやSTM32F103RBのソフト開発の場合、最初にSTM32CubeMXで使用ピンを決め、コード生成をします。もちろん使用ピンは、コード生成後も変更できますが、変更のたびに再コード生成が必要です。再コード生成の手間は、できれば避けたいです。

こんな時、ピン選択の指針があると便利です。

前置き情報から、Arduinoピンを使うと、ブレッドボードやBaseboardとの接続が、オスーオス結線で簡単、市販Arduinoシールドも使えることが判ります。そこで、Morpho ピンで、Arduinoピンと共用しているピンを昇順に抜粋すると、下記になります。

GPIOA:            PA0/PA1/PA2/PA3/PA4/PA5/PA6/PA7/PA8/PA9/PA10
GPIOB:            PB0/PB3/PB4/PB5/PB6/PB8/PB9/PB10
GPIOC:            PC0/PC1/PC7/PC9

GPIOAが多数ですが、Arduinoピン名をみるとA0などのアナログ入力ピンとの共用が多いので、デジタル入出力と思われるD0~D15での共用が多いGPIOBから先に割り当てる方針を立てました。

BaseboardとのLCD接続

この方針でBaseboardのLCDと接続し、LCD出力した例を示します。本方針が、LCD接続では有効であることが判ります。

NUCLEO-F072RBとBaseboard接続しLCD出力
NUCLEO-F072RBとBaseboard接続しLCD出力

まとめ

開発中のSTM32Fxマイコンテンプレートは、テンプレート応用例としてシンプル/Baseboardテンプレートの2つを添付します。シンプルテンプレートは、評価ボード単体で動作しますので、使用する外部接続ピンに悩む必要はありません。

Baseboardテンプレートは、評価ボードとBaseboardを接続して動作させますので、効果的な接続方法として、評価ボード外部接続ピンの選択指針を検討しました。

デジタル接続なら、Arduinoピンとのデジタル共用が多いGPIOBから選択し、アナログ接続なら、GPIOAから選択する指針を示し、この指針に基づいてBaseboardのLCDと接続し出力を確認しました。

追記

評価ボードのArduinoとMorphoの共用コネクタ部分の回路図を抜粋したのが下図です。

NUCLEO64 Boardのコネクタ回路図
NUCLEO64 Boardのコネクタ回路図(ユーザマニュアルより)

評価ボード裏面のジャンパー(回路図のSBxxなど)を、工夫(オープン/ショート)すると、ArduinoピンとMorphoピンの共用ピンをさらに変更できることが判ります。よく考えられた評価ボードです。

RL78ファミリのロードマップ

最新RL78 MCUファミリのカタログから、ルネサスRL78 MCUの開発ロードマップを抜粋しました。今後のRL78 MCUの方向性として、アナログ、センサ対応力強化が見えてきます。

RL78ロードマップと周辺回路の強化ポイント

RL78ロードマップ
RL78ロードマップ(カタログP2より)

ページ2ロードマップの赤字コメントは、ルネサスがその製品特徴を一言で表したキーワードです。緑色新製品MCUの赤字記載で目立つのは、アナログ強化とセンサです(ここでは、前提条件として無償版開発環境CS+で開発できるMCUでフィルタリングするので、ROM64KB以上の製品は除外します)。

さらに、このアナログ強化とセンサの詳細内容をカタログ記載の各MCUから読むと、S1/S2/S3コアへ、周辺回路PGA:Programmable Gain Amplifierとコンパレータ、ADC/DACを強化した製品であることが判ります。汎用製品でも、よりIoT向けのMCUへ変化しつつあることが、同ページのRL78応用分野からも解ります。

ARM Cortex-M系に勝るRL78の高品質サンプルソフト

ARM Cortex-M系が全盛な低価格MCUの市場で、唯一独自16ビットS1/S2/S3コアでライバルと争っているRL78。この市場で生き残るには、価格や開発環境の良さに加えて、実際の開発がラク、手軽になることです。

前回、RL78開発者の方々へ少し悲観的な記事を書きましたが、RL78 MCUは、使えるサンプルソフトが豊富で解説が親切、理解しやすいことも特徴です。サンプルソフトの良さ悪さは、アプリケーションの早期開発(=プロトタイピング)には重要な要素です。プロトタイピングには、ルネサスの高品質サンプルソフトと、弊社RL78/G1xテンプレートを活用してください。

開発環境CS+のサンプルソフトは、付属のスマートブラウザーを使うと、検索が簡単です。

CS+スマートブラウザーによるサンプルソフト検索
CS+スマートブラウザーによるサンプルソフト検索

残念ながら、サンプルソフトの質は、評価しにくい項目なので、MCU選定時の項目からは除外されがちです。本ブログでは、RL78サンプルソフトの質が優れた特徴をもっとアピールしていきたいと考えています。

*  *  *

PS:LPC81x/82x共通化を目指したLPC8xxテンプレートV3の開発は、7Eを予定していましたが、LPCOpenライブラリv3.01付属サンプルソフトに複数の不具合があるため、一時停止としました。これら不具合解消後、再開します。

Runesas RL78開発者に読んでほしい記事

Runesas RL78開発者の方々へ読んでほしい記事、「ARMコアの普及:前後編」を紹介します。

記事概要

ARMコア普及の背景、理由、MCUベンダーメリット、開発者メリットなどが解り易く記載されています。

Runesas RL78開発者の方々は、日々忙しい開発スケジュールに追われ、課題解決のために情報収集などを行っていると思います。RL78情報は、日本語資料やかふぇルネによるコニュニティーサポートも充実しているので、日本人開発者にとってRL78は便利です。

但し、別MCUの状況を知ることも大切です。RL78は優れたMCUです。しかし、良いMCUや技術が生き残るかは、全く別問題です。開発者は、現状に拘らず、バックアップ技術も習得しておくことが大切です。

このバックアップ技術の候補を考えるうえで、上記記事は示唆に富んだ方向性を示してくれると思います。


CS+ V6更新後のウイルス対策ソフトAvastとの相性問題

先日RunesasのCS+がV6に更新されました。弊社マイコンテンプレート動作を、この最新CS+で確認しました。

但し、動作確認終了後、約1時間した後に、ウイルス対策ソフトAvast 17.5.2303から下記ワーニングが発生しました。CS+は、既に動作終了しています。

CS+とAvast相性問題
CS+とAvast相性問題

動作終了したCS+が原因だと気が付かずに、うっかり動作を阻止すると、CS+の今後の動作に支障が発生する可能性もありますので、私は、除外リストへCS+の当該処理を加えました(以前も同様のワーニング発生で同じ対処でトラブル回避しました)。

同じようなワーニングが発生した場合には、 参考にしてください。

LPC8xxのGPIO制御とデバッグTips

NXP ARM Cortex-M0+マイコンLPCXpresso8xxのLPCOpenライブラリが、v3.01へ更新され、v2.x版から持ち越された多くのバグが修正されたようでした(結論から言うと、LPC81xにはバグが残っています。LPCXpresso8xxのLPCOpenライブラリv3.01は、前回の記事を参照してください)。

今回は、マイコン制御で最も基本となるGPIO制御を、MCUXpressoのサンプルソフトperiph_gpioと最新LPCOpenライブラリv3.01を使って解説し、さらにデバッグTipsを示します。

サンプルソフトperiph_gpioのGPIO API

LPCOpen v3.01のGPIO API数は、GPIO機能初期化、GPIOピン単位制御、GPIOポート単位制御の3種類で35個あります。全部使う必要はありませんので、最も基本的なGPIO APIを抜粋し使っているのがperiph_gpioで下記7個です。

periph_gpioのGPIO API一覧(その1)
GPIO API 概要
1 Chip_GPIO_Init(LPC_GPIO_PORT); GPIO機能初期化(=クロック供給)
2 Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, ledBits[i]); ピン(入)出力方向設定
3 Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, ledBits[LEDNumber]); ピン入力値取得
4 Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, ledBits[i], true); ピン出力値設定
5 Chip_GPIO_SetPinToggle(LPC_GPIO_PORT, 0, ledBits[LEDNumber]); ピン出力値反転

LPCXpresso8xxは、Portは0しかありませんので、「LPC_GPIO_PORT, 0,」は決まり文句、最後のパラメタは、GPIO0_xyzのGPIO論理ポート番号を示します。物理ピン番号ではない点に注意してください。

periph_gpioのGPIO API一覧(その2)
GPIO API 概要
6 Chip_GPIO_SetPortMask(LPC_GPIO_PORT, 0, ~PORT_MASK); ポートマスクレジスタ設定
7 Chip_GPIO_SetMaskedPortValue(LPC_GPIO_PORT, 0, count); ポート出力値設定(マスクレジスタ経由)

ポート単位のGPIO APIは、複数の出力ピン出力を同時に設定するもので、バス出力時に便利です。これら7個のGPIO APIのみを習得していれば、基本的なGPIO制御ができます。

評価ボード実行結果

LPC81xは、LPCXpresso812、LPC82xは、LPCXpresso824-MAXの評価ボードで実行した結果が下図です。

periph_gpio実行のデバッグ画面
periph_gpio実行のデバッグ画面(赤色がLPC824、青色がLPC812)

LPC81xとLPC82xでは、同じソースでも、ポート出力値が異なります。期待値は、LPCXpresso824-MAXでしか得られません。つまり、LPC81xにはGPIO APIのポート制御にバグがあることが判ります。

デバッグTips

ここで、デバッグのTipsを解説します。

MCUXpressoのローカル変数は、Quick Start ViewのVariablesタブで、周辺回路状況は、Workspace ViewのPeripherals+タブで表示可能です。適当な場所にブレークポイントを設定しF8クリックで、ブレークポイントまで実行します。評価ボード実行結果は、この操作で得られたものです。

現行版MCUXpressoは、デバッグでよく使うファンクションキーのツールチップが一部表示されません。
F8(実行)と、F5(ステップ実行)、F6(ステップオーバー:関数に入って処理「後」停止)、F7(ステップリターン:関数に入った状態で処理「後」停止)を覚えておくとデバッグ効率が良くなります。

LPCOpenライブラリv3.01のLPC81xポート制御、バグ回避方策

LPC812とLPC824はGPIOレジスタ構成が異なります。後で開発されたLPC824の方が、より制御し易いレジスタを備えています(ハードウエアマニュアルより抜粋)。

LPC824とLPC812のGPIOレジスタ比較
LPC824とLPC812のGPIOレジスタ比較

バグがあったLPC81xのポート出力値設定の代替として、他のGPIO API利用または、直接ハードレジスタ操作などを試しましたが、LPCOpen v3.01では、代替方法が見つかりません。思うにLPC81xライブラリの結構深い場所にバグがある可能性があります。

そこで、LPC81x動作には、旧LPCOpenライブラリv2.15を、LPC82x動作には、最新LPCOpenライブラリv3.01を使ってLPC82xテンプレート開発をすることに方針変更しました。当初目標のLPC8xxテンプレート、つまりLPC82xとLPC81xの両方を同じテンプレートソースで実現することは、残念ながら諦めました。

MCUXpressoでの旧LPCOpenライブラリv2.15の使い方

MCUXpressoは、このようなバグの場合に備えて旧LPCOpenライブラリ群も備えています(C:\nxp\MCUXpressoIDE_10.0.2_411\ide\Examplesフォルダ参照)。最新版MCUXpresso IDE v10.0.2_411でもLPCOpenライブラリv3.01が同封されていないのも、本稿で示したバグが理由かもしれません。

旧LPCXpressoプロジェクトをMCUXpressoで開こうとすると、下記ワーニングが出力されます。

Older Workspace Version Warning
Older Workspace Version Warning

旧LPCXpressoとMCUXpresso両方を使い続ける方は、LPCXpressoプロジェクトをコピーして別名のプロジェクトを作成した後に、MCUXpressoで開くと良いでしょう。

LPC81xテンプレートV2.1は、テンプレートプロジェクト内にLPCOpenライブラリv2.15を装着していますので、そのままMCUXpressoで開いても問題なく動作します。

*  *  *

LPCOpenライブラリv3.01を使った新しいLPC82xテンプレートV3の開発は、7E目標で進行中ですが、上記のようなLPCOpenライブラリv3.01バグがあり、予定より難航しています。ちなみにUart関連は、LPCOpenライブラリv3.01でかなり改善されました。

また、MCUXpressoは、Ctrl+スペースキーによる入力補完機能も実装されており、使い勝手は向上しています。旧LPCXpressoを使う必要性は低いと思います。

LPC8xxテンプレートV3完成は、今しばらくお待ちください。

NXP LPC8xx LPCOpenライブラリ更新

NXPのLPX8xxのLPCOpenライブラリが、1年7か月ぶりに更新されv3.01になりました。リリースノートを見ると、多くのバグが修正され、積み残しバグ(Carried Forward)も(現時点では)無くなりました。

なお、7月11日発表のMCUXpresso IDE v10.0.2 [Build 411]に、この最新LPCOpenライブラリv3.01は、未だ同胞されていません。 是非LPCOpenサイトから手動でダウンロードしてください。

v2.15積み残しGPIO APIバグ解消

本ブログ2015年9月記事のGPIO APIバグも解消されました。
このGPIO APIバグは、2年以上前のv2.15から積み残されたものです。GPIO APIは、マイコンAPIのなかで最も重要かつ頻繁に使うものだけに、手動で修正し利用されていた方も多いと思いますが、やっと解決されました。

LPC111xのLPCOpenライブラリは未更新

LPC1100シリーズのLPCOpenライブラリ更新状況がコチラです。残念ながら、弊社LPC111xテンプレートで使用中のLPCOpenライブラリLPC11C24は、v2.00a(2013/09/13)のままです。但し、LPC111xテンプレート動作には特に問題ありません。

LPC82xテンプレート開発再開

LPC8xx LPCOpenライブラリが更新され、GPIO APIバグも無くなりましたので、前述の2015年9月記事で一時停止中であったLPC82xテンプレートの開発を再開します。

開発環境は、旧LPCXpressoを変更し、最新のMCUXpressoとします。リリースは、7月末を予定しております。
勿論、既存LPC81xテンプレートも最新LPCOpenライブラリv3.01を使って再開発し、まとめてLPC81x、LPC82x両方に対応したLPC8xxテンプレートとします。

また、Cortex-M系マイコンのコードテクニックとして有名な、ループ構文には、カウントダウンの方が高速でコードサイズも小さいことをテンプレートへ取り入れた改良も加える予定です。
※上記コードテクニックは、ARMコンパイラバージョン6.6ソフトウエア開発ガイド 7章を参照してください。

*  *  *

LPCOpenライブラリの更新は、NXPの 各種Cortex-Mマイコンへの力の入れ具合を反映したものと思います。

最新マイコンのLPC54xxxのLPCOpen版数は、v3.03.000やv3.00c.001で、LPC8xxよりも更新日も早いのは当然ですが、LPC8xxが、例えばLPC13xxなどの既存他シリーズよりも早くLPCOpen v3.xxへ更新されたのは、反映結果でしょう。これは、2016年12月記事の2017NXPロードマップとも符合します。

既存マイコンの置換え市場を狙った、小ピンでスイッチマトリクスを持つ32ビットLPC8xxマイコンの優位性を示す指標の1つだと言えます。

ARM Cortex-M3低価格化への期待

ARM Cortex-M3の設計開始時ライセンス費用がCortex-M0同様、無償化されることが発表されました。

これにより、新たに商品化されるCortex-M3コアを使ったMCU価格が下がる可能性があります。Cortex-M0(ARMv6-M)を100%とする性能比較をみると、Cortex-M3(ARMv7-M)の性能向上比が大きいことが判ります。

Performance of Cortex-M
Performance of Cortex-M

RTOSやIoT通信などのMCU環境の変化を考慮すると、コストパフォーマンスに優れたCortex-M3を次期MCU選択肢に、より入れやすくなります。

NXP LPC84x発表、2017/3Qより供給予定

6月27日、NXP LPC8xxロードマップ2017掲載のLPC84xが発表されました。

LPC84xは、従来のLPC8xx(小ピン+スイッチマトリクス)に、新たな特徴が追加されました。

・高速アクセス初期設定メモリ(FAIM)により、電源オン時クロック低周波数モード起動が可能でスタートアップ消費電流を最小化
・GPIOポートの設定構成による即時起動が可能で、MOSFETなどの付属デバイスによる潜在的な終端問題を解消

データシート6章のブロック図を示します。

LPC84x Block Diagram
LPC84x Block Diagram(データシートより)

スタートアップ消費電流の最小化を実現するのが、FIAM:Fast Initialization Memoryでこれを使うことで1.5MHzブートが可能です。起動を繰り返してもバッテリー消費が抑えられ、より長い期間の動作が期待できます。

また、容量式タッチセンシングやライブラリーによる自動キャリブレーションなどのアプリケーション向きの機能も追加されています。

LPC8xx MCU Lineup
LPC8xx MCU Lineup(ファクトシートより)

2017/3Q(7~9月)に評価ボードLPCXpresso845-MAXとともに供給開始の予定だそうです。

STM32F0ソフトをF1変更時のHAL利用効果

STM32ソフト開発に、HAL:Hardware Abstraction Layerライブラリを使えば、文字通りARMコアを抽象化したソフトが作れます。コード生成ツールSTM32CubeMXが、HALをデフォルトで使うのもこの理由からです(HALとLLライブラリについては、6月5日記事も参考にしてください)。

そこで、STM32CubeMXのHAL出力とF0:Cortex-M0評価ボードSTM32F072RB(48MHz)で動作するSTM32Fxシンプルテンプレートを、F1:Cortex-M3評価ボードSTM32F103RB(64MHz)へ載せ替えた時のソースコード変更箇所を示し、HALを使ってARMコアを抽象化した結果、ソースコードのどこが共通化でき、どこが異なるのかを具体的に示し、HALの利用効果を評価します。

※STM32Fxシンプルテンプレート仕様は、前回記事参照。
※STM32F072RBとSTM32F103RBは、ARMコアのみが異なる評価ボードで、実装済みの緑LEDとユーザ青SWも同一GPIOピンを使用しているので、STM32F0:Cortex-M0からSTM32F1:Cortex-M3へのソフト載せ替え評価に最適。

STM32FxシンプルテンプレートのSTM32F0からSTM32F1へのソースコード変更箇所

(1)HALライブラリのインクルード

結果から言うと、ARMコア抽象化機能を持つHALライブラリを使えばユーザが追記したソースコードは、大部分を共通にできます。
しかしHALライブラリ自身は、ARMコアにより異なります。このため、HALライブラリをインクルードするソースコードの箇所は、下記のようにstm32f0xx_hal.hからstm32f1xx_hal.hへ変更が必要です。

HALライブラリインクルード:STM32F0(左)とSTM32F1(右)
HALライブラリインクルード:STM32F0(左)とSTM32F1(右)

(2)割込み:NVICプログラマーズモデル

Cortex-M0/M0+は、割込み最大数32、優先度レベル4、一方Cortex-M3は、割込み最大数240、優先度レベル8~256とコアで異なるモデルですので、割込み関連ヘッダファイルの変更が必要です。

NVICプログラマーズモデル:STM32F0(右)とSTM32F1(左)
NVICプログラマーズモデル:STM32F0(右)とSTM32F1(左)

※STM32Fxシンプルテンプレートは、SysTick割込み以外はポーリングを使っています。GPIO割込みは、未使用です。この箇所は、デモソフトのGPIO割込み利用部分が参考になるため、テンプレートにそのまま流用した結果、変更が必要になった箇所です。

テンプレートへGPIO割込み処理を追加し、更にARMコアを変更する場合には、このNVICプログラマーズモデルの違いで変更が必要になります。

*  *  *

HALライブラリを使った結果、上記2か所以外のユーザソース、ヘッダファイルは、STM32F0とF1のMCUで共通化できました。共通ソースコードの一部を示します。動作クロックが48MHzと64MHzと異なりますが、同じHAL API:HAL_UART_Transmit()によりUART2送受信(19200bps 8-Non-1)ができています。

HAL_UART_Transmit()によるUART2送信
HAL_UART_Transmit()によるUART2送信

Cortex-M3のSTM32F103RB(64MHz)動作STM32Fxシンプルテンプレートファイル構成が下記です。

Simplate Template for STM32F1 Project Explorer
Simplate Template for STM32F1 Project Explorer

弊社が追加したソースファイルやヘッダファイルは、Pascal形式でファイル名を付けますので、図示のように赤で色分けしなくても一目でSTM32CubeMX生成ファイルとの区別ができます。

STM32CubeMX生成ファイルのHALライブラリインクルード部分は、STM32CubeMXが当該HALライブラリ(stm32f1xx_hal.h)を、また割込みは、当該NVICプログラマーズデモルに応じたソースを「上書きで」生成しますので、コア載せ替えによる修正箇所は、弊社追加ソースファイルとヘッダファイルに限定できます。

この限定ファイル(1)と(2)の個所のみを変更すれば、STM32F0ソースコードをF1へそのまま使えます。HALライブラリ利用によるソース/ヘッダの共通化効果は、非常に高いと言えるでしょう。

弊社ソースファイル、ヘッダファイルの変更箇所は、#ifdefプリプロセッサを使って、コアによる差分箇所を1つへまとめることも可能です。リリース版では、これを採用したいと考えています。HALライブラリ利用により、ARMコアに依存しないSTM32Fxテンプレート構想(x=0 or 1)が実現します。