koheiのおもちゃ修理記録

宇部おもちゃ病院 毎月第2土曜日 13:00~16:00
宇部新天町の西の端、市民活動センターで開院してます。

5/31 マイコンボードいっぱい買った①~Nucleoボード動作確認

2020-05-31 | PIC・電子工作
外出自粛や各種会場の閉鎖で外でやる用事がガックリ減ってるけど、ぼけ~~~っとしてる暇はない!やりたいことがいっぱいあるw。
長年温めてる「やりたい事」があって、速度・メモリに余裕のあるマイコンボードを購入しようと検討。秋月でガッポリ買ってみましたw。

左から、NucleoのSTM32F411RE、同じくNucleoでSTM32F446RE。
右から2番目は、日本が誇る半導体メーカー:ルネサスエレクトロニクスのRX621マイコンボード、一番左が(オマケで)Seeeduino XIAO。

購入時現在の価格と各スペックは下記の通り。
①STM32F411RE:1,850円、Clock100MHz、Flash512KB、SRAM:128KB
②STM32F446RE:1,980円、Clock180MHz、Flash512KB、SRAM:128KB
③RX621マイコンボード:2,700円、Clock96MHz、Flash512KB、RAM(96KB)
④Seeeduino XIAO:580円、Clock48MHz、Flash256KB、SRAM:32KB

作りたいと思ってるものに対して、Arduinoは…、日本での情報も多いしちょっとした工作には大変便利なんだけど…ATMegaでクロックが8or16Mhz主体なので、ちょっと遅すぎる…。最近CPUがCortexに変わってスピードアップしつつある様だけど、まだバリエーションがあまり多くない感じ…。
以前に「LED工作第1弾(?)」として作った3×3×3 LED-Cubeで使ったルネサスのGR-SAKURAはなかなか良かったんだけど、どうももう売ってない…。
いろいろ探すと、①や②のNucleoというボードが、安くてスペック高そう。という事で、試し買いにF411と、本命でClock180MHzのF446を購入。
それから、GR-SAKURAの代りに、同じルネサスでスペックも近いRX621ボードを購入。
ついでに「このスペックでこの値段はお得じゃない?!」と、Seeeduino XIAOを買っといてみた。(ポートはあまりいらないけど速度やメモリが欲しいときに便利かも、と。)
(最近ちまたで大人気らしいRasberry Piも考えてみたんだけど、OS上で動く前提なので、厳密に時間を管理したいプログラムには向かないらしい。OSを外して「ベアメタルでラズパイ」という使い方もできるらしく、楽しそうでめっちゃ心そそられるけど、どうも統合環境なしでコンパイルしないといけなそうなので、初心者は手を出さない事にしましたw。)

とりあえずまず、Nucleoのボードの使い方を勉強してみるw。

秋月の商品ページでは「mbedで開発しなさい」と書いてある。(書いてない?)
「mbedとはなんぞや?」どうやら、Cortexを作ってるARMのボードもしくは開発環境の事らしい。mbedの使い方はいろんなサイトに書いてあるので、参考にしながらとりあえずオンライン版のmbedにユーザー登録して使ってみる。

Nucleoボードは、USBで繋ぐとUSBストレージとしてパソコンに認識される。サンプルプログラムを取ってきてコンパイルすると、(プログラム名).binのファイルができるので、それをどこかに保存してからエクスプローラでドラッグ&ドロップすると、あっという間に書き込み出来て、本体のLEDが点滅する。
(実際には、自宅にボードが到着する前にあーでもないこーでもないと悩んだのだけど、ボードが到着して繋いでみたら、あっという間だったw。)

さてこのボード、秋月のページには「(STM32F411)クロック:最大100MHz」と書いてある。ほんとに100MHzで動いてるのだろうか…。
サイトを探すと、「裏にシールが貼ってあって、C-01は内部クロックで動作、C-02はST-LINKからクロックを供給」(※Nucleoボードの上3分の1は、USBでの書き込み用にマイコンが1個乗ってて、その部分をST-LINKと言うらしい。)と書いてあったのだけど、買ったボードには「C-04」のシールが貼ってあって、クロックがどうなってるのかよく分からない…。
分からないなら調べるしかない。ネットであちこち探して調査する。

