台風と初雪が同時にやってきたのは初めてだよ・・・う~寒い
こんばんは syncton です。
前回で printf() デバッグができるようになったので、今回は USART の割り込みを使って MIDI 入力する部分を作っていきます。
今後も STM32 を使う予定があるので調べた事をまとめておきます。
[2013.10.18 追記] クロックの設定漏れがあったので6.1に追記
1.MIDIのハードウェア規格
- 転送方式:非同期方式シリアル転送
- 転送速度:31.25 kbit/s(±1%)
- データ長:8 bit
- パリティ:なし
- ストップビット:1 bit
- フロー制御:なし
JIS X6054-1:「電子楽器ディジタルインタフェース (MIDI) -第1部:総則」
P.2 ハードウェア より
2.USARTとGPIO
|
[UM0919] STM32VL Discovery User Manual(Rev.2) P.8/24
Figure 6. STM32F100RBT6B block diagram より |
2.1.GPIOの設定
「UM0919 STM32VL Discovery User Manual P.17 Table.6 P3 pinout」 で USART3 で使用するポートとピンを調べる。今回は APB2 のポートBのピン10,11を使用。
前回作成したMIDIインターフェースは5Vで動作しているので、これらのピンが5V耐性かどうかも調べておきます。
「STM32F100RB Datasheet(Rev.7)」に載っています。
I/O level が FT(5 V tolerant)なのでOKですね。
|
「STM32F100RB Datasheet(Rev.7)」 P.24
「Table 4. Low & medium-density STM32F100xx pin definitions」 より |
GPIO のモードは「RM0041 Reference manual(Rev.4) P.107 Table 22. USARTs」によると、
入力は「Input floating」または「Input pull-up」が選択可能ですが、インターネット上のサンプルはほとんど「Input floating」を指定しているようです。
出力は「Alternate function push-pull」を指定します。
MIDI入力時の最大出力速度の設定は不要だと思うのですが、GPIO_InitTypeDef 構造体の GPIO_Speed に何らかの値をセットしないといけないのですが、調べても良くわかりませんでした。
そこで、ポート設定レジスタのリセット時の初期状態が0(ゼロ)なので、そうしてみました。
また、今回のサンプルではMIDI出力は使用しませんがピンの設定だけしておきます。
GPIO の最大出力速度は 2MHz、10MHz、50MHz から選べるのですが、STM32F100RB のクロックの最高速度は 24MHzなので、それより速い 50MHzは意味がないような気がします。
MIDIはそれほど高速ではないので、GPIOの最大出力速度は一番遅い 2MHz としてみました。
詳細は 「RM0041 Reference manual(Rev.4)」 の 「P.110 7.2.1 Port configuration register low」 および 「P.111 7.2.2 Port configuration register high」 参照