(別室)ARMマイコンで遊ぼう(STM32/LPCマイコン)
※このページはあくまで個人的な趣味によって書かれており、著者は全ての内容について、いかなる責任も負いません。
このページは、ARMマイコンを使った簡単なプログラムを紹介しています。
●重要なお知らせ(訂正とお詫び)●
1.STM32マイコンのBOOT0端子の接続について
2.ADM3202のコンデンサの接続について
●ARMプロセッサについて
ARM(Acorn RISC Machine)は、
ARM Ltd社(英)
※(日)
がライセンスを供与している、世界的に最も広く普及しているプロセッサアーキテクチャー
●ARM Cortex プロセッサについて
ARM11の次世代にあたる32〜64ビットのプロセッサです(ARM11の次は、ARM12ではなく「Cortex」という名称が割り振られた)。
Cortex−M3(LPC1343[NXPセミコンダクターズ社])を使ってみる
LPC1343は、動作周波数72MHz、フラッシュ32kB、データメモリー8kB、USB2.0(フルスピード)、UART、I2C、A/Dコンバータ
LPCXpressoについて
NXPセミコンダクターズ社のローコストな
LPCファミリー開発プラットホームで、 IDE(統合開発環境)
と開発ボードがセットになっているものです。
J−LINKについて
NXP社のマイコンへの書き込みは、例えばLPCXpresso基板に付属しているLPC−Linkを使わなくても、
●実験ボード タイプ1A(LPC1343 NXPセミコンダクターズ社)
秋月電子で購入したLPCXpresso Boardを使って簡単な実験ボードを作ってみた。
(1)ルーレットにしてみる
PICで使ったルーレットアダプタをつないで、LEDを動かしてみた。
プログラムソース@(LPCXpresso/codeRED用 LPC1343用 C言語) バージョン
プログラムソースA(LPCXpresso/codeRED用 LPC1343 C言語) タイマーバージョン ただ今、準備中!!
プログラムソースB(LPCXpresso/codeRED用 LPC1343 C言語) 割り込みバージョン ただ今、準備中!!
(2)UARTを使ってみる
UARTを使ってパソコンのハイパーターミナルにつないでみました。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1343 C言語) バージョン
プログラムソース サンプルA(LPCXpresso/codeRED用 LPC1343 C言語) 受信割り込みバージョン ただ今、準備中!!
使用したバージョンのCMSISヘッダーファイル(LPC13xx.h)
(3)A/D コンバータを使ってみる
A/DコンバータとUARTを使って、パソコンのハイパーターミナルに電圧を表示する(0〜3.3[V])プログラムにしてみました。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1343 C言語) バージョン
使用したバージョンのCMSISヘッダーファイル(LPC13xx.h)
(4)クロックを出力してみる
SYSCONレジスタを使って、クロックをCLKOUT(PORT[0_1])端子に出力する事ができます。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1343 C言語) バージョン
(5)USBを使ってみる
NXP社の
LPCXpressoのHPからダウンロードできるサンプルプログラム
(usbcdc)をそのままビルド、書き込みをして、
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1114 C言語) バージョン
5−2)簡単なUSBアプリケーション
(6)リアルタイムOS(FreeRTOS)を使ってみる
ARMで使えるOSは、FreeRTOSだけではありませんが、LPCXpressoの場合、
FreeRTOSを使った専用のサンプルが、
LPCXpresso
6−1)リアルタイムOSのデモプログラムを動かしてみる
デモプログラムのビルド方法
LPCファミリー開発プラットホームの中にある
LPCXpresso supportのページから、
「LPC1300 Series」用のFreeRTOS
6−2)リアルタイムOSを使った簡単なプログラムを作ってみる
A)ルーレットにしてみる
「PIC奮闘記4(RTOS)」で作った8つのLEDが回転するサンプルと同じものを、LPC1343でも作ってみました。
サンプル@ プログラムソース(FreeRTOS LPCXpresso/codeRED用 LPC1343 C言語) バージョン
サンプルA プログラムソース(FreeRTOS LPCXpresso/codeRED用 LPC1343 C言語) バージョン
サンプルB プログラムソース(FreeRTOS LPCXpresso/codeRED用 LPC1343 C言語) バージョン
Cortex−M0(LPC1114FN28[NXPセミコンダクターズ社])を使ってみる
LPC1114FN28は、クロック50MHz、Frash32KB、RAM4KBを積んだ、32ビットの本格的なCortex−M0マイコンでありながら、
●実験ボード タイプ1A(LPC1114 NXPセミコンダクターズ社)
簡単な実験ボードを作ってみた。
(1)ルーレットにしてみる
GPIO1(0〜7)に8個のLEDをつないで、LEDが回転するようにしてみました。
プログラムソース@(LPCXpresso/codeRED用 LPC1114 C言語) バージョン
プログラムソースA(LPCXpresso/codeRED用 LPC1114 C言語) タイマーバージョン ただ今、準備中!!
プログラムソースB(LPCXpresso/codeRED用 LPC1114 C言語) 割り込みバージョン ただ今、準備中!!
(2)UARTを使ってみる
UARTを使ってパソコンのハイパーターミナルにつないでみました。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1114 C言語) バージョン
プログラムソース サンプルA(LPCXpresso/codeRED用 LPC1114 C言語) 受信割り込みバージョン ただ今、準備中!!
(3)A/D コンバータを使ってみる
A/DコンバータとUARTを使って、パソコンのハイパーターミナルに電圧を表示する(0〜3.3[V])プログラムにしてみました。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1114 C言語) バージョン
使用したCMSISヘッダーファイル(LPC11xx.h)
(4)クロックを出力してみる
SYSCONレジスタを使って、クロックをCLKOUT(PORT[0_1])端子に出力する事ができます。
プログラムソース サンプル@(LPCXpresso/codeRED用 LPC1114 C言語) バージョン
(5)リアルタイムOS(FreeRTOS)を使ってみる
ただ今、準備中!!
Cortex−M0(LPC810M021FN8[NXPセミコンダクターズ社])を使ってみる
LPC810M021FN8は、小ピンながら、Cortex−M0を積んだ高性能なMPUです。
●実験ボード タイプ1A(LPC810M021FN8 NXPセミコンダクターズ社)
簡単な実験ボードを作ってみました。
(1)LEDを点滅させてみる
稼動確認のため、LEDが点滅するプログラムを作ってみました。
プログラムソース サンプル@ (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
プログラムソース サンプルA (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
プログラムソース サンプルB (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
プログラムソース サンプルC (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
(2)オシレータにしてみる(その1)
このマイコンの内部クロックは、1パーセント程度の精度があり、外部出力ができるので、安価でプログラマブルな
プログラムソース サンプル@ (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
(3)UARTを使ってみる(その1)
UARTを使ったプログラムは、レジスタを設定したり、CMSISを使って作ってもいいのですが、
サンプル@は、NXP社のLPC81x用サンプル(UART)をそのまま動かしているだけです
プログラムソース サンプルA (LPCXpresso/codeRED用 LPC810M021FN8 C言語) バージョン
(4)I2Cを使ってみる
(5)コンパレータを使ってみる
Cortex−M3(STM32F100RB[STMicroeleconics社] )を使ってみる
「STM32 Value line discovery」は、
STMicroeleconics社
の32ビット ARM/Cortex−M3プロセッサ(STM32F100RBT6B)
●開発ツール
STM32VLDISCOVERYでは、下記の開発ツールが紹介されています。どのツールを使用して開発しても問題ありません。
●マニュアル
開発に必要な資料が、
「STM32VLDISCOVERY」
のページよりダウンロードできる。
●基本プログラム編
(1)ポートをアクセスしてみる(LEDを点滅させてみる)
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
使用したバージョンのヘッダーファイル(stm32f10x.h) ※参考用
●実験ボード タイプ1A(STMF32F100RB STMicroeleconics社)
簡単な実験ボードを作ってみた
(1)ルーレットにしてみる
PORTA(0〜7)に8個のLEDをつないで、LEDが回転するようにしてみました。
プログラムソース@(STM32 discovery/Atollic TrueSTUDIO用 C言語) クロック設定無し
プログラムソースA(STM32 discovery/Atollic TrueSTUDIO用 C言語) PLL 24[MHz]動作バージョン
プログラムソースB(STM32 discovery/Atollic TrueSTUDIO用 C言語) HSI 8[MHz]動作バージョン
プログラムソースC(STM32 discovery/Atollic TrueSTUDIO用 C言語) HSE 8[MHz]動作バージョン
プログラムソースD(STM32 discovery/Atollic TrueSTUDIO用 C言語) タイマーバージョン
プログラムソースE(STM32 discovery/Atollic TrueSTUDIO用 C言語) 割り込みバージョン ただ今、準備中!!
プログラムソースF(STM32 discovery/Keil uVision4用 C言語) タイマーバージョン
プログラムソースG(STM32 discovery/IAR Embedded Workbench用 C言語) タイマーバージョン
(2)UARTを使ってみる
UARTでパソコンのハイパーターミナルにつないで、簡単なエコープログラムにしてみました。
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
プログラムソース サンプルA(STM32 discovery/IAR Embedded Workbench用 C言語) バージョン
プログラムソース サンプルB(STM32 discovery/Atollic TrueSTUDIO用 C言語) 受信割り込みバージョン ただ今、準備中!!
(3)A/Dコンバータを使ってみる
A/DコンバータとUARTを使って、パソコンのハイパーターミナルに出力する簡単な電圧計(0〜3.3V)にしてみました。
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
プログラムソース サンプルA(STM32 discovery/IAR Embedded Workbench用 C言語) バージョン
(4)クロックについて
このMPUのクロックは、CFGRレジスタのMCO(The microcontroller clock output)により、MCO(A8)ピンに出力する事もできます。
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
(5)PWMにしてみる
TIMER1のPWMモードを使ってみました。
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
(6)CMSISを使ったプログラムの開発
ARM・Cortex−Mシリーズの開発では、レジスタを調べてプログラムを作っても良いのですが、
6−1)SIN波(12ビット1000ステップ)発生
このMPUには、12ビットの高精度なD/Aコンバータ(0〜4095)が内蔵されているので、
プログラムソース サンプル@(STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
●リアルタイムOS(FreeRTOS)を使ってみる
リアルタイムOS(FreeRTOS)が、
FreeRTOSから無償でダウンロードできるので、使ってみました。
(1)デモプログラムを動かしてみる
(2)リアルタイムOSを使った簡単なプログラムを作ってみる
2−1)ルーレットにしてみる
「PIC奮闘記4(RTOS)」で作った8つのLEDが回転するサンプルと同じものを、STM32でも作ってみました。
サンプル@ プログラムソース(FreeRTOS STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
サンプルA プログラムソース(FreeRTOS STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
サンプルB プログラムソース(FreeRTOS STM32 discovery/Atollic TrueSTUDIO用 C言語) バージョン
●MDK−ARM softwareを使ってみる
(1)デモプログラムを動かしてみる
(2)新規のプロジェクトを作ってみる
サンプル@ プログラムソース(STM32 discovery/Keil uVision4用 C言語) バージョン
●IAR Embedded Workbenchを使ってみる
(1)デモプログラムを動かしてみる
(2)新規のプロジェクトを作ってみる
サンプル@ プログラムソース(STM32 discovery/IAR Embedded Workbench用 C言語) バージョン
●STM32F100RBで遊んでみる
(1)
STM32F103C8T6 ARM STM32 Minimum システム 開発ボードモジュールを使ってみる (STM32F103C8T6) Cortex−M3
●開発ツール
STM32VLDISCOVERYで使用した開発ツールがそのまま使えます。
●書き込みツール
何を使ってもよいのですが、私はWindows10パソコンとマイコンボードをST−LINK2でつなぎ、
●実験ボード タイプ1A(STM32F103C8T6 STMicroeleconics社)
稼働確認のために、購入したモジュールをそのまま使ってみました。
(1)Lチカプログラム
プログラムソース@(STM32 Atollic True STDIO /ST-LINK2 C言語)
プログラムソースA(STM32 Atollic True STDIO /ST-LINK2 C言語)
プログラムソースB(STM32CubeIDE /ST-LINK2またはJ-LINK C言語)
(2)システムクロック出力プログラム
プログラムソース@(STM32 Atollic True STDIO /ST-LINK2 C言語)
(3)UARTプログラム
プログラムソース@(STM32 Atollic True STDIO /ST-LINK2 C言語) システムクロック8MHz 9600BPS
プログラムソースA(STM32 Atollic True STDIO /ST-LINK2 C言語) システムクロック72MHz 9600BPS
プログラムソースB(STM32 Atollic True STDIO /ST-LINK2 C言語) システムクロック 72MHz 115200BPS
STM32F042K6T6を使ってみる (STM32F042K6T6) Cortex−M0
●実験ボード タイプ1A(STM32F042K6T6 STMicroeleconics社)
(1)Lチカプログラム
プログラムソース@(STM32 Atollic True STDIO /ST-LINK2 C言語)
STM32L010F4P6を使ってみる (STM32L010F4P6) Cortex−M0
●実験ボード タイプ1A(STM32L010F4P6 STMicroeleconics社)
(1)Lチカプログラム
参考にされる場合は、あくまで自己責任でお願いします。
内容はPICと関係ありません。
このHPのSTM32マイコンを使った回路図では、BOOT0に何も接続していないものがありますが、
BOOT0が浮いた状態になっていると、マイコンの動作が不安定になる事があります。
この端子を使用しない場合は、BOOT0端子は、10KΩ程度の抵抗でGNDにつないでやればいいと思います。
このHPのADM3202を使った回路図では、ADM3202の2ピンにつながっている0.1μFのコンデンサをGndにつないで
実験していますが(図a)、ADM3202のデータシートでは、このコンデンサはVccにつなぐようになっています(図b)。
実験では、このようなつなぎ方でもICのチャージポンプは正常に動作していますが、データシートでは(図b)のように記述され
ているので、データシートの通りに(図b)のようにしたほうがいいと思います。
の一つで、この規格のプロセッサは、世界中の主な半導体会社により作られています。
現在(H22.2)、主なアーキテクチャーには、ARM7、ARM9、ARM11、Cortex等があり、供与されているライセンス数は膨大な数にのぼります。
ARMのアーキテクチャーとライセンス数
●例えば、
秋月電子
では、下記のようなARMプロセッサを購入する事ができます。 ※H24.9現在。本文は秋月電子のHPより抜粋
●
「(別室)おまけのページ」
では、下記のARMプロセッサを使った記事を取り上げています。
・「DesignWave」2006年3月号付録 AnalogDevices社 AduC7026 (ARM7 TDMIプロセッサ)
・「DesignWave」2008年5月号付録 STMicroelectronics社 STM42F103VB (ARM Cortex−M3プロセッサ)
・「インターフェース」2009年5月号付録 オランダNXP Semiconductors社 LPC2388 (ARM7 TDMI−Sプロセッサ)
●STMマイコンのうち、STM8Sマイコンの製作記事については、
「(別室)STMマイコンで遊ぼう」のページで取り上げています。
このページで取り上げているのは、ARM系のSTM32マイコンです。
上から順に、Cortex−A(Application)シリーズ、Cortex−R(Realtime)シリーズ、Cortex−M(Microcontroller)シリーズの3種類
があります。
このHPで取り上げているのは、Cortex−Mシリーズです。
[8ch10bit]、その他、多くの機能を積んだ、ARM Cortex−M3アーキテクチャーのプロセッサです。
クロックは外部から供給する事もできますが、このMPUには、12MHz 1パーセントのRCオシレータも内蔵しています。
このプロセッサは、電源電圧が2.0〜3.6Vで動作します。
このセットと、インターネットにつながるパソコンと、USBコードのみでも、簡単なプログラミングや実験ができます。
この開発ボードは、LPC−Link(下記写真の左部分)と、Target(下記写真の右部分)から構成されていて、JTAG Debugger(LPC−Link部分)
がボードに一体となっているので、プログラムの書き込み用に、別にライター等を用意する必要はありません。
また、必要なら開発ボードを真ん中で切り離して、JTAG Debugger部分とTarget部分を分けて使うことも出来ます。
例えば、秋月電子では、「LPCXpresso NXP LPC1343評価キット」として2000円で購入する事が出来ます。
LPCXpresso(LPC1343)開発ボードのイメージ
このままだと使いづらいので、真ん中で切断してJTAG Debugger部分とTarget部分を分けた
付属の添付資料に従ってオペレーションすると、開発ボード上のLEDを、IDEからオンラインでデバッグできる。
開発ボードをUSBでパソコンにつなぐと、初回のみ「新しいハードウエアの検索ウイザード」が表示される(2回)ので、
「ソフトウエアを自動的に検索する」を指定してドライバーをインストールする。
Target Sideの回路図(LPC−Link Sideは省略した) ※LPCXpressoマニュアルより抜粋
開発ツール(code_red)の使用例
開発で便利なサンプルプログラムは、すでにNXP社が用意していて、
LPCXpressoのページから無償でダウンロードできます。
また、開発ツール(code_red)のインストール先[¥(インストールフォルダー)¥Examples]にも、サンプルプログラムが作られてます。
上記は、LPC1343の場合のサンプルプログラムの一例ですが、ADCやUART、I2C、USB等、一般によく使われると思われる機能は、
すでに、NXP社のサンプルプログラムが公開されているので、このサンプルプログラムをアーカイブの状態でインポートし、ビルドして、
動作を確かめる事ができます。
J−LINKでMPUに書き込む事もできます。
J−LINKは、多くの種類のマイコンに対応した汎用的なデバッガ(書き込み器)です。
J−LINK
LPCXpressoで開発したプログラムは、axfフォーマットを出力するので、これをJ−LINKで書き込むには、LPCXpressoの
インストール先にコピーされている「arm-none-eabi-objcopy」コマンドを使用して、Hexフォーマットに変換してやる必要があります。
この手順は、NXP社のHPに日本語で詳しく解説されています(上記の解説はNXP社のHPを抜粋したものです)
「arm-none-eabi-objcopy」コマンドを実行した例
このコマンドを実行するだけの目的でパスを設定するのは面倒なので、「arm-none-eabi-objcopy.exe」を実行するフォルダーに
コピーしてしまったほうが簡単です。
「SEGGER J−Flash Ligt」を使って、LPC1343マイコンにJ−LINKで書き込んだ例
J−LINKでは、他にも汎用的な多くのツールが用意されています。
J−LINK(20ピン端子)で下記のマイコンボード(LPC1343)に書き込む場合の接続例
注)J−LINKは多くのインターフェースをサポートするため、20ピン端子は、選択するインターフェースにより
ピン配置が全く変わりますので注意が必要です。
写真(基板を挿した/状態基板を抜いた状態/裏面)
※シングル27Pinソケットは購入できなかったので、ダブル50Pinソケットを複数使ってソケットは加工した
回路図
このMPUでLEDをつなぐ場合は、出力電流が少ないのでトランジスタ等のドライバーが必要です。
サンプル@は、1秒程度の間隔でLEDが回転するだけのものです。
写真
回路図(電圧が低いので、LEDは赤色でないと点灯しない)
サンプル@は、簡単なエコープルグラムで、「トランジスタ技術・2012年10月号」のLPC1114用のサンプルを
LPC1343で動かしているものですが、同じようなサンプルはNXP社でも提供しているので、どちらでも好きなほうを
参考にするといいと思います。
回路図と写真、ハイパーターミナルのイメージ
ハイパーターミナルの設定
サンプルは「トランジスタ技術」誌のLPC1114用のサンプルプログラムに、簡単な修正をしただけのものですが、同じような
サンプルは、NXP社も提供しているので、どちらでも参考にするといいと思います。
このサンプルは、入力に簡単な保護回路しか付けていないので、入力電圧は、電源電圧を越えないようにする必要があります。
回路図と写真、ハイパーターミナルのイメージ
ハイパーターミナルのイメージ
ハイパーターミナルの設定
出力できるクロックは、IRC oscillator、System oscillator、Watchdog oscillator、Main clockの4種類です。
サンプル@は、System oscillatorを出力するもので、このサンプルの場合は12MHzが出力されます。
プログラムはコメントを外す事で、4種類のクロックを出力できますが、それぞれを実測してみると、IRC oscillator:12MHz、
System oscillator:12MHz、Watchdog oscillator:出力されない、Main clock:28MHzになっています。
写真と回路図
5−1)USB−シリアル変換器(仮想COMポート)にしてみる
仮想COMポートにしてみました。
LPC1343は、3.3Vデバイスにも関わらず、オンチップの「USB phy」を内蔵しているので、USBのD+,D−をそのまま
つなぐ事ができます。 注)ただし、LPC1343は3.3Vデバイスなので、USBの電源(5V)から、そのまま電源を取る
事はできません。
サンプル@は、稼動確認のために、下記の「Cortex−M0(LPC1114FN28[NXPセミコンダクターズ社])を使ってみる
(2)UARTを使ってみる 」で作ったLPC1114をつないで、USB接続でハイパーターミナルにつなぎ、エコーしているものです。
このサンプルは、外部から3.3Vの電源を供給してデバイスが動作してから、USBにコネクタに接続するようにしないと、
USBとして認識されず、障害を起こす可能性があります(この場合、USBコネクタの抜き差しが必要になります)。
また、初回の接続時に、Windows画面の指示に従って、ドライバーのインストールが必要になります。
ドライバーは、デモのフォルダー(usbcdc)に、サンプルプログラムといっしょに入っています。
このサンプルの詳細は、NXP社のマニュアルを参照してください。
写真/USBコネクタ/回路図
USBコネクタとの接続部分の回路(33Ω*2、1.5KΩ)は、NXP社のマニュアルに記述されている通りです
SWはONにして、1.5KΩは、3.3Vにつないだ状態にしておきます
USB−VBUS端子は、P0(3)と兼用ですが、この端子はトラレントI/Oになっているので、5Vの入力が可能です
(他の端子は、5Vの入力はできません)
USBコネクタ裏面のピン配置図は、使用するコネクタによって異なる可能性があります
サンプル@のイメージ図
ハイパーターミナルのイメージ
このサンプルをUSBコネクタにつないだ状態でないと、このポートは選択できません
ハイパーターミナルの設定
サンプル@は、NXP社の
LPCXpressoのHPからダウンロードしたサンプルプログラムを
そのまま動かしているだけです
下記の項のプログラムと全く同じです
LPC1343側には、NXP社の「usbcdc」サンプルを、そのままインストールするだけです
USBから電源を取る場合の注意
GND,VBUSSピンを長くしたUSBコネクタが必要です。
また、USBから供給される5VをARMの電源電圧3.3Vにするための電源レギュレタ等が必要です
ただいま、準備中!!!!
のページからダウンロードできるので、これを使ってマルチタスクの本格的なプログラムを作る事もできます。
※LPC1343の場合は、ダウンロードしたアーカイブファイルを解凍すると作成される「freertos.lpc13xx」というフォルダーに、LPC1343用の
デモプログラムと、PDFのマニュアルが入っています。
なお、このOSをSTM32(ARM CortexM3)で使った事例が、このページの下記にあるほか、
PICで使った事例が、「PIC奮闘記4(RTOS)」
のページにあります。
FreeRTOSに対応しているMPU ※H24.10現在
LPC1343用のFreeRTOSは、
LPCXpressoのページからダウンロードできます
(FreeRTOS Demo and Docs)をダウンロードし、解凍しておきます。
解凍すると、FreeRTOSや、デモについて書かれたPDFドキュメントと、3つのプロジェクトフォルダーが作成されます。
「LPCXpresso codeRED」を起動して、この3つのプロジェクトをインポートすれば、あとは通常の手順で、ビルド、書き込みする
だけで使用できます。
他に必要な作業もないので、ビルドがエラーで中断する事はないと思います。
「Simple Demo」を実行すると、LPCXpresso(LPC1343)ボード上の赤色のLEDが、1秒周期(0.5秒毎に反転)します。
FreeRTOSのインポート方法(通常のインポートと全く同じです)
ただし、このアーカイブファイルに限って、アーカイブ形式からの直接的なインポートはできません。
(PDFドキュメントファイルを含んでいるため、アーカイブ内部のフォルダー構成が異なっています)
アーカイブファイルをいったん解凍して、図のように、フォルダーを指定してインポートする必要があります。
デモプログラムの、main.cと置き換えるだけで使用できます。
8ビット系のPICで作ったサンプルですが、OSを使ったプログラムは32ビットARMマイコンにでも移植が容易です。
(このOSの規約どおりに作っていれば、CPUが変わっても、プログラムの修正は不要なのですが。)
サンプル@は、3つのタスクを生成し、それぞれの独立したタスクがそれぞれLEDを動かす事で、3点が動くように見えるものです。
タスク1、タスク2は1秒間隔、タスク3は0.1秒間隔で動作させているので、タスク1、タスク2の2点のLEDが同時に動き、
タスク3の1点がその10倍の回転速度で、2点を追い越していくように見えます。
サンプルAは、2つの独立したタスクを生成し、セマフォを使って同期を取っているものです。
タスク1が、0.125秒間隔(1秒で1周する)でLEDを動かし、1周する毎にセマフォを解除(Give)するので、タスク1のLEDが1周
する毎にタスク2のLEDが1ステップ動きます。
時計の長針と短針のような動きをします。
サンプルBは、2つの独立したタスクを生成し、タスク1からタスク2にキューを使ってデータを連動するものです。
タスク1が、1秒間隔でLEDを動かし、5ステップ(5秒)毎にキューにLEDの位置(PORTの値)を書き込むと、タスク2が起動して、
キューの値を読み込み、タスク1の次のキューの書き込みがあるまで、その位置を表示します。
タスク2が動かすLEDが、タスク1が動かすLEDのラッチのような動きをします。
ボードのイメージ
回路図(電圧が低いので、LEDは赤以外では点灯しません)
トランジスタでは0.6Vのロスがあるので、LPC1114のサンプルのように、バッファーは74HC245等を使った方がいいと思います
サンプル@の動作イメージ
サンプルAの動作イメージ
サンプルBの動作イメージ
扱いやすい28ピンDIPパッケージが、例えば、秋月電子では110円で購入する事ができます。
また、このマイコンは、トランジスタ技術2012年10月号では同じものが付録として添付されていますし、入手性も良いと思うので、
ARMを使った開発には、最適だと思います。
プログラムは、上記でも紹介したLPCXpressoのLPC−Link(LPCXpressoボードを切断したボードの左半分)を使って
書き込むようにしている。
このボードの接続方法や、ツールの使い方については、LPCXpressoの日本語マニュアルに詳しく説明がされています。
なお、LPCXpressoは、2000円程度で購入できる低価格なものですが、
このマイコンにプログラムを書き込むだけなら(デバッグ機能を使わないなら)、LPCXpressoは、必ずしも必要なわけでは
ありません(例えば、
Flash Magic
等の無償ツールを使って、UART接続でプログラムの書き込みもできます)。
写真と回路図
LPC−Linkとの接続イメージ
LPC−Linkとの接続方法
※LPCXpressoの日本語マニュアルより抜粋
このMPUにLEDをつなぐ場合は、大電流ポート以外は出力電流が少ないので、トランジスタ等のドライバーが必要です。
このサンプルでは、秋月電子で安価で購入できる双方向バッファーIC(74HC245AP)を出力ドライバーとして使用しています。
GPIOは、デフォルトでは、個々のアプリケーションに割り当てられているので、汎用I/Oとして使用するためには、
IOCONレジスタで、個々のピンの設定が必須になります(サンプルプログラムを参照)。
GPIO1ー3は、LPC−Linkでも共用で使用しているので、汎用I/Oとして使用しても、上記の手順でこのプログラムを書き込む事は
できますが、デバッグでエラーメッセージが出力されるようになります。(Flash Magic等のツールで、GPIO1ー3がデフォルトに設定
されているプログラムを書き込んでやらないと、LPC−Linkを使ってプログラムの更新をする事は出来なくなります。)
このサンプルでは、このようなトラブルが起きないように、GPIO0ー3は、汎用ポートに設定しないように修正してあります。
GPIO0(0〜7)を使って8個のLEDを点灯させる事もできますが、GPIO0ー4、GPIO0ー5はオープンドレインポートなので、このまま
の回路では、LEDは正常に点灯しません。
また、GPIO0ー0はリセットと共用なので、汎用I/Oには変更しないほうが無難だと思います。
写真と回路図(電圧が低いので、LEDは赤色でないと点灯しない)
74HC245APは、2〜6V(出力6mA)で使用できる8ビット高速双方向バッファーで、秋月電子では5個200円 注)H24.9現在
と安価なので、この類のLEDドライバーの用途にも最適だと思います。
FlashMagic用に「トランジスタ技術・2012年10月号」のUART設定用のスイッチを追加したイメージ
FlashMagicは、UARTを使ってマイコンに簡単にプログラムの書き込みが出来る便利なツールです。
使い方も簡単なツールですが、FlashMagicを使用する場合、この2つのスイッチを操作して、UARTポートの設定
(汎用スイッチとリセットスイッチを同時に押し、リセットスイッチを離して、次に汎用スイッチを離す)が必要です。
詳しくは、「トランジスタ技術」誌を参照してください。
サンプル@は、簡単なエコープルグラムで、「トランジスタ技術・2012年10月号」のサンプルプログラムを参考に、
(ほとんどサンプルのままです)作ったものです。
この書籍では、LPC1114のUART関連のレジスタが、日本語で詳しく解説されているので、このプログラムの詳細は、
そちらの書籍を参考にするといいと思います。
回路図と写真、ハイパーターミナルのイメージ
ハイパーターミナルの設定
サンプル@は、ほとんどトランジスタ技術誌のサンプルそのままなので、詳しくは、そちらを参考にした方がいいと思います。
NXP社でも、サンプルを提供しているので、好きなほうを参考にしたらいいと思います。
なお、入力には簡単な保護回路しか付けていないので、入力電圧は、電源電圧を越えないようにする必要があります。
コンパイルで使用したCMSISヘッダーファイル(LPC11xx.h)のバージョンは下記のものです。
回路図と写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
出力できるクロックは、IRC oscillator、System oscillator、Watchdog oscillator、Main clockの4種類です。
サンプル@は、System oscillatorを出力するもので、このサンプルの場合は12MHzが出力されます。
プログラムはコメントを外す事で、4種類のクロックを出力できますが、それぞれを実測してみると、IRC oscillator:12MHz、
System oscillator:12MHz、Watchdog oscillator:出力されない、Main clock:32MHzになっています。
写真と回路図
LPC810M021FN8のピンレイアウト ※データシートより抜粋
このMPUは、扱いやすい8ピンDIPパッケージが、例えば、秋月電子では80円で購入する事ができます。
開発ツールは、NXPセミコンダクターズ社から、いくつかのツールを使ったサンプルが無償で提供されていますが、
CodeREDで開発してFlashMagicで書き込む方法が、ライターも不要で最も簡単なようです。
この方法は、過去にNXP社から無償で配布されていたデモボードでも使われていた開発方法です。
FlashMagicによる書き込み方法
ISPスイッチとリセットスイッチを同時に押し、リセットスイッチを離して、その後でISPスイッチを離してやると、
MPUがISPモードになり、FlashMagicで書き込みできる状態になります
FlashMagicは、新しいバージョンでないとLPC810には対応していません
最新バージョンをダウンロードして使用する必要があります
CodeREDで開発したプログラムは、axfフォーマットになるので、これをFlashMagicで書き込むには
「arm-none-eabi-objcopy」コマンドを使用してHexフォーマットに変換してやる必要があります。
このコマンドは、CodeREDの中から実行する事もできます
この手順は、NXP社のHPに日本語で詳しく解説されています(解説はNXP社のHPより抜粋したものです)
LPC−LINKを持っている場合は、CodeREDのDebugでプログラムを書き込む事もできます。
サンプルは、上記で取り上げているLPCXpresso(LPC1343)開発ボードについている
LPC−LINKでLPC810とつないで、Debugでプログラムを書き込んでいるものです
LPC−LINKを持っている人は、こちらのやり方のほうが簡単かも知れません。
code_redのDebug操作は、上記「LPC1343」の場合と同じです。
「LPCXpresso/codeRED バージョン6-1-0 164」による「Cプロジェクト」の作成イメージ
ここで取り上げたサンプルプログラムは、特に記述の無い限り、「LPCXpresso/codeRED」の
デフォルトの「Cプロジェクト」で作成されています。
上記の操作をすると、「LPCXpresso/codeRED」が自動的に「main.c」を作成するので、
この内容をこのHPで紹介しているサンプルプログラムに置き換えるだけで使用できます。
サンプル@は、PIO0_1につないだLEDが、0.5秒程度の周期で点滅します。
但し、NXP社より提供されているLPC8xxのCodeREDのテンプレートは、デフォルトでは外部OSCで動くようになっているので、
内部OSCで動かすためには、
「CMSIS_CORE_LPC8xx」 ==> 「SRC」 ==> 「system_LPC8xx.c」 ==> 「SYSPLLCLKSEL_Val」
の値を、0x00000000に変更してやる必要があります
また、IOCONレジスタのデフォルト設定では、入力ポートはプルアップになっているので、このようなケースでは、未使用の
IOCONレジスタのModeはINACTIVEにしてやらないと、PIO0_2、PIO0_3のLEDも点灯してしまうので、ポートを入力に
して使用する場合は注意が必要です。
詳細は、プログラムのソースを確認してください。
サンプルAは、PIO0_1、PIO0_2、PIO0_3につないだLEDが、順番に点滅します。
サンプルAのプログラムを書き込んでも、FlashMagicでプログラムを書き込む事はできますが、SWDを使ったアクセスはでき
なくなるかも知れないので、注意が必要です。
サンプル@と同様、「SYSPLLCLKSEL_Val」の値を0x00000000に変更しておく必要があります。
サンプルBは、サンプルAにSysTickを使って、LEDが1秒毎に動くようにしたものです。
SysTickはARMでは一般的に使われている機能ですし、このようなサンプルは、NXP社からも「SysTick」として、
提供されています。
サンプル@と同様、「SYSPLLCLKSEL_Val」の値を0x00000000に変更しておく必要があります。
サンプルCは、サンプルBと同じ機能のものを、SysTickではなく、MRT(Multi−Rate Timer)で作ったもので、
LEDが1秒毎に動きます。
ほとんどコメントだらけのプログラムですが、このようなものは、CMSISで作ったほうが、もっと簡単に作れるかも
知れません。
サンプル@と同様、「SYSPLLCLKSEL_Val」の値を0x00000000に変更しておく必要があります。
写真/回路図
電圧が低いので、LEDは赤以外では点灯しない可能性があります
ポートの設定イメージ ※データシートより抜粋
SYSPLLCLKSEL_Valの変更イメージ
3.3Vオシレータとして使用する事もできます。
サンプル@は、PIO0_1からメインクロックを出力するもので、実測すると、出力周波数は23.89MHzでした。
また、プログラム中のCLKOUTSELレジスタの値をゼロにすると、IRCオシレータの周波数が出力されます。
このサンプルの場合は、IRCオシレータを選択して実測すると、11.45MHzでした。
サンプル@は、単にメインクロックを出力しているだけなので、上記のサンプル同様、
「SYSPLLCLKSEL_Val」の値を0x00000000に変更しておく必要があります。
写真/回路図
このマイコンの場合、NXP社よりすでに完成されたサンプルプロジェクトが無償で提供されているので、
これをそのまま使って動かす事もできます。
UARTや、I2C、SPI等のインターフェースについては、NXP社より分かりやすいサンプルプログラムが
無償で提供されているので、このMPUが初めての人でも容易に使えそうです。
サンプル@は、NXP社のサンプルプロジェクト「UART」を、そのまま動かしたもので、「Hello World!」
とメッセージを表示し、あとはエコー処理をおこないます。
但し、このサンプルプログラムは、LPC812用に作られているので、「LPCEpresso」の「Properties」から
「MCU settings」を選択し、MCUをLPC810に変更してからBuildし、プログラムを書き込む必要があります。
また、上記のサンプル同様、「SYSPLLCLKSEL_Val」の値を0x00000000に変更しておく必要があります。
NXP社のサンプルは、多機能に作られているので、少々複雑なプログラムになっていますが、
この中でRXとTXで9600BPSでシリアル通信するだけなら、必要なプログラムは十数行程度です。
サンプルAは、NXP社のサンプルから、必要な部分を抜き出しただけのものなので、サンプル@プロジェクトを
コピーして、MCUをLPC810に変更し、SYSPLLCLKSEL_Val」の値を0x00000000に変更して使用する
必要があります。
動作の内容はサンプル@と同じです。
写真/回路図
このサンプルでは、FlashMagicの書き込み用UARTポートをそのまま共用して使用しています
ハイパーターミナルのイメージ
ハイパーターミナルの設定
MCUの変更イメージ ※LPCEpresso(バージョン6−1−0_164)の画面イメージ
このサンプルプログラムはLPC812用に作られているので、このプログラムをLPC810で使うためには、
「LPCEpresso」の「Properties」からMCUをLPC810に変更してBuildしておく必要があります。
※NXP社のサンプル(UART)プロジェクトをコピーして、RXとTXで9600BPSで
通信するために必要な部分を抜き出しただけのものです。
を積んだ評価ボードです。
このボードに搭載されているMPU(STM32F100RBT6B)は、フラッシュ:128KB、RAM:8KBを積んでいて、ボードでは8MHzの水晶で
24MHz動作させるようになっていますが、他にRCオシレータ(HSI:8[MHz]、LSI:40[KHz])も内蔵されています。
注)デフォルトは、HSI:8[MHz]動作です。
モジュールは、12ビットデュアルチャンネルD/Aコンバータや、12ビットA/Dコンバータ、USART[3Mbit/s]、I2C[400KHz]、SPI[12Mbit/s]、
16ビットPWM、その他、機能も豊富で高性能です。
この評価ボードは、USBケーブルでパソコンにつないだだけでも、簡単なデモプログラムが動くようになっています。
開発ツールやデバッガまで含めて、例えば秋月電子では、1100円 ※H23.3現在)と安価で購入できるので、これからARMを使って開発を
しようという人には最適なものだと思います。
この評価ボードはマニュアルも豊富で、必要な資料は、
「STM32VLDISCOVERY」
のページよりダウンロードできます。
なお、ARM系以外のSTMマイコンについては、
「(別室)STMマイコンで遊ぼう」
で取り上げています。
各社とも、それぞれ製品版と、フリーの機能限定版をダウンロードできるようになっています。
・MDK-ARM software http://www.keil.com/ ・・・・・ 実質的な純正ツールです
・IAR Embedded Workbench http://www.iar.com/ ・・・・・ ARMに限らず広く使われている開発ツールで、このHPの他の
マイコンのページでも開発に使用しています。
マニュアルも含めて日本語対応もされています。
・Atollic TrueSTUDIO http://www.atollic.com/ ・・・・・ 無償評価版でもコードサイズの制限がありません
STM32マイコンでは、STマイクロ社より専用の開発ツールも用意されていて、R4年6月時点では、この無償ツールを使う事が一般的なようです。
STM32Cube IDEは、使い方が容易で使いやすいツールです。
(このツールはSTM32マイコンの汎用の開発ツールで、STM32VLDISCOVERY用というわけではありません。)
・STM32CubeIDE https://www.st.com/ja/development-tools/stm32cubeide.html
STM32Cube IDE
ただし、日本語はほとんどありません。
STM32 Value line discoveryの写真
Atollic TrueSTDIOでオンラインデバッグしているイメージ
このツールは、サンプルプログラムを自動的に作成してくれるので、メインプログラムを修正するだけで簡単な開発ができる。
このツールの使い方は、「トランジスタ技術2011年3月号」に詳しく紹介されているので、参考にすると良いだろう。
STM32 Value line discoveryの回路図(ST−Link部分は省略)
※STMicroeleconics社のマニュアルより抜粋
STM32 Value line discoveryのイメージ
※STMicroeleconics社のマニュアルより抜粋
ST−Linkを他のボードの開発で使用する場合
STM32F100RBのピンレイアウト
※STMicroeleconics社のマニュアルより抜粋
ボード上の2つのLED(青・緑)が、A−Z、0−9のモールス信号の点滅を繰り返すサンプルを作ってみた。
このサンプルでは、ハードウエアの追加は必要ありません。
GPIOポートを使うためには、GPIO関連のレジスタ以外に、RCCレジスタの設定も必要になるので、注意が必要です。
STM32 Value line discoveryをUSBケーブルでパソコンにつないだイメージ
このサンプルでは、ハードウエアの追加は必要ありません。
GPIOポートを使うためには、RCCのAPB2ENRレジスタの該当ビットを1にする必要があります(プログラムソースを参照)。
※STMicroeleconics社のマニュアルより抜粋
※このサンプルプログラムは、「Keil uVision4」でも、そのまま使用できますが、表示が早く流れます
「IAR Embedded Workbench」では、そのまま使用できます
写真、回路図
このサンプルでは、秋月電子で安価で購入できる双方向バッファーIC(74HC245AP)を通してLEDをつないでいます。
プログラムは、PORTA(8〜15)、PORTB(0〜7)、PORTB(8〜15)につないでも、LEDが回転するようにしてありますが、
実際には、PORTA(13、14、15)、PORTB(3,4)は、出力ポートとして機能させていません。
これらのポートを出力ポートに変更する事はできますが、デバッガやリセットで使っているので、プログラムの更新に何らかの問題が
発生する可能性があるためです。
サンプルAは、PLLでSYS−CLOCKを24[MHz]動作させているもので、ルーレットが3倍速で高速回転します。
ただし、実験では、一度、この設定に変えてしまうと、設定を元に戻すまで、プログラムを書き換えても24[MHz]動作するようになります。
サンプルB[HSI]、サンプルC[HSE]の何れかのプログラムを書き込んで実行してやれば、SYS−CLOCKを8[MHz]に戻す事ができます。
サンプルDは、TIMER1機能を使って、1秒毎にLEDが動くようにしたもので、SYS−CLOCKは24MHzを使用しています。
TIMER1は、多機能でレジスタも多いのですが、その構成は、8ビットバージョンの
STM8Sマイコン
を拡張しているようなイメージなので、
そちらで作成したプログラムに簡単な手直しをするほうが、おそらく、タイマープログラムは簡単に作れてしまいます。
サンプルFは、サンプルDを「Keil uVision4」で動かしたものですが、コメント以外はサンプルDと全く同じです。
「Keil uVision4」の操作は、このHP下部の「●MDK−ARM softwareを使ってみる 」を参照してください。
サンプルGは、サンプルDを「IAR Embedded Workbench」で動かしたもので、クロックを8MHzにしてあります。
「IAR Embedded Workbench」の操作は、このHP下部の「●IAR Embedded Workbenchを使ってみる 」を参照してください。
写真と回路図(電圧が低いので、LEDは赤色でないと点灯しない)
74HC245APは、2〜6V(出力6mA)で使用できる8ビット高速双方向バッファーで、
秋月電子では5個200円 注)H24.9現在 と安価で入手できます。
サンプル@は、PLLで24[MHz]動作します(プログラム中で24[MHz]動作に切り替えるように変更しています)。
初期値をいろいろ変更されている場合、SYS−CLOCKが24[Mz]にならずに、正常に動作しない可能性があります。
(その場合、BRR値の再計算が必要です。)
UARTを使うためには、クロック(APB2ENRレジスタ[オルタネートファンクション、GPIO、USART])や、MAPRレジスタ、
GPIO関連の設定も必要になるので、注意が必要です(詳しくはプログラムソースを参照)。
このMPUのUARTは、BRRの少数以下の端数も設定できるので、高い精度の通信が可能です。
サンプルAは、IAR用に作ったもので、クロックを8MHzにしてあります。
回路図と写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
※このサンプルプログラムは、「Keil uVision4」でも、そのまま使用できます
このMPUのA/Dコンバータは、12ビットの高精度のものです。
サンプル@は、PLLで24[MHz]動作します(プログラム中で24[MHz]動作に切り替えるように変更しています)。
初期値をいろいろ変更されている場合、SYS−CLOCKが24[Mz]にならずに、正常に動作しない可能性があります。
(その場合、BRR値の再計算が必要です。)
サンプルプログラムは、基準を電源電圧(3.3V)にしてあるのですが、この電源は、USBからST−LINKを通して作った3.3Vを
ダイオードを通して供給しているので精度が低く、このプログラムの測定値は、精度が高くはありません。
入力は、電源電圧を超えないように注意する必要があります。
サンプルAは、IAR用に作ったもので、クロックを8MHzにしてあります。
回路図と写真
ハイパーターミナルのイメージ
ハイパーターミナルの設定
※このサンプルプログラムは、「Keil uVision4」でも、そのまま使用できますが、表示が早く流れます
出力できるクロックは、SYS−CLOCK、HSI、HSEと、PLLクロックの2分割の4種類です。
サンプル@は、PLLクロックの2分割を出力しているもので、12[MHz]:HSE[ボードの8MHz水晶] *3[PLL] /2[2分割]
を出力します。
プログラム中のコメントを外す事で、他に、SYS−CLOCK(PI_SYS_OUT)、HSI(PI_HSI_OUT):8MHz、HSE(PI_HSE_OUT):8MHzを
出力する事もできます。
SYSクロックは、設定値により異なりますが、初期値のデフォルトでは8MHz(HSIが使用される)です。
回路図と写真
※このサンプルプログラムは、「Keil uVision4」でも、そのまま使用できます
このMPUのPWMは、出力が4チャンネル(7出力、CH4Nは存在しない)ある高機能なものです。
サンプル@は、10KHzで、CH1〜CH4に、デューティサイクル75%、50%、25%、10%のPWM出力をするものです。
周波数、及びデューティサイクルは、TIM1のARRレジスタ、及びTIM1のCCRxレジスタの値を変えることで変更する事ができます。
写真と回路図
ロジックアナライザーによるCH1〜CH4、CH1N〜CH3Nの出力イメージ
※このサンプルプログラムは、「Keil uVision4」でも、そのまま使用できます
CMSIS(Cortex Microcontroller Software Interface Standard)を使えば、ハードウエアをあまり意識する事なく、
プログラムを作る事ができます。
また、CMSISを使ったサンプルは、各社、豊富に用意しているようで、例えば、開発ツールに「Atollic TrueSTDIO」を使っている場合
パソコンの「¥(インストール先)¥Library」のフォルダーに、おそらく100を軽く越える事例のサンプルプログラムがインストールされて
いるので、このプログラムソース(多くの場合、main.cのみでもよい)をコピーして、ビルドするだけでも、ほとんどの機能は検証できると
思います。(通常は、下記のFreeRTOSの例のようにインポートして使用します)
使い方は、とても分かりやすく出来ていて、また、「Atollic TrueSTDIO」を使っている場合は、これをビルドする際に、特別な設定は
必要なく、他のプログラムの開発同様、コピーしてふつうにビルドするだけ(ライブラリーの設定すら不要で、設定不足によるエラーも
ほとんど発生しないので、環境設定で悩まされる事はほとんどない)です。
サンプルプログラム「DualModeDMA_SineWave」を、この実験ボードで実行した出力(DAC1_OUT、DAC2_OUT)のイメージ
これは、D/Aコンバータのサンプルの一例ですが、他にもビルドするだけで使えるサンプルソースプログラムが
豊富に用意されています
上記のサンプルの例
上記のAtollic社の提供しているD/Aコンバータのサンプルプログラムに1000ステップのSIN波データを追加して、
12ビット1000ステップという、高精度のSIN波を発生するようにしたものです。
出力は、STM32VLDISCOVERYボードのA4(DAC1_OUT)、A5(DAC2_OUT)になります。
これだけ精緻な波形だと、精度の低いD/Aコンバータではありがちな、波形の階段状のギザギザは、ほとんど見えません。
オシロスコープの波形のイメージ (きれいなSIN波です)
注)AC波形のように見えますが、出力はDC波形です(見やすいように、オシロスコープのPosition位置を下げて表示しています)
AC波形が必要なら、直列にコンデンサを通す必要があります。
※ 実験のため、Atollic社のサンプルプログラムに1000ステップのSIN波データを追記しただけのプログラムです。
SIN波データテキストは、簡易的に、EXCELマクロと変換ツールで生成しています。
CMSISを使用していますが、「Atollic TrueSTDIO」では、これをプロジェクト作成時に自動的に生成される
main.cに置き換えるだけで、ビルド、実行できます。(特別な設定は必要ありません)
このOSは、いろいろなMPUに対応していますが、このボード「STM32 Value line discovery」で、「Atollic TrueSTDIO」を
使ったデモが用意されているので、ダウンロードすれば、そのまま使用できます。
なお、このOSをPICで使った事例が、「PIC奮闘記4(RTOS)」のページにあります。
デモプログラムのビルド(方法1)
FreeRTOSのサイトから、FreeRTOSをダウンロード、これを解凍して、「Demo」フォルダーの「CORTEX_STM32F100_Atollic」を
「Atollic TrueSTDIO」のワークスペースに任意名でコピーし、「Source」フォルダーを、その2つ上のフォルダーにコピーしておきます。
(「Source」フォルダーは、次のバッチコマンドが参照するので、ダウンロードした時と同じ名称で同じ構成にしておく必要がある)。
「CORTEX_STM32F100_Atollic」の中の、バッチコマンド(CreateProjectDirectoryStuructre.BAT)を実行すると、
必要なフォルダーが作成されます。
バッチコマンドが終了したら(数秒で終了する)、コピーした「Source」フォルダーは削除して問題ありません。
「Atollic TrueSTDIO」を起動して、下記のようにインポートすれば、あとは通常通りにビルド・実行できます。
但し、初回のビルドでは下記のようなメっセージ、
「CCS4の中からはバッチコマンド(CreateProjectDirectoryStuructre.BAT)が実行できないので、これを実行してから
「FreeRTOSConfig.h」の#error Ensure ***)行を削除して、再度、ビルドを実行する」
ように案内メッセージがでてビルドが止まります。
このバッチコマンドは、上ですでに実行しているので、指示通りにこの行をコメントにして、再度、ビルドする必要があります。
該当箇所は、「Atollic TrueSTDIO」が画面で指示してくれるので、自分でソースを調べる必要はありません。
正常にビルド、書き込みができれば、簡単なデモプログラムが動作します。
ボード上の緑色のLEDが点滅していて、青色のボタンを押せば、青色のLEDが5秒間点灯します。
あとは、このデモプログラムを参考にして、自分でFreeRTOSを使ったプログラムを作る事ができます。
デモプログラムのビルド(方法2)
上記同様、
FreeRTOSのサイトから、FreeRTOSをダウンロードし、これを解凍しないで、「Atollic TrueSTDIO」へのインポート画面
から、直接、アーカイブファイルを選択します。
※下記の「Atollic TrueSTDIO」へのインポートイメージ図 Bで、「Select archive file」のボタンを選択し、アーカイブファイル名を
選択すると一覧が表示されるので、使用するものを選択します。
あとは、方法1と同じで、
デモのフォルダーが作成されるのでバッチコマンドを実行し、初回のビルドはメッセージ行を出力して止まるので、この行をコメントにして、
再度、ビルドすれば、デモプログラムを使うことができます。
フォルダーのコピーイメージ
「Atollic TrueSTDIO」へのインポートイメージ
初回のビルドは、エラーメッセージで止まるようになっているので、この行をコメントにして、再度ビルドする必要があります。
該当箇所は、「Atollic TrueSTDIO」が指示してくれるので、自分で調べる必要はありません。
デモプログラムの、main.cと置き換えるだけで使用できます。
8ビット系のPICで作ったサンプルですが、OSを使ったプログラムは32ビットARMマイコンにでも移植が容易です。
(このOSの規約どおりに作っていれば、CPUが変わっても、プログラムの修正は不要なのですが。)
簡単なプログラムなので、ビルドエラーで止まることはないと思います。
サンプル@は、3つのタスクを生成し、それぞれの独立したタスクがそれぞれLEDを動かす事で、3点が動くように見えるものです。
タスク1、タスク2は1秒間隔、タスク3は0.1秒間隔で動作させているので、タスク1、タスク2の2点のLEDが同時に動き、
タスク3の1点がその10倍の回転速度で、2点を追い越していくように見えます。
サンプルAは、2つの独立したタスクを生成し、セマフォを使って同期を取っているものです。
タスク1が、0.125秒間隔(1秒で1周する)でLEDを動かし、1周する毎にセマフォを解除(Give)するので、タスク1のLEDが1周
する毎にタスク2のLEDが1ステップ動きます。
時計の長針と短針のような動きをします。
サンプルBは、2つの独立したタスクを生成し、タスク1からタスク2にキューを使ってデータを連動するものです。
タスク1が、1秒間隔でLEDを動かし、5ステップ(5秒)毎にキューにLEDの位置(PORTの値)を書き込むと、タスク2が起動して、
キューの値を読み込み、タスク1の次のキューの書き込みがあるまで、その位置を表示します。
タスク2が動かすLEDが、タスク1が動かすLEDのラッチのような動きをします。
ボードのイメージ(上記のルーレットサンプルと全く同じ)と回路図
LEDは、PORTA(8−15)、PORTB(0−7/8−15)につないでも点灯するようなプログラムにしていますが、
ポートの一部は、デバッグやリセットでも使っているので、全てが正常に点灯するようにはしていません。
このマイコンは、8つのLEDを動かすのはきついので、ドライブ用に74HC245APを使用していますが、代わりに
トランジスタ等を使っても問題ありません。(トランジスタだと0.6Vのロスがあるので、暗くなるか、点灯しない可能性はあります)
電源電圧が3.3Vと低いので、LEDは赤以外では使えません。
サンプル@の動作イメージ
サンプルAの動作イメージ
サンプルBの動作イメージ
この項の最初に紹介したMDK−ARM software(Keil uVision4)を使ってみました。
このツールの無償バージョンは32Kバイトのコード制限がありますが、多くのMPUに対応していて、実質的なARM社の
純正ツールとして使われているようです。
インストール先に、各ボードに対応したデモプロジェクトが作成されるので、このプロジェクトを開くだけでも簡単なデモ
プログラムをデバッグ、プログラム作成する事ができます。
サンプルのLEDのデモプログラムは、正常に書き込まれると、USERボタンを押す毎に、ボード上の緑・青LEDの点滅が
変わります
インストールすると、次の画面が表示されますが、仮にこのように選択しておくといいと思います
(この指定ではSTM32F103が選択されますが、プロジェクトサンプルは下記で変更するので、ここでの入力はあまり意味はありません)
インストール先に「STM32VLDISCOVERT」用のデモプロジェクトが作成されるので、これを任意の場所に
コピーしておきます
「Keil uVision4」を起動して、上記でコピーしたデモプロジェクトを開き、ビルド、デバッグすると
MPUにプログラムが書き込まれ、デモプログラムを動かす事ができます。
上記の「Atollic TrueSTDIO」で作ったモールス信号のサンプルを「Keil uVision4」で動かしてみました。
「Atollic TrueSTDIO」で作ったプログラムは、「Keil uVision4」でも、ほとんど無修正で動かす事ができます。
「Keil uVision4」のプロジェクト作成は、慣れないと手間を感じるので、簡単なプロジェクトのテンプレートを
作っておくといいかも知れません。
新規プロジェクトの作成例
このサンプルでは、ハードウエアの追加は必要ありません。
この項の最初に紹介したIAR Embedded Workbench for ARMを使ってみました。
このツールの無償バージョンは16Kバイトのコード制限がありますが、ARMのMPUでも広く使われていて、日本語にも
対応しています。 このHPの他のMPUコーナーでも何度か紹介している開発ツールです。
このツールのデモプログラムは 「STM32VLDISCOVERY」
のページよりダウンロードできますが、このデモは初期のバージョンで
作られているらしく、現行バージョンでは定義等が変更されているため、簡単なビルドエラーを修正しないと、そのままでは動かす
事ができません。
デモが正常に書き込まれると、ユーザーボタンを押すごとに、ボード上の青と緑のLEDの点滅イメージが変化します。
デモのダウンロードのページと、フォルダーのイメージ
「IAR Embedded Workbench for ARM」を起動し、ダウンロードしたデモプログラムを開いて、
ビルド・デバッグすると、プログラムがMPUに書き込まれ、プログラムが動作します。
このデモをビルドすると、大量のエラーが発生するので、これを全て修正する必要があります。
エラーは大量に発生しますが、このデモの修正箇所は「core_cm3.h」のuint**をunsigned long
に変更するだけです。ビルドエラーがなくなるまで、×印の箇所を修正します。
上記の「Atollic TrueSTDIO」で作ったモールス信号のサンプルを「IAR Embedded Workbench」でも動かしてみました。
「Atollic TrueSTDIO」で作ったプログラムは、「IAR Embedded Workbench」でも、ほとんど無修正で動かす事ができます。
※但し、クロックがデフォルトで8MHz動作するので、32MHzで作ったタイマーやUART等のプログラムは、そのままの状態では
正常に動作しません。
「IAR Embedded Workbench」のプロジェクト作成も、慣れないと手間を感じるので、簡単なプロジェクトのテンプレートを作って
おくといいかも知れません。
@プロジェクトの作成
Aコンパイル、デバッグオプションの設定
BプログラムのMPUへの書き込みと実行
新規プロジェクトの作成例
このサンプルでは、ハードウエアの追加は必要ありません。
Atollic TrueSTDIOのサンプルと同じです
STM32 Minimum システム 開発ボードモジュールは、例えばAMAZONで500円程度から購入できる安価なモジュールです。
開発も容易で、入門者でも比較的容易に扱えるモジュールだと思います。
なお、私が実験で使用しているツールは全て無償で入手できるものです。
写真
レイアウト
・MDK-ARM software http://www.keil.com/
・IAR Embedded Workbench http://www.iar.com/
・Atollic TrueSTUDIO http://www.atollic.com/
・STM32CubeIDE https://www.st.com/ja/development-tools/stm32cubeide.html
STMicroeleconics社の「STM32 ST-LINK Utility」を使って書き込みを行っています。
ST−LINK2は、AMAZONで500円程度で購入できます。
J−LINKを使って書き込みする事もできます。
J−LINKは、STMマイコンに限らず、多機能で多くのマイコンに対応していて、ツールも豊富です。
STM32 ST-LINK Utility
Atollic TrueSTUDIOは、デフォルトではST-LINKを使った書き込みで必要なHEXファイルを出力しないので、Atollic TrueSTUDIOの設定で
「プロジェクト」=>「C/C++ビルド設定」=>「Other/Output format」=>「Convert build output」で「Intel Hex」のチェックが必要です。
ST−LINK2
SGGGER J−Flash Ligtを使って、J−LINKで書き込む例
J−LINKを使って書き込みする事もできます。
J−LINKのほうが、ST−LINKより機能が豊富なようです。
J−LINK
J−LINK(20ピン端子)で下記のマイコンボード(STM32F103C8T6/STM32L010F4P6)に書き込む場合の接続例
注1)J−LINKは多くのインターフェースをサポートするため、20ピン端子は、選択するインターフェースにより
ピン配置が全く変わりますので注意が必要です。
注2)J−LINKのRESET端子は、STM32マイコン側のNRST端子とつながなくても書き込みできます。
(AMAZONで購入したSTM32F103C8T6ボードのSWDコネクタには、そもそもNRST端子はない)
この場合、STM32マイコン側にはリセットボタンを追加して(NRST端子とグランド間にプッシュスイッチをつける)、
最初にマイコンのリセットをかけてから書き込みしないと、書き込みに失敗する事があります。
注3)この回路で何も問題なく書き込み出来ていますが、マニュアルによると、ほんとうはVCC−DIO間には100KΩ程度の
プルアップ抵抗を入れた方がいいと思います。
プルアップ抵抗を入れて実行してみましたが、問題なく書き込みできます。
モジュールをST−LINK2で、Windows10パソコンにつないだだけのものです。
写真
稼働確認のために作ったLEDの点滅プログラムです。
サンプル@は、ボード上のLED(PC13)が1秒毎に点滅します。
サンプルAは、B0端子にスイッチをつけた時、スイッチがHレベルの時LEDが点灯し、Lレベルの時LEDが消灯するようにしたものです。
サンプルBは、STM32CubeIDE用に作ったサンプルで、ボード上のLED(PC13)が点滅します。
このサンプルを動かすためには、新規のSTM32プロジェクトの作成の時に、画面からPC13を出力にしてビルドする必要があります。
また、ST−LINKやJ−LINKで書き込みを行うために、BINやHEXファイルを出力するようにしておいた方がいいと思います。
サンプルBは、STM32CubeIDEでビルドする時に、STM32CubeIDEの画面からPC13を出力にしておきます。
STM32CubeIDEでST−LINKやJ−LINKで書き込みを行うためには、
STM32CubeIDEの画面からBINやHEXファイルを出力するようにしておきます
システムクロックを出力するプログラムで、上記のSTM32Fマイコンのプログラムをコピーして稼働確認してみただけです。
ボードのA8(MCO)に、8MHzまたは36MHzのいずれかのクロックを出力できます。
UARTのサンプルプログラムです。
メッセージを出力した後、エコーバックプログラムになります。
接続イメージ
TERA TERMのイメージ
秋月電子で250円で購入したSTM32F042K6T6を使ってみました。
開発は、上記、「STM32F103C8T6 ARM STM32 Minimum システム 開発ボードモジュール」と同じものを使用しています。
写真
回路図
上記回路図で漏れていますが、31ピン(PB8-BOOT0)は、10KΩでGNDにつないでおかないと、動作が不安定になる可能性があります。
稼働確認のために作ったLEDの点滅プログラムです。
プログラムソース@は、内部OSC(8MHz)、TIMER1を使って、1秒毎にボード上のLEDが点滅します。
STM32L010F4P6は、Cortex−M0(32ビットマイコン)、クロック:32MHZ、プログラムメモリー:16Kバイト、
ADC、UART、I2C、SPI内蔵の20ピンのARMマイコンです。
これだけの高性能なマイコンであるにも関わらず、秋月電子では95円で購入する事ができます(R03.7.1現在)。
写真(秋月電子の変換基板に取り付けたイメージ)
0.1μFのチップコンデンサは、変換基板上に取り付けています
STM32L010F4P6のピンレイアウト(データシートより抜粋)
写真
回路図
上記回路図で漏れていますが、1ピン(PB9-BOOT0)は、10KΩでGNDにつないでおかないと、動作が不安定になる事があります。