Nucleo SPI CLK
Nucleo(F411RE)のSPIクロックが想定通りにならなかった。2MHzで1.5MHzs、1.5MHzで750KHz・・・。半分というとそうでもない。。。
コミュニティーで答えをもらったのだが、結論としては、データシートをよく読みなさいということだと思われます。mbedで遊んでいると、ターゲットを変えるだけで普通に動いてhしまうため、そこがどうしても、気づかなくなってしまう。それに、KL25の時はあまり気にせずほとんどがその通りに動いていた。(実際、今回の件もあり確認したが細かく設定できる)
printf(“SystemClock=%d[Hz]\r\n”, SystemCoreClock);
クロック出力できるとのことでmNucleo-F411では内蔵発振、外部水晶時ともに、96MHzと出力される。
Nuleo-F411では、SPIクロックソースは内部クロックの分周を利用するがその設定が3ビットしかないとのことである。データシート
Nucleo 今度は外部クロック
今度は外部クロックでハマった。こっちのブックに記載。
mbed-osのなかで、内部クロックが有効にされているため外部振動子を実装しても外部クロックに切り替わってくれないということのように思う。
最初に参考にしたページ
https://os.mbed.com/questions/79122/Nucleo-F303K8MSO/
Nucleo クロックソース
Nucleoの水晶振動子
Nucleo基板(F411RE)には、水晶振動子が二つあり、そのうち32.768KHz(X2)は実装されている。mbedのTickerで時間を刻むと、少し短めになった。1msに対して985usあたり、1~2%の誤差であり、これはセンシング精度としては大きい。会社業務で使用していたため、問題があった。回路図を見ると、X3は8MHzであるが実装されてない。NucleoのDocumenntには、実装すれば自動で切り替わると書いてある。Target基板を作った際、実装できるようにしてあったので、X3を実装したもののTickerの時間精度が上がらず(変わらず)外部クロックが機能していないようだった。
オシロスコープで発振子の振動波形を見たところ、まったく振動していない。しかも、X2もまったく振動していなかった。mbedの中で外部クロックが有効とされずに内部クロックで動いているように思えた。
target.json の中の"STM32F4"に、"clock-source"の記述でHSIを使うようになっていたので、記述をまねして、下記のようにプロジェクトの中のmbed_app.jsonに記述する。
USBSerialの送信
mbed-os5のUSBSerialはボーレート設定も要らず、パソコン側のOS標準ドライバで動作するようでTargetマイコンを変えても常にポート番号が同じで使いやすい。しかしprintfが遅い
mbed-os5のAPIにあるUSBSerialでprintfを使うと1バイトごとパケットに乗せられる。1ms間隔でデータを送信したかったが、間隔が1msではなかったという結果があり、気づいた。下記コードで確認してみた。USBデコードできるオシロで確認すると1byte=1packetで送信されていた。
mbed-os5 USBSerial
エキスパートには当たり前だったかもしれないのだが、私は知らなかった。
mbed-os5のAPIにあるUSBSerialでは、printfの送信で1バイトごとパケットに乗せられる。1ms間隔でデータを送信したかったが、間隔が1msではなかったという結果があり、気づいた。下記コードで確認してみた。
mbed-os5でUSBSerial
os2からos5へ変えていきなさいということを言われているらしいので、数週間ずっとチャレンジしていました。
直近でやりたかったことは、Keil Studio Cloudのos2では実現できていたので、これをos5に移行する試みだった。os5はmbed-os-example-blinky5を作って、LEDの点滅動作ができていることを確認してのち、USBSerialを追加するもの。
変数参照が最適化される
os2からos5へ変更する際に、どうもTickerがうまく動かなかった。
Ticker tbase;
DigitalOut led(LED1);
volatile int tb_reach=0;
void tbase_t(void){
tb_reach=0;
}
int main(){
tbase.attach( callback(tbase_t) , 0.5 ) ;
while (true) {
led = !led;
// thread_sleep_for(500);
while( tb_reach );
tb_reach = 1;
}
}
mbed-os5-example-blinkyのthread_sleep_for()をTickerに変えるだけだから、動いて当然、と思ってたのに while( tb_reach ); のところからぬけてくれないみたいな動きになった。
mbed困っております2
前記事では、mbedビルドが違うことでUSBDeviceをインポートしたのちBuildエラーになることを書いたが、mbed.bldにビルドURLを書いてやれば、ビルドコンパイルができるようになる。
mbedビルド
https://os.mbed.com/users/mbed_official/code/mbed/builds
各ビルドをクリックすると、そのURLに飛ぶのだが、buildsの前にスラッシュが余計に入り、error表示が出る
https://os.mbed.com/users/mbed_official/code/mbed//builds/65be27845400/
ダブっているスラッシュを削除してアクセスすれば表示され、そのURLをmbed.bldに貼り付ければ、そのURLでビルドされるようだ。
mbed困っております
mbedオンラインコンパイラがなくなるため、段階的にKeilStudioで作業するように変えていってますが、「ほとんど動かない」。というか、うごくんだけど、いろんなエラーが出て気持ち悪い。何をやってもすっきりしない状態が続いている。
やりたいことは、Nucleo-F411にUSBの配線を施し仮想シリアルを動かしたいのである。テストは下記
OS2からOS5へ変更する
公式はここ
https://developer.arm.com/documentation/102497/1-5/Manage-an-Mbed-proje…
プロジェクトの中のmbed.bldとmbed(ライブラリ)を削除し、mbedライブラリを追加する(場所:https://github.com/ARMmbed/mbed-os)