昨日一日散々悩んでうまくいかなかったけど、一晩寝てやり直してみるとスッキリ。概ね調査が終わりました。
「MCOピンにクロックが出力できる」との事で、出力させてオシロで確認。
CH1がHSI(内部クロック)、CH2がHSE(外部クロック)です。

外部クロックには8MHzが入ってるようです。(ST-LINKの水晶は8MHzが乗ってます。)
続いて、MCOの出力パラメータをRCC_MCO2SOURCE_HSE→RCC_MCO2SOURCE_SYSCLKに変更して、システムクロックを確認。(ちょっと早すぎるので、パラメータで4分周にして出力させる。)

オシロの値がだいぶ振れるけど、どうやら4分周で25MHz→システムクロック=100MHzで動作中らしい。

続いて、下記のプログラム:HALのGetOscConfigを使って、クロック周辺の設定を確認してみる。

RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_RCC_GetOscConfig(&RCC_OscInitStruct);

printf("System Clock = %d\r\n", HAL_RCC_GetSysClockFreq());
printf("OscillatorType : %d\r\n", RCC_OscInitStruct.OscillatorType);
printf("HSEState       : %d\r\n", RCC_OscInitStruct.HSEState);
printf("PLLState       : %d\r\n", RCC_OscInitStruct.PLL.PLLState);
printf("PLLSource      : %d\r\n", RCC_OscInitStruct.PLL.PLLSource);
printf("PLLM           : %d\r\n", RCC_OscInitStruct.PLL.PLLM);
printf("PLLN           : %d\r\n", RCC_OscInitStruct.PLL.PLLN);
printf("PLLP           : %d\r\n", RCC_OscInitStruct.PLL.PLLP);
printf("PLLQ           : %d\r\n", RCC_OscInitStruct.PLL.PLLQ);

printfの結果は…、TeraTermで受けれるのかな?出力画面はこうなる。

結局、cubeMX(後で説明)でのクロック設定は、

こうなって、結論としては、外部からのクロック入力は8Mhzで、CPUの動作クロック=HSE÷M×N÷P=8Mhz÷4×200÷4=100MHz という事になってるらしい。

続いて同様に、STM32F446の方のクロックも確認しておく。やはりHSEは8MHz。

4分周したシステムクロックは約45MHz。

システムクロックは書いてある通り180MHzで動作中の様子。
クロックの各設定は、

cubeMXで表現すると、

となって、結論としては、外部からのクロック入力は8Mhzで、CPUの動作クロック=HSE÷M×N÷P=8Mhz÷8×360÷2=180MHz という事になってるらしい。
(OscillatorType=15になってるのがちょっと気になる…。「15」は多分、「RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI」の合計と思われる。同時に設定した場合には優先順位があるのかな…。)
(「NucleoはPF0にオンボードのST-LinkからのMSOを入力すれば自動でクロック源をHSIからHSEに変えてくれる」と書いてあるページがあったので、OR取って全部指定していたら、HSEを優先してくれるのかもしれません。)

ということで、STM32F411もSTM32F446も、設定を変えなければ、多分ST-LINK側の水晶発振を使って、秋月の商品ページに書いてある最大周波数で動いてる事が確認できました。
(設定を変更しようとしたのだけど、mbedで作ったプログラムで変更できなかった…。やり方が悪いのか、後述のSW4STM32からなら変更できるのかまだ分からないけど、とりあえずは最高周波数で動かしたいので放置しておくw。)

ところで、オンライン版のmbedですが、関数とか定義済みの定数とかの定義が見れない…。

