SNSへはこちら

Longan NanoでRISC-Vチャレンジ(5) - クロックシステムの理解

久しぶりの Longan Nano ネタです。というのも、電車内で色々と進捗を出そうとシコシコプログラム、書き込みを行っていたのですが、なんと失くしてしまったという事があったからです。
しかも失くしたタイミングが非常に悪く、中国の国慶節に重なってしまったのです。1週間以上国民は祝日を享受するため、マイコンボードの製造ラインは停止、そしてあっという間に日本国内の Longan Nano の在庫がなくなってしまったのでした。

数日前に Seeed から DHL で注文したものがやっと届いたのですが、失くしてから大体1ヶ月は経っています。つらかった。

さて

閑話休題。今回は非常に地味ですが、Longan Nano のクロックシステムをざっくりと理解したいと思います。
これは後にタイマ割り込みを入れることを考えているのですが、その時に中途半端な理解だとハマりそうだからです(というか、実際にさっきまでハマってました)。

本記事で載せる画像はすべて Longan Nano のボードに載っているコア、GD32VF103 のユーザーマニュアルから引っ張ってきています。

RCU(Reset and Control Unit)

RCU はシステムを含めた回路ブロックへのクロック供給および電源管理を担っています。STM32 で言ったら RCC に相当します。
その中でも、クロックについて見ていきます。

クロックのダイアグラム

クロックがどう接続されているかを一部強調して示したダイアグラムが以下となります。

赤が外部クロック、青が内部 8MHz の RC オシレータ、緑が Timer0 のペリフェラルクロックです。内部オシレータは大事。だってクロック付けるの面倒だもん。
今回はマイコンボード上にクリスタルが載っていますので、赤い矢印をたどっていけば十分ですが。

どれどれ、どうやら概ねのペリフェラルブロックで最大周波数は 108MHz のようです。ということなので、やっぱり 108MHz の設定をしたいよね となります。
でも、きちんと _init() 関数を実行するように start.s で処理を追加しておけば、実は自動的に 108MHz になります。というか、そうする設定が内部 SystemInit() で実行されるようになります。

108MHzになるように設定するには(8MHz 外部クロック)

上の計算はそれはそれとして、SystemInit 時にこの設定が行われるようにする方法を掲載します。
1. start.s を改造する
1. Makefile 等で、アセンブル時に -DHXTAL_VALUE=8000000 オプションを追加する

108MHzになるように設定するには(内部クロック)

  1. start.s を改造する
  2. system_gd32vf103.c で61行目付近の #define __SYSTEM_CLOCK_108M_PLL_HXTAL をコメントアウト
  3. 同ファイル //#define __SYSTEM_CLOCK_108M_PLL_IRC8M のコメントアウトを外す

いずれも、TIMER0 のタイマクロック(カウントに用いられる)には 108MHz が入力されていることを確認してください。
では、次のタイマ割り込みに続きます。