2018年12月28日金曜日

STM32のUSARTのRTS

 STM32のUSARTで遊んでる(USB FS CDCはあまりビットレートが出ないので、大容量の転送にはUSARTのほうが有力のため、さらに有効に使うための予備実験)。

 とりあえず、割り込みもDMAも使わず、てきとーにポーリング、という状態。


 RTSを有効にした上で3バイトを転送すると、1バイト目の受信中に(最終ビットを受信した時点で)RTSがアサートされる。しかし、この時点でアサートされてもFT232Hは対応できないので、次のデータの送信が始まってしまう。
 次のデータのストップビットを受け取った時点でOver Run Errorが発生し、RTSはネゲートされる。
 FT232は3バイト目の送信をRTSによりディレイするが、STM32は2バイト目を受信した時点でRTSをネゲートするので、FT232は受信可能な状態として認識し、3バイト目の送信を開始する。

 以降、Run Time Errorをクリアしない限り、RTSはネゲートで固定されている。


 STM32F4のAPB1に接続されたUSARTは最大で5.25Mbaud程度までは対応しているが、115.2kbaudでも早すぎるなら、5.25MbaudでRTSを使うのは現実的ではなさそうだ。
 少なくとも、ポーリングでは不可能。まぁ、ポーリングで5.25Mbaudなんて活かせるわけがないので、最初から使う気はないわけだが。
 DMAを使う場合でも、うまいこと処理してやる必要がありそう。

 APB2に接続されたUSART1なら10.5Mbaudまで出せるけど、USART1のハードフローはUSB FS phyに使用されているピンと競合するので、USB FSをデバッグに使っているとUSART1のハードフローは使用できない。
 USB CDC(VCP)だけならUSB HS internal phyでもいいけど、今度はUSB DFUでの書き込みができなくなる。
 他に、APB2にはUSART6も接続されているが、STBee F4miniに使われてる64ピンパッケージではUSART6のRTS/CTSは使用できない。
 結局、APB1を使うしかない、という結論になる。
 そもそも、DMAでRTSを割り込みの中から制御するなら、わざわざペリフェラルに接続されたRTSを使う必要はないわけだから、UARTとかでもフロー制御できるわけだが。

***

おまけ

 ポーリングとは、雌伏して悪巧みをする、または反撃の準備をすること。
 出典:私、能力は平均値でって言ったよね! - 78 閑話


 「ポーリングをポーリングする」みたいな言い回しができそう。

0 件のコメント:

コメントを投稿