PIC32MX270 - MPLAB Harmony 3 でタイマー割り込み
前回 UARTで文字の表示ができたので、こんどはタイマー割り込みを使って 1秒毎に繰り返し文字を表示するように改造してみます。
まずは、変な操作をしてわけがわからなくなっても簡単に元に戻せるように、前回作成したプロジェクトのフォルダをそのままコピーしてバックアップを取りました。
プロジェクトにタイマーを追加する
MPLAB X IDE で前回作成した UARTで文字を表示するプロジェクトを開いて、[Tools] - [Embedded] - [MPLAB Harmony 3 Configurator] で MPLAB Harmony 3 Configuratorを開きます。
Project Graphに Peripherals - TMR - TMR1 を追加します。 UART1を追加したときと同じなので簡単。
タイマーの設定
Project Graphの TMR1をクリックすると、右側にタイマーの設定が表示されるので
- Enable Interrupts? = チェックを入れたまま
- Select Prescaler = 1:256
- Timer Period = 1,000ミリ秒
と設定します。設定はこれだけ。データシートを見ながらレジスタを設定していくのは結構骨が折れるのですが、Harmonyを使うと楽ちんです。
プリスケーラを変更すれば自動で入力クロックが変わるし、タイマーの周期をミリ秒で指定すれば自動でレジスタにセットする値を計算してくれるしでとても便利。
設定はこれで終了なので、Generate - Generate Code でコードを生成して、MPLAB X IDEに戻ります。
このように既存のプロジェクトにライブラリを追加しても、いい感じに処理してくれます。
コードの追加
Harmonyでタイマーのペリフェラルライブラリ(plib_tmr1.c)が追加されましたので、これを使って 1秒毎に UARTで文字を表示するように main.c にコードを追加します。
volatile uint8_t count;
void timer_int(uint32_t status, uintptr_t context) // タイマー割り込みで呼ばれる関数
{
count++;
}
int main ( void )
{
char buff[] = "Hello World!\r\n";
uint8_t previous = 0xff;
/* Initialize all modules */
SYS_Initialize ( NULL );
TMR1_CallbackRegister( timer_int, NULL ); // タイマー割り込みで呼ばれる関数を登録
TMR1_Start(); // タイマースタート
while ( true )
{
if(previous != count) // countが変化したら実行
{
UART1_Write(buff, sizeof(buff)); // (Hello World!)
previous = count;
}
/* Maintain state machines of all polled MPLAB Harmony modules. */
// SYS_Tasks ( );
}
/* Execution should not come here during normal operation */
return ( EXIT_FAILURE );
}
こんな感じになりました。
タイマーで 1秒毎に割り込みがかかるので、そのたびにカウンタを1つ加算して、main関数の無限ループ内でカウンタが変化したら文字を表示しています。
実行してみると、ちゃんと 1秒毎に繰り返し文字が表示されました。
簡単にタイマー割り込みが使えました。基本的なペリフェラルも割り込みも使えるようになったので、これでだいたいの電子工作はできるようになりました。
ペリフェラルライブラリのリファレンスマニュアルは無いのかな? と少し探してみたけれど見つけられなかったのですが、Harmonyが追加してくれる plib_tmr1.c とか plib_uart1.c とかのソースコードを読めば使い方はわかりました。コードが短いですし、コメントもついていたりしました。