kaedeです。前回の記事でテスト基板を使ってLEDを点灯させるところまで紹介しました。
今回はクロックとタイマーを設定して、LEDを一定周期で点滅させるところまで紹介します。
マイコン周辺回路
周辺回路や書き込みの方法は前回の記事と同様なので、詳細は省略します。今回使用するために外部クロックをPin48に接続してあります。
クロックの設定
まずはクロックの設定をしていきます。
SAMマイコンは内蔵クロック、外部クロック(0, 1)からクロックソースを選択することができるようになっています。内蔵クロックは精度が悪いのでテスト基板では外部クロックを接続しています。
MPLAB Harmony 3 Configuratorでは、クロックもGUIから設定できるようになっています。前回同様、MPLAB X IDEを開いたあとに、Tools->Embedded>MPLAB Harmony 3 Configuratorを開きます。
Tools->Clock Configurationを選択することで以下のようなクロック設定画面が表示されます。
作成したテスト基板では外部クロックソース0に48MHzのMEMS振動子を接続してあります。
左上のブロックXOSC_CTRL0において、XINを48MHzにし、Crystal Oscillatorにチェックを入れ、MUXでEXTERNAL_CLOCKを選択します。この設定でXOSC0に外部クロックを基準にした48MHzが設定されます。
今までは、DFLL(Digital Frequency Lock Loop)を元にメインクロックが設定されていましたがXOSC0を元に設定するように変更していきます。
- メインクロックの設定
- FDPLLの入力をXOSC0に設定し、DPLL Dividerを11に設定しました。PLLの入力は最大が2MHzとなっているようで、それ以上の入力の場合は赤文字でエラー表示されるので適切に1/24しています。
- PLLではCPUのメインクロックが最大の120MHzとなるように設定しました。AutoCalculateで目標を120MHzにし、適切な入力ソースを選択することで自動計算もしてくれます。
- あとはGCLK Generator 0の入力がFDPLL0になっていることを確認し、その後のDivision Factorがすべて1であればメインクロックも120MHzとなります。
- ペリフェラルクロックの設定
- 今回は特に使用しませんが、GCLK Generator 1の入力もXOSC0として、ペリフェラルクロックでGCLK1を選択することで48MHzを供給できるようにしておきました。
ここまででクロックの設定は完了です。
Harmony ConfiguratorのClockの項目を見ると先ほどGUIで設定した値に合わせて変更されているのがわかります。
また、今回はこのブログを参考にSystickを使ったLチカをしようと思うので、Systickの有効化のチェックを入れました。クロックソースはメインクロックにしてあります。
ここまででGUIを使った設定は終了です。
続いてコードを書いていきます
Systickを使ったLチカ
今回はSystickを使ってLチカをしていこうと思うので、それに対応したコードを書いていきます。
SystickはArm Cortex-M4に共通の機能なので詳細はArmのドキュメントに記載されています。
SystickはカウントダウンタイマでReload Valueからカウントダウンされていき、0になると再びReload Valueに戻ります。今回はメインクロックが120MHzなのでReload Valueを120000-1にすることで1msに1回、値が1周するようにしました。また、COUNTFLAGレジスタを見ることで前回から間に値が0になることがあったかを確認できます。
Reload Valueが0になるたびにtimeをカウントアップし、500(ms)になるたびにLEDをtoggleしています。そのため、1s周期でLEDが点滅することになります。
SysTick->LOAD = 120000 - 1; SysTick->VAL = 0; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; uint32_t time = 0; LED0_Set(); LED1_Set(); LED2_Set(); while ( true ) { /* Maintain state machines of all polled MPLAB Harmony modules. */ SYS_Tasks ( ); if(SysTick->VAL != 0 && SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) { time++; } if(time > 500) { LED0_Toggle(); LED1_Toggle(); LED2_Toggle(); time = 0; } }
このコードを前回までと同様に書き込むことでLチカをさせることができました。
おわりに
今回の記事はここまでです。
MPLAB Harmony 3 Configuratorを使うことでGUIから簡単にクロックを設定することができました。
次回はデバッグしやすいようにUARTなどの設定について書いていきたいなと思います。