クロック設定

# はじめに

クロックの設定についての記述．マイコンボードはGR-CITRUSとする．ハードウェアマニュアルの参考先はHM ＊.＊.＊と表記する（例：HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考）．

資料（必需品）
・ [RX63Nグループ、RX631グループ ユーザーズマニュアル](https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/R5F563.pdf)
・ [GR-CITRUS回路図](https://www.renesas.com/jp/ja/doc/gr/gr-citrus/citrus-1.0.pdf)

# クロック

マイコンは，クロック信号にあわせて動作する．外部にある発振回路からのクロック信号を取得して各クロック信号を生成する．クロック設定が滅茶苦茶だと通信やタイマー系統が死滅する．

# クロック設定

### クロック割りふり
GR-CITRUSは，[外部発振が12MHzである](https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-citrus.html#map)．この発振器からの周波数をPLL回路で逓倍する（周波数をあげる）．これを各クロックに分周して（周波数を落として）割り当てる．注意事項としては，PLLを使う場合はICLKは1分周が禁止されていることが挙げられる（HM 9.2.1）．各クロックの上限はHM 9.1 表9.1に記載されている．

USBを使いたい場合は，逓倍や分周した時に48MHzを選択できるような外部発振を選ぶ必要がある．発信子の接続は，HM 9.3 に記載されているが，マイコンボードでは予め接続されているので気にしなくてよい．

![clock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/c5a37a66-0944-a9ed-3603-37c113d5e771.png)


### 初期化関数
流れ
1. プロテクト解除
2. クロックとPLLの停止
3. PLL設定
4. PLLとメインクロックの動作開始
5. システムクロックの設定
6. プロテクト

```c:"hwsetup.c"
extern void HardwareSetup(void);
void Clock_init(void);

void HardwareSetup(void)
{
	Clock_init();
}
```

```
/*=================================
 * 関数名 : Clock_init
 * 機能 : クロックの初期化
 * 引数 : なし
 * 戻り値 : なし
 * 備考 :
 * ===============================*/
void Clock_init(void)
{
	/*=== プロテクト解除 ===*/
	SYSTEM.PRCR.WORD = 0xA503;
	/*=== メインクロック停止 ===*/
	SYSTEM.MOSCCR.BIT.MOSTP = 1;
	/*=== サブクロック停止 ===*/
	SYSTEM.SOSCCR.BIT.SOSTP = 1;
	/*=== PLL停止 ===*/
	SYSTEM.PLLCR2.BIT.PLLEN = 1;
	/*=== PLL設定 ===*/
	SYSTEM.PLLCR.WORD = 0x0F00;
	/*=== PLL動作 ===*/
	SYSTEM.PLLCR2.BIT.PLLEN = 0;
	/*=== メインクロック動作 ===*/
	SYSTEM.MOSCCR.BIT.MOSTP = 0;
	/*=== システムクロック設定 ====
	 * PCLKB（周辺モジュールクロック）:48MHz
	 * PCLKA:96MHz
	 * SDCLK:停止
	 * BCLK:停止
	 * ICLK（システムクロック）:96MHz
	 * FCLK:48MHz
	 *
	 * IECLK:48MHz
	 * UCK(USBクロック):48MHz
	 *
	 * クロックソース選択:PLL
	 * =====================*/
	SYSTEM.SCKCR.LONG = 0x21C61211;
	SYSTEM.SCKCR2.WORD = 0x0032;
	SYSTEM.SCKCR3.BIT.CKSEL = 4;
	/*=== プロテクト ===*/
	SYSTEM.PRCR.WORD = 0xA500;
}
```

### 詳細

##### 1. プロテクト解除

```
SYSTEM.PRCR.WORD = 0xA503;
```

HM 13.1.1より，保護するレジスタへの書き込み許可を選択する．`PRCR`は16bit構成で以下のような内容である．`WORD`で一括で設定している．
b0 > 1 :クロック発生回路関連レジスタへの書き込み許可
b1 > 1 :動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可
b2 > 0 :予約ビット
b3 > 0 :LVD関連レジスタへの書き込み禁止
b7-4 > 0 :予約ビット
b15-8 > A5 : PRCキーコードビット 

##### 2. クロックとPLLの停止

```
SYSTEM.MOSCCR.BIT.MOSTP = 1;
```

HM 9.2.8 より，メインクロック発振器を停止する．


```
SYSTEM.SOSCCR.BIT.SOSTP = 1;
```

HM 9.2.7 より，サブクロック発振器を停止する．

```
SYSTEM.PLLCR2.BIT.PLLEN = 1;
```

HM 9.2.7 より，PLL を停止する．

##### 3. PLL設定

```
SYSTEM.PLLCR.WORD = 0x1700;
```

HM 13.1.1より，PLLの設定をする．`PLLCR`は16bit構成で以下のような内容である．`WORD`で一括で設定している．
b0-1 > 00 :PLL のクロックソースの入力分周比を1分周に設定．
b7-2 > 0 :予約ビット
b13-8 > 001111 :PLL の周波数逓倍率を16逓倍に設定．
b15-14 > 0 :予約ビット

##### 4. PLLとメインクロックの動作開始

```
SYSTEM.MOSCCR.BIT.MOSTP = 0;
```

HM 9.2.8 より，メインクロック発振器を動作する．

```
SYSTEM.PLLCR2.BIT.PLLEN = 0;
```

HM 9.2.7 より，PLL を動作する．

##### 5. システムクロックの設定

```
SYSTEM.SCKCR.LONG = 0x21C61211;
```

HM 9.2.1より，クロック設定をする．`SCKCR`は32bit構成で以下のような内容である．`LONG`で一括で設定している．
b0-3 > 0001 :予約ビット
b7-4 > 0001 :予約ビット
b11-8 > 0010 :周辺モジュールクロックB（PCLKB）4分周
b15-12 > 0001 :周辺モジュールクロックA（PCLKA）2分周
b19-16 > 0110 :外部バスクロック（BCLK）停止する場合は適当な値をいれる
b21-20 > 0 :予約ビット 
b22 > 1 :SDCLK端子出力停止
b23 > 1 :BCLK端子出力停止
b27-24 > 0001 :システムクロック（ICLK）2分周
b31-28 > 0010 :FlashIFクロック（FCLK）4分周

```
SYSTEM.SCKCR2.WORD = 0x0032;
```

HM 9.2.2より，クロック設定をする．`SCKCR2`は16bit構成で以下のような内容である．`WORD`で一括で設定している．
b0-3 > 0010 :IEBUSクロック 4分周
b7-4 > 0011 :USBクロック 4分周 ＊使わない場会うは0001
b15-8 > 0 :予約ビット

```
SYSTEM.SCKCR3.BIT.CKSEL = 4;
```

HM 9.2.3より，クロック設定をする．`SCKCR3`は16bit構成で以下のような内容である．`WORD`で一括で設定している．
b7-0 > 0 :予約ビット
b10-8 > 100 :クロックソースをPLLに選択
b15-11 > 0 :予約ビット

##### 6. プロテクト

```
SYSTEM.PRCR.WORD = 0xA500;
```
HM 13.1.1より，保護するレジスタへの書き込み許可を選択する．`PRCR`は16bit構成で以下のような内容である．`WORD`で一括で設定している．
b0 > 0 :クロック発生回路関連レジスタへの書き込み禁止
b1 > 0 :動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み禁止
b2 > 0 :予約ビット
b3 > 0 :LVD関連レジスタへの書き込み禁止
b7-4 > 0 :予約ビット
b15-8 > A5 : PRCキーコードビット 

# 参考文献

- RX631で適当にするクロック設定 - 苦行記録 http://nout.hatenadiary.jp/entry/2017/09/22/031638
- マイコンの周辺回路 https://www.renesas.com/jp/ja/support/technical-resources/engineer-school/mcu-02-peripheral-circuitry.html