ぐだぐだ低レベルプログラミング(25) 低レベルプログラミングの友、オシロ

Joseph Halfmoon

問題含みの前々回、第23回で『後で実行クロックを一応実測しておきます』と書いてしまった(?)ので、今回は測ってみました。低レベルプログラミングでは、CPU内蔵のサイクルカウンタ類は勿論、ICEなどの開発ツールが提供する時間計測機能などが活躍するシーンも多いですが、「真実の友」はオシロスコープじゃないかと思います。「見ればわかる」ことは多い。

※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら

アイキャッチ画像に掲げさせていただいたのは、別シリーズ「お手軽ツールで今更学ぶアナログ」で多用させていただいております「お手軽ツール」の筆頭、

Digilent社 Analog Dicovery2

であります。Analogというお名前はついているものの、簡易的なロジアナ機能などもあり、Digitalな用途、マイコン開発などでは結構使えるのではないかと思われます。ただ、100Mspsという速度の制限があるので、あまり速い信号には対応できませぬ。今回「実測」の対象は、

RISC-V搭載32ビットマイコン、GigaDevice社GD32VF103

であります。文書を読む限りCPUの動作周波数108MHzである筈なのですが、念のためこれを実測で確かめておこう、ということであります。まあね、開発ボードが小売りされているようなステージなので、文書と実物の動作が違うということはまずない筈ですが、過去を振り返ると、xxMHzだと思ったら、実はYYみたいなことがたまにあります。まあ、開発中だったりすると変更したのに、どこか抜けていたみたなことが稀にありますからね(怒るか、怒られるかはその時の立場次第。)

108MHzは100Mspsの装置では測れませんな。でもね、108MHzのクロックが直接表に出ているわけでもない。CPUに入っているだけ。第22回だったかの測定で、サイクルカウンタを使い

1ループ=3サイクル

のソフトウエアループを作ってありました。極めて安定(開発ボード上ではOS動いているわけでもないし、割り込みなど邪魔者は動かしていない)。これを使えば、

108=3*36

という計算で、36回ループすれば108サイクルの時間が使えます。これでソフト的に分周すれば1MHzとなって測定大丈夫だあ、の範囲に落ちます。ただし、ループの前後に、外に信号を出すための細工など数十~数百サイクルの余分なものがはいるので、108サイクルでは短い。この際、

108000=3*36*1000

という計算で、36000回ループでどうでしょう。さすれば、細工で1000サイクル(実際にはそんなにかからないです)使っても誤差1%にもなりますまい。

.section    .text
.align      2
.globl      softLoop108000

softLoop108000:
    addi    sp,sp,-16
    sw      ra, 12(sp)

    li      s1, 36000
    rdcycle  s0
1:
    addi    s1, s1, -1
    bgt     s1, zero, 1b

    rdcycle a0
    sub a0, a0, s0

    lw      ra, 12(sp)
    addi    sp,sp,16
    ret

上のコードで、「108000サイクル+ちょっと」が消費されるます。それを呼び出しているコードはCでこんな感じ。

while(1) {
    if (onOFFflag == 0) {
        gpio_bit_reset(GPIOC, GPIO_PIN_8); //OE#
        onOFFflag = 1;
    } else {
        gpio_bit_set(GPIOC, GPIO_PIN_8); //OE#
        onOFFflag = 0;
    }
    softLoop108000();
}

PC8を出力端子に使ったのは、「74HC595の闇」の回でちょうど出力用に信号とりだせるようにしてあったため。初期化コードなどはそちらを御覧ください。

上のベタなコードのとおり、ループでこさえた1kHz間隔で、PC8は1になったり0になったりトグルするので、さらに2分周して

500Hz

この値がオシロに見えれば、ちゃんとCPUは108MHzで動作しておる、ということになります。見てみましょ。

CPU CLOCK ÷ 216K

Analog Discovery2のオシロの周波数測定機能使いました。499.90Hzです。オマケが入っていることを考えれば十分じゃないですかね。ちゃんとCPUは108MHzで動作しておる、と。

なお、測定の時には一応ダンピング抵抗を入れてみました。実は74HC595の回で波形がかなり暴れているのに気づいたのですが、動作したのでそのままOKにしてました。GD32VF103のIOはかなり頑張って電流流せる仕様になっているので、相手によっては結構頑張りすぎ(オン抵抗が小さい)てオーバーシュート、アンダーシュートがデカくなるかもです。今回は多少反省。こんな感じ。Damping Resistor

でもね、Seeedのデモボードの端子からジャンパ線で長々と取り出した後に、適当な値の抵抗(今回は220Ω)を入れているので、多分、エライ人には怒られるダンピング抵抗の入れ方じゃないかと思います。偉大な半導体商社様、マクニカ殿のホームページに碓井様の

というコラムがあるので、ちゃんとしたい人はそちらをご参照ください。ま、上のいい加減な感じでもその上の波形みたいに多少は効いている感じ(ま、500Hzだし。。。)

ダンパを入れない場合の波形はこちら

信号の周りに見える薄い影の部分の説明は、以下でとりあげとります。

お手軽ツールで今更学ぶアナログ(5) 信号の影は何?Analog Discovery 2

まあ、いい加減なダンパでも、入れたら上下の影が大体消えたからOKっと。

ぐだぐだ低レベルプログラミング(24) 訂正! GD32VF103、遅かったのは私のバグ へ戻る

ぐだぐだ低レベルプログラミング(26) タイマ割り込みをかけながら へ進む