BM20を制御するためのボードを組み立てました。今回使用するのはBM20と一緒に購入しておいたNUCLEO-L452です。手持ちのNUCLEO-L476でも良かったのですが、Crystalress USBをためしてみたいというだけの理由で購入。
これまではジャンパでBM20基板をつなげていたのですが、EEPRM書き換えの時にはFTDIに常げ、プログラム動作の時にはSTM32にジャンパし直すという作業が面倒なので、基板を組むことにしました。STM32への接続がピンコネクタに刺すだけで済むので、かなり作業が楽になりました。コネクタの向きの都合上、BM20基板が裏向きになってしまいましたけど。
実際にBM20基板をつなげて動作を確認していたら、クロック源としてMSIを選択するとちゃんと動くのに、HSIを使うと送受信ができないというトラブルに遭遇。単純にクロック源の選択を変更するだけで動かなくなってしまうので、原因はクロックにあるとしか思えません。TIM15のタイマキャプチャを使ってLSEの周期を測定することでHSIの周波数を逆算してみると、16MHzで発振すべきところが13.8MHz程度になっていることが判明。コードを確認してもおかしなところは見つからないので、STM32 Forumでサーチしてみると「同じお悩み」が見つかりました。
CubeMXが吐いたコードが間違っているという良くあるバグなのですが、この問題のタチが悪いのはRMの解説の記述も間違っているという点です。マニュアルで説明されているHSIのキャリブレーションのディフォルト値がもともと間違った値なので、CubeMXが生成したコードを読んでも正しいコードのようにしか見えないのです。毎度のことですがCubeMX使って新しいプロジェクト起こすと、必ずバグに当たるんですよねー。
これまではジャンパでBM20基板をつなげていたのですが、EEPRM書き換えの時にはFTDIに常げ、プログラム動作の時にはSTM32にジャンパし直すという作業が面倒なので、基板を組むことにしました。STM32への接続がピンコネクタに刺すだけで済むので、かなり作業が楽になりました。コネクタの向きの都合上、BM20基板が裏向きになってしまいましたけど。
実際にBM20基板をつなげて動作を確認していたら、クロック源としてMSIを選択するとちゃんと動くのに、HSIを使うと送受信ができないというトラブルに遭遇。単純にクロック源の選択を変更するだけで動かなくなってしまうので、原因はクロックにあるとしか思えません。TIM15のタイマキャプチャを使ってLSEの周期を測定することでHSIの周波数を逆算してみると、16MHzで発振すべきところが13.8MHz程度になっていることが判明。コードを確認してもおかしなところは見つからないので、STM32 Forumでサーチしてみると「同じお悩み」が見つかりました。
CubeMXが吐いたコードが間違っているという良くあるバグなのですが、この問題のタチが悪いのはRMの解説の記述も間違っているという点です。マニュアルで説明されているHSIのキャリブレーションのディフォルト値がもともと間違った値なので、CubeMXが生成したコードを読んでも正しいコードのようにしか見えないのです。毎度のことですがCubeMX使って新しいプロジェクト起こすと、必ずバグに当たるんですよねー。