モダンOSのお砂場(38) Mbed OS6、Timerでインターバル測定。STM32

Joseph Halfmoon

前回がPWM出力だったので、今回は逆に入力インターバルをタイマAPIで測定してみました。入力は割り込み受け、人間がボタンを押す想定なので精度的にはいい加減な方法です。まあ、とりあえずボタンを押す時間間隔は測れたと。また、前回と異なり今回はオブジェクトコードの作成にWebベースのMbed Compilerを使ってみます。

前回まで WindowsPC上の、VScode+PlatformIOのローカル環境でビルドを行ってきましたが、今回は、Arm MbedのWebコンパイラ利用です。気まぐれですが、どちらも一長一端あり、両方使っておこうと。アイキャッチ画像はMbed Compilerの画面であります。

Web環境の良いところ一つが、常に最新版にアップデートされていることでしょうか。使用するMbed OSの履歴なども以下のように確認できます。

rev

 

今回使用した Timer APIの説明ページは以下です。

Timer

ソースの作成

ソースはローカル環境にある前回のものをアップロードして修正して使い回しです。Web環境、ローカル環境で同じソースでほぼほぼ同様な作業が行えるところもMbedの良いところじゃないかと思います。

今回は、人間がUSERボタンを2回続けて押したら、USERボタンの割り込み時間間隔を標準出力に報告する、というものです。人間相手なので手抜きコードです。

#include "mbed.h"
#include "platform/mbed_thread.h"
#include <stdio.h>
#define BLINKING_RATE_MS 1000

// B1 USER pin for Nucleo-64-boards
InterruptIn B1_USER(PC_13, PullUp);
DigitalOut  LD2(LED1);
volatile bool measureFlag = false;
volatile bool endFlag = true;
Timer sw;

void b1UserHandler() {
    if (!endFlag) {
        if (measureFlag) {
           sw.start();
           measureFlag = false;
        } else {
           sw.stop();
           endFlag = true;
        }
    }
}

int main()
{
    B1_USER.fall(b1UserHandler);
    measureFlag = true;
    endFlag = false;
    while (true) {
        if (endFlag) {
            printf("Elapsed Time: %d [msec]\r\n", sw.read_ms());
            measureFlag = true;
            endFlag = false;
        }
        LD2 = !LD2;
        thread_sleep_for(BLINKING_RATE_MS);
    }
}
ビルド

ビルドは、ST Microelectronics製 Nucleo-F401RE ボードをターゲットに行いました。標準的なMbed環境の場合、ビルド後自動でオブジェクトファイル(.bin)がダウンロードされるので、それをNucleo-F401REの「ドライブ」にコピーすれば書き込み完了です。

stdioがUSBシリアルに向いているので、適当な端末ソフト(当方では伝来のTeraTermであります)で接続すれば結果を見ることができます(ボーレートは9600ボーのまま。)

実機動作結果

実際にF401REボードにオブジェクトを書き込み、動作させてみたところが以下に。Nucleo-F401REボード上のUSERボタン(青色)をクリクリと2回押すとその間(フォーリングエッジからフォーリングエッジまで)の時間を表示します。「感覚」的に時間を長くしていくとこんな感じ。ま、いい加減ですが、測定はしているみたい。

MeasureINTRinterval

タイマでインターバルが測れることも一応確認できた、と。もっとシビアな制御をしないとそれらしくないけれども。

モダンOSのお砂場(37) Mbed OS6、PWMを使う。STM32 へ戻る

モダンOSのお砂場(39) Mbed OS6、ConditionalVariableヤバイ? へ進む