So-net無料ブログ作成
検索選択

PSoC Creator で FM0+ の Lチカ (3) [FMx]このエントリーを含むはてなブックマーク#

FM0+ 評価ボード

前回の記事では、精密な「Lチカ」を行うために PWM を使って LED を直接駆動していました。 今回は、周期割り込みを使って、「Lチカ」してみます。

使用するボードは、 FM0+ S6E1C-Series Starter Kit (FM0-64L-S6E1C3) です。

回路図に GPIO と RT を配置する

GPIO と RT を配置する

プロジェクトを作成するところまでは、前回までと同じです。 今回は、 GPIO コンポーネントと Reload Timer (RT) コンポーネントを配置します。 GPIO は "Component Catalog" の "Ports and Pins" から回路図に Drag&Drop します。 また、 Reload Timer は "Component Catalog" の "Digital" から Drag&Drop します。 GPIO は、名前を "Pin_Red" に変更しておきます。


Interrupt タブ

RT コンポーネントは、ダウンカウンタで構成されたタイマで、カウンタがゼロになったらあらかじめ設定された値をカウンタに書き込みます。 書き込みイベントが周期的に発生するため、周期割り込みを発生するのに使用されます。

このコンポーネントは、割り込みの機能だけを使い、入出力は使いません。 そのため、「Basic タブ」 は変更しません。

「Interrupt タブ」では、どのような種類の割り込みを発生させ、その時にどの関数を呼び出すかを設定します。 "bRtUnderflowIrq" を "true" に設定すると、 Reload Timer の一周期ごとに割り込みが発生します。 その時に "pfnRtUnderflowIrqCb" に設定されたコールバック関数が呼び出されます。 ここでは、 "UnderflowCb" としました。 実際には、この名前の初めにコンポーネントの名前を付けた "RT_UnderflowCb()" が呼び出されます。

"bTouchNvic" も "true" に設定します。 このパラメータを "true" にすると、割り込み受付モジュール Nested Vector Interrupt Controller (NVIC) の設定が一緒に行われます。 以上で、周期割り込みを受け付けてコールバック関数を呼び出すようになります。 フラグをクリアするなどの操作は、自動的に生成されるので、ユーザが気にする必要はありません。


RT タブ

「RT タブ」では、一項目を設定します。 "enRtPres" で RT のクロックに使用されるプリスケーラの分周比を設定します。 PWM コンポーネントの "enPwmPres" と考え方は同じです。 今回も、最大分周比である "1/2048" を使用します。 デフォルト状態でのクロック周波数は 8MHz なので、 RT の駆動クロックは、約4kHzとなります。

これで回路図の設定は終わりです。

端子を割り当てる

端子の設定

次は、端子の割り当てを行います。 "Pin_Red" に "P3D" を設定します。

以上でハードウェアの設定は終わりです。 プログラムを記述する前に "Build" して、あらかじめ API を作成しておきます。

ソースコードの記述

ソースコード

次は、ソースコードの記述です。

#include "project.h"

#define     CYCLE       (8000000/2048/2)    // 0.5秒を作る分周比

void RT_UnderflowCb(void) {
    Pin_Red_GpioPut(!Pin_Red_GpioGet());    // GPIO 出力を反転する
}

int main(void) {
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    Pin_Red_GpioInitOut(1);                 // GPIO を出力に設定する
    Bt_Rt_Init(&RT_HW, &RT_Config);         // RT の初期設定
    Bt_Rt_WriteCycleVal(&RT_HW, CYCLE);     // RT 周期
    Bt_Rt_EnableCount(&RT_HW);              // RT を起動する
    Bt_Rt_EnableSwTrig(&RT_HW);             // RT にトリガをかける

    for (;;) {
        /* Place your application code here. */
    }
}

必要なのは、割り込みコールバック関数と初期設定だけです。 割り込みコールバック関数 "RT_UnderflowCb()" は、 RT のカウンタがゼロになるたびに呼び出される関数です。 この関数では、 GPIO "Pin_Red" の出力を反転させています。 周期割り込みが0.5秒ごとに発生するので、 LED は、 1Hz で点滅します。

GPIO コンポーネントは、 "main()" 関数内で "GpioInitOut" メソッドにより出力に設定します。 出力の初期設定値は、 "1" です。

"Bt_Rt_Init()" は RT の初期設定を行う関数です。 PWM の時と同じように第一引数に &RT_HW を渡して、設定すべきタイマブロックを指定しています。 第二引数の &RT_Config には、コンポーネントの設定ダイアログで設定したパラメータが格納されています。

"Bt_Rt_WriteCycleVal()" は、 RT の周期を設定します。 周期の単位は、設定ダイアログで指定した約4kHzの RT 駆動クロックです。 このプログラムでは、コンパイル時に設定値 (CYCLE) を計算させて、周期に0.5秒を設定しています。

"Bt_Rt_EnableCount()" で、 RT の動作を開始します。 ただし、この時には RT カウンタは動き出しません。 カウンタが動きだすのは、 "Bt_Rt_EnableSwTrig()" でトリガをかけた時です。 トリガを受けた RT は、継続して割り込みをさせます。

ここで使用されている関数群は、 Peripheral Driver Library (PDL) ライブラリそのものです。 このライブラリの設計思想は、従来の PSoC の API とは異なっているので、注意が必要です。

ソースコードは、以上です。 "Build" して、 "Program" すると、 LED が点滅を始めます。 「Lチカ」できました。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。