1文字の時、正しく出たのだろう。1文字のときでも化けるはずなのだが、1文字の時は正常に送出される。前のV1のライブラリを使った103の仮想UARTと同じような動きはするようになった。systickを使ったタイマーは動かないし、ちょっと多量に送ると半分以上欠落するし、頻繁にハングする。ボロボロでとても完成と言える状態ではない。V3から導入されたハードのエンドポイントバッファーに書き込む関数SIL_WRITE()が不調である。パケットサイズ一杯に送ると、データを半分以上落としてしまう。KB以上を一気に送ると、ハングしたり、データの欠落があり安定しない。それにしても、このVCOMのコードはV3になっても色々なところでたたかれているようだ。USB仮想UARTは動いた。これでやっと、VCOMの縛りから逃れられた。本筋のTFT液晶の工作に移らなければいけない。脱線ついでにSTM32でタイマーを実装(1/31/2012)と、意気込んでは見たものの、一向に工作の意欲が湧かない。CPU基板の上にのせる液晶、SDカードソケットなどを載せるサブ基板のレイアウトがなかなか気に入った構成にならない。モジュラージャックは、べたアースの基板を使いたいが、そうすると基板が三重になってみっともないしと、あれこれ迷っているだけである。相変わらず、また脱線してしまった。タイマーの実装である。経過時間を示す1ms単位のTickタイマーは、USBの新バージョンでsystickを使われてしまって動かなくなっている。今まで面倒なのでやってこなかったSTM32のタイマー実装に挑戦してみた。予想通りこれがどうして、手ごわかった。弁護士さんの書いた参考書「STM32マイコン徹底入門」は、このあたりが100ページ近くにわたって詳細に紹介されていて、なかなか役に立つが、それにしても設定パラメーターが恐ろしく多い。最初からやってられない。結局、自分でいちから書くのをやめ、ひとさまのソースを拝借して、0.5秒のタイマーを作った。ソースの丸写しである。LEDチカチカで成功を確認する。単純なオーバーフロー割り込みのタイマーだけで16行の定義である。いやあ、これは大変だ。それだけ機能が多いということなのだが、どうみても入門者には無理だ。動かしてみると、USB仮想UARTがタイマーで字化けする。本来あってはならない状態なのだが、理由がわからない。このあたりでその日の気力を使い果たした。何かの参考になるかと思い、コード例をお示しする。//上限値で割り込み許可;}これは設定だけで、このほかに割り込みハンドラーのコーディングがある(略)。オリジナルは、ここのページである。(TIM_PrescalerConfig()は不要でした。修正)ダブルバッファーにしてSTM32F107の仮想UART端末完動(2/4/2012)V3の仮想COMデモをベースにしたUART仮想モニターは動いたとはいえ、データは欠落するし、たまにハングし、まだ使い物にはならない。ソースがひどく読みにくかったので、リングバッファーを使った処理に殆どの部分を書き換え、見通しが良くなったのだが、どうにも安定しない。タイマーを入れて文字化けする問題は、タイマー割り込みが計算違いでマイクロ秒単位で起きていたことがわかり、1ms単位になるようにして解決したが、不安定なことは変わらない。ロジアナを持ち出して、本格的なデバッグ体制に入った。ヶをロジアナのプローブ点にして、各ルーチンの動きを探る。USBの資料も読み直して、ロジックを勉強しなおす。STM32のUSBライブラリは、V3でUSBホストにもなるOTG機能がついた。このためにUSB制御の階層がさらに増え、エンドポイントのバッファー操作が直接出来なくなっている。そのため、このV3のVCOMでは、データ送信のキックは、送信エンドポイント(USBにとってはIN方向)の書き込み後の割り込み(EP1_IN_Callback)ではなく、USBの定期的な割り込み、SOF割り込みで行われるようになっている。このため、マイコンの中での送信要求は、このSOF割り込みがms単位と長いので、実際にUSBを通してPC側に送られるデータが多量に溜め込まれて待たされることになる。片側がUARTならそう問題ないが、マイコンの中の送信要求は、べらぼうに早いので、これがハングやデータ欠落の原因になっているようだ。未送信のデータでバッファーが一杯になれば、マイコン側の送り込みを待たせ、そこからエンドポイントバッファーに書き込んでいくロジックになってはいるが、この多重処理をしているうちに、ハングアップしてしまうようだ。だいたい、この新しいSTマイクロのエンドポイント書き込み関数SIL_WRITE()は、パケットサイズの64バイトまでフルにデータを入れて、エンドポイントに立て続けに書き込むと、それだけで確実にフリーズする(半分くらいだと大体大丈夫)。下位ルーチンがバグを抱えているようだ。エンドポイントの処理中に入るハード割り込みを止めていないのでレジスターが壊されているのだろう。思い切って、このV3のやりかたを捨て、前に成功しているダブルバッファー方式に換えることにした。この方式は、ユーザーの送信要求をパケットサイズ単位で待たせることになるので、USB側に多くの負担をかけることがない。SOF割り込みは使わない。最初のキックは、前と同じように、片側のバッファーでダミーデータの空打ちをする。V1のコードを丸々、こちらに引き込む。大した作業量ではない。おお、フラッシュサイズも4KB以上小さくなった。