自動ボーレート検出。曰く、通信速度がわからないとき、あるいはシステムのクロックソースの精度が悪い時、に使うといいらしい。
まぁ、特に難しいことはないので、リファレンスマニュアル通りにいくつかビット動かせばよかろう。
流れとしては、ISR.ABRFがクリアされていればCRのABRMODEを設定したあとにABRENをセット、ISR.ABRFがセットされていればRQR.ABRRQをセット、という感じで使える。
ABRMODEを3にした場合、0x55(ASCII'U')を送るとボーレートを検出してくれる。モード2を除いて、0,1,3で0x55を送ればいい。モード2の場合は0x7Fを送る必要があるが、ASCII範囲のキワッキワにいるので簡単に送れない気がする。検出精度が高いのはモード2かな?
USARTブートローダでも最初に0x7Fを送るけど、F3以外のF1やF4等ではABR機能は無いので、ソフト的に実装してるんだと思う。
注意点として、受信したキャラクタ(e.g. 0x55)は、RDRに格納されるので、不要な場合は読み捨てる必要がある。さもなくば、次にABRを使おうとしても使えない(ハマった)。
ボーレートがわからないんだからデータは捨ててんだろ? と思って油断していたが、スタートビットだけでボーレートを推定できるらしい。
2400baudくらいの設定でABRを使うと、ちゃんと毎回数値が変化する。が、8MspsともなるとBRRは17くらいになるので、何回試しても変わらない。
別のSTMの資料によると、クロック誤差が3%を超えるとUARTとして正常に受信できないそうだ。送信する場合は相手の受信アルゴリズムによるのでこっちの誤差だけでは決められないだろうけど。
STM32F303xDのデータシートによると、HSIは25℃時で1%程度の誤差だそうなので、UARTで大きな問題になるほどではない気がする。-10 - +85℃でも2.3%くらい。
***
せっかく簡単に使える機能なのでABRを試してみたけど、やっぱりクロック誤差ではないような気がするなぁ。かといって、PC側の帯域使用率とかCPU使用率が問題になってくると手の出しようがないわけで。コマッタ。
0 件のコメント:
コメントを投稿