PSoC Creator で FM0+ の Lチカ (2) [FMx]
前回の記事では、時間稼ぎループをソフトウェアで実現していたために、精密な「Lチカ」にはなりませんでした。 今回は、ハードウェアの力を借りて、「Lチカ」してみます。
使用するボードは、 FM0+ S6E1C-Series Starter Kit (FM0-64L-S6E1C3) です。
回路図に PWM を配置する
プロジェクトを作成するところまでは、前回と同じです。 今回は、 PWM コンポーネントを配置します。 "Component Catalog" の "Digital" にある "PWM" を Drag&Drop で回路図に配置します。
次にコンポーネントの設定を行います。 このプロジェクトでは、 PWM 出力を直接赤い LED に接続します。 その際に PWM 出力で使用される端子を Timer I/O A (TIOA) と呼びます。 Basic タブでは、"ConnectTIOA" を "true" に設定して TIOA 出力を有効にします。
PWM タブでは、二項目を設定します。 まず、 "enPwmOutputPolarity" で出力の位相を設定します。 "Initially high" に設定すると、初期状態が HIGH になります。 TIOA に接続される LED は、電源とポート出力の間に接続されています。 そのため、負論理 (Active Low) 出力に設定します。
"enPwmPres" は、 PWM のクロックに使用されるプリスケーラの分周比を設定します。 今回は、クロックに比べて遅い点滅にするため、最大分周比である "1/2048" を使用します。 デフォルト状態でのクロック周波数は 8MHz なので、 PWM の駆動クロックは、約4kHzとなります。
これで回路図の設定は終わりです。 端子を表すコンポーネントがありませんが、設定で有効にした TIOA が使われることになります。
端子を割り当てる
次は、端子の割り当てを行います。 ここでは、 PWM の TIOA 端子をどこに割り当てるかを指定します。 割り当てるのは、赤い LED が接続されている P3D 端子です。 "PWM:TIOA" に "P3D" を設定します。
以上でハードウェアの設定を終わりです。 プログラムを記述する前に "Build" して、あらかじめ API を作成しておきます。
ソースコードの記述
次は、ソースコードの記述です。
#include "project.h" #define CYCLE (8000000/2048/2) // 0.5秒を作る分周比 int main(void) { /* Place your initialization/startup code here (e.g. MyInst_Start()) */ PWM_SetPinFunc_TIOA_OUT(); // PWM の出力機能を有効にする Bt_Pwm_Init(&PWM_HW, &PWM_Config); // PWM の初期設定 Bt_Pwm_WriteCycleVal(&PWM_HW, CYCLE - 1); // PWM 周期 Bt_Pwm_WriteDutyVal(&PWM_HW, CYCLE / 2); // PWM デューティー Bt_Pwm_EnableCount(&PWM_HW); // PWM を起動する Bt_Pwm_EnableSwTrig(&PWM_HW); // PWM にトリガをかける for (;;) { /* Place your application code here. */ } }
必要なのは、初期設定だけです。 まず、 "PWM_SetPinFunc_TIOA_OUT()" で PWM の TIOA に割り当てられた端子、すなわち P3D 端子を出力に設定します。 この関数は、 PWM コンポーネントのメソッドのように記述されています。
ところが、これ以降の関数ではメソッドという扱いにはなっていません。 次の "Bt_Pwm_Init()" は PWM の初期設定を行う関数ですが、引数としてタイマのレジスタアドレスである &PWM_HW を渡して、設定すべきタイマブロックを指定しています。 このレジスタアドレスを使って、各種レジスタを関数で設定するという仕組みです。 第二引数の &PWM_Config には、 PSoC Creator の設定ダイアログで設定したパラメータが格納されています。 設定ダイアログを見てわかるように、このパラメータには PWM の周期やデューティーといった情報は含まれてはいません。 これらの情報は、別途設定をすることになります。
"Bt_Pwm_WriteCycleVal()" と "Bt_Pwm_WriteDutyVal()" は、 PWM の周期とデューティーを設定します。 ここでも引数にレジスタアドレスを渡しています。 周期とデューティーの単位は、設定ダイアログで指定した約4kHzの PWM 駆動クロックです。 このプログラムでは、コンパイル時に設定値を計算させて、周期に0.5秒、デューティーにその半分 (50%) を設定しています。
"Bt_Pwm_EnableCount()" で、 PWM の動作を開始します。 ただし、この時には PWM カウンタは動き出しません。 カウンタが動きだすのは、 "Bt_Pwm_EnableSwTrig()" でトリガをかけた時です。 トリガを受けた PWM は、継続して LED を点滅させます。
ここで使用されている関数群は、 Peripheral Driver Library (PDL) ライブラリそのものです。 このライブラリの設計思想は、従来の PSoC の API とは異なっているので、注意が必要です。
ソースコードは、以上です。 "Build" して、 "Program" すると、 LED が点滅を始めます。 「Lチカ」できました。
PSoC Creator で FM0+ の Lチカ (1) [FMx]
PSoC Creator が、 Revision 4.0 から FM0+ MCU にも対応するようになりました。 評価ボードも入手できるので、さっそく「Lチカ」してみましょう。
使用するボードは、 FM0+ S6E1C-Series Starter Kit (FM0-64L-S6E1C3) です。
プロジェクトを作成する
プロジェクトの作成手順は、これまで PSoC のプロジェクトを作成した時と同じです。 まず、メニューから "File" → "New" → "Project..." を選んでダイアログを開きます。
ダイアログの最初の画面では、デバイスを選択します。 最近の PSoC Creator では、デバイスの型番を指定する代わりに、キットの型番を選択していましたが、 FM0+ のキットはリストに並んでいません。 そこで、 "Target Device" を選択しデバイスリストから "S6E1C32D0AGV20000" を選びます。
次にプロジェクトの初期状態を選択します。 今回は、白紙の状態からプロジェクトを作成しますので、 "Empty Schematic" を選択します。
最後に、プロジェクトを配置するディレクトリと Workspace 名および Project 名を選択します。 これで、プロジェクトが作成できました。
回路図に GPIO を配置する
次は、回路図に GPIO コンポーネントを配置します。 "Project Explorer" から ".cysch" ファイルの回路図を開きます。 そして、 "Component Catalog" の "Ports and Pins" にある "GPIO" を Drag&Drop で回路図に配置します。
配置されたコンポーネントをダブルクリックして、設定ダイアログを開きます。
設定項目は、わずかです。 入出力の設定さえありません。 ここでは、コンポーネントの名前を "Pin_Red" に変更します。 これで、回路図の準備は終わりです。
端子を割り当てる
回路図が出来たら、端子の割り当てを行います。 PSoC Creator 4.0 からは、 "Workspace Explorer" から直接端子設定画面を呼び出せるようになっています。 "Design Wide Resources" の下にある "Pins" を開きます。
端子の設定方法は、これまでと同じです。 この評価ボードでは、赤い LED が、 P3D 端子に接続されています。 "Pin_Red:GPIO" に "P3D" を設定します。
以上でハードウェアの設定を終わりです。 プログラムを記述する前に "Build" して、あらかじめ API を作成しておきます。
ソースコードの記述
次は、ソースコードの記述です。 PSoC 比べると、記述は多めです。
int main(void) { /* Place your initialization/startup code here (e.g. MyInst_Start()) */ Pin_Red_GpioInitOut(1); // GPIO を出力に設定する for (;;) { /* Place your application code here. */ uint32_t i; for (i = 0; i < 1000000; i++) ; // ちょっと待つ Pin_Red_GpioPut(!Pin_Red_GpioGet()); // GPIO 出力を反転する } }
GPIO コンポーネントでは、入出力の方向さえ定めていませんでした。 そのため、 GPIO を出力として設定する必要があります。 "GpioInitOut" メソッドで設定を行います。 引数には、出力の初期設定値が入ります。
PSoC では、待ち時間を作るための CyDelay() などの関数がありましたが、 FM0+ の場合には見つかりませんでした。 そこで、目分量で1000000回のループを作成し、待ち時間を作っています。 デフォルトの状態では、内部 8MHz クロックをそのまま CPU で使用していますので、これで1秒近辺の待ち時間が出来るでしょう。
GPIO の読み出しと書き込みには、メソッド "GpioGet" と "GpioPut" を使用します。 ここでは、読み出した値を論理反転して書き込み、 LED を点滅させます。
ここで使用されているメッソド群は、間接的に Peripheral Driver Library (PDL) と呼ばれるライブラリを呼び出しています。 どんな事ができるのかを知るためには、 PDL も知る必要がありそうです。
ソースコードは、以上です。 "Build" して、 HEX ファイルを作成します。
MCUに書き込む
PSoC の場合、 MiniProg や KitProg などの PSoC 固有のインターフェイスが使用されていました。 評価ボードの場合、標準的なインターフェイスは CMSIS-DAP です。
メニューから "Debug" → "Select Debug Target..." を選ぶとデバッガのインターフェイスが表示されます。 評価ボードを接続すると、 "CMSIS-DAP" が認識されます。 問題なくデバッガとして認識されるようです。
プログラムは、メニューの "Debug" → "Program" で書き込まれます。 書き込みが終わると、そのままプログラムが実行されて、 LED が点滅します。 「Lチカ」できました。