関数は、カーソルを合わせると説明の窓が出るけど、ドキュメントには飛べないし、定義のライブラリにも飛ばない。定数の説明も出ない…。
例えばMCOの設定に、「RCC_MCO2SOURCE_HSE以外の何があるんだろう?」という際には、定義に飛んでくれないと大変不便…。
mbedの方で調べたけど、どうにも分からない。オンライン版じゃなくてダウンロード版もあるらしいのでインストールしてみたけど、そちらはライブラリがリンクできずにコンパイル出来なかった…。
秋月のサイトには、Nucleoボードは「mbedでプログラム開発しなさい」と書いてある(書いてないw?)のだけど、あちこち調べると「cubeMX+SW4STM32で開発しよう!」と書いてあるサイトがあったので、参考にさせて貰いながら入れてみました。

「cubeMX」は、Nucleoのボードに使われているSTM32F4を製造しているSTMicroelectronics社のソフトで、サイトの説明によると「STM32マイクロコントローラの設定を簡略化し、対応する初期化用Cコードを段階を追って生成できるグラフィカル・ツール」との事で、プログラム本体を作る前にポートやクロック等の面倒な設定の部分を作ってくれるソフトらしい。
「SW4STM32」は、フルネームは「System Workbench for STM32」で、同じくSTMicroelectronics社のソフトで、つまり自社製のSTM32プログラム開発用の統合環境の様である。

オンライン版のmbedで定義が参照できなくて困ったけど、SW4STM32ならctrl押しながら語句をクリックすると定義に飛んでくれたので、上記のクロック設定の確認とかは、SW4STM32とオンラインmbedとをいったりきたりして作りました。
まだ全部は理解できてないけど、とりあえずオンラインmbedの方がarduinoライクに簡単にプログラムが書けそうだけど、もっと詳細な設定をしていきたければ、cubeMXで設定作ってmbedに必要な部分だけコピペするか、「cubeMX+SW4STM32」で作った方がいい、といったところかな~?

画面のコピーばっかりになったので、作業もしてるんだよ、という写真も載せておきますw。

上のmbedの画面コピーの下の方にこっそり書いてあるプログラムで、PA0に繋いだLEDの「Lチカ」をしてる所です。(基板のLEDを点けるだけじゃ、ほんとに言う事聞いてくれてるかどうか実感が無いのでw。)

参考にさせて頂いたサイトを記載しておきます。(それぞれお断りしてませんが、リンクご了承くださいw。)
SW4STM32とCubeMXを用いてNucleo開発環境を整える:CubeMXとSW4STM32のインストール手順と使い方を手取り足取り書いてくれているページ。初心者には大変助かりましたw。
電子工作専科のぐうたラボ「NucleoのClock (2)」:MCOの設定がしっかり書いてある。そのままコピーさせて頂いて使いましたw。
STMのGPIOはどうなってるのか(LEDをつける):GPIOレジスタの直接操作方法を一から説明してくれてるページ。実行サイクルの厳しいプログラムを作ろうと思ったら必須かな。

ところで、上のGPIOの使い方を説明してくれてるサイトにも書いてありますが、普通のマイコン(PICとか)は、ポートは方向指定をしてあげるぐらいで使えると思うのですが、STM32は、まずポートに電源を供給してやらないといけないらしい。それは「ペリフェラルにクロック供給」という仕組みとの事。そしてそのクロックは、cubeMXで見てみると、CPUの方を最大クロックで使用していると、最高でもCPUクロックの半分の周波数までしか供給できないみたい。
ゴソゴソやってる時に、GPIOを直接H-Lとした時に、オシロでHが拾えずにだいぶ悩んだ。DegitalWrite等を使わずに1サイクルでGPIOをH-Lとすると、CPUのクロックにGPIOがついてきてないのかもしれない。時間に厳密なプログラムを書くときには、ちょっと意識しないといけないかも、と思いました。

さて、次はRX621マイコンボードの使い方だな~w。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 5/16 自動車用フラッシ... | トップ | 6/5 マイコンボードいっ... »

コメントを投稿