Renesas RX631 クロック
ここではクロックの設定をしていきます。
ただ、RX631のクロック設定は非常に難しく、Renesas公式HPにて公開されている「RXショートセミナー」という資料を参考に、クロック設定を行いたいと思います。
といっても、参考資料を少し改変したものなります。
hardware_setup.cにClock_initialize関数を作ります。
#include "iodefine.h" #include "machine.h" void Clock_initialize(void); void HardwareSetup(void) { Clock_initialize(); } void Clock_initialize(void){ int i; SYSTEM.PRCR.WORD = 0xA503; // Release protect SYSTEM.MOSCWTCR.BYTE = 0x0D; // 131072cyc wait stability term // Enable main clock SYSTEM.MOSCCR.BYTE = 0x00; while(SYSTEM.MOSCCR.BYTE == 0x01); SYSTEM.PLLCR.WORD = 0x0F00; // 12Mhz/1*16=192Mhz SYSTEM.PLLCR2.BYTE = 0x00; // Wake up PLL circuit SYSTEM.PLLWTCR.BYTE = 0x0E; // 2097152cyc wait stability term for( i = 0; i <636; i++ ) nop(); // wait 22.1053ms 22.1053ms*143.75khz(LOCO)/5cyc=636 nop()=5cyc // FCLK :192/4=48Mhz // ICLK: 192/2=96Mhz // BCLK: 192/64=3Mhz & disable // PCLKA: 192/2=96Mhz // PCLKB: 192/4=48Mhz // IECLK: 192/4=48Mhz // UCLK: 192/4=48Mhz // Enable PLL circuit SYSTEM.SCKCR.LONG = 0x21C61211; SYSTEM.SCKCR2.WORD = 0x0032; SYSTEM.SCKCR3.WORD = 0x0400; // Stop Unused Clock Source SYSTEM.LOCOCR.BYTE = 0x01; // Stop LOCO SYSTEM.SOSCCR.BYTE = 0x01; // Stop sub clock source while( SYSTEM.SOSCCR.BYTE != 0x01) // wait writing ; RTC.RCR3.BYTE = 0x0C; // Disable clock in while( RTC.RCR3.BYTE != 0x0C ) // wait writing ; SYSTEM.PRCR.WORD = 0xA500; // Protect }
ここで、machine.hはClock_initialize関数内のnop関数を呼ぶために必要なヘッダファイルです。
nop関数は1clockを使った空命令になります。
また、サブクロックは停止させています。
- FCLK :192/4=48Mhz
- ICLK: 192/2=96Mhz
- BCLK: 192/64=3Mhz & disable
- PCLKA: 192/2=96Mhz
- PCLKB: 192/4=48Mhz
- IECLK: 192/4=48Mhz
- UCLK: 192/4=48Mhz
12MHzの水晶発振子をメインクロックに入力し、周辺モジュールを上記クロックでクロック設定しました。
クロック設定はこれで完了です。RX621に比べ非常にややこしなくなっており、現状自分で書くのは不可能だったので、資料を参考にしました。
20160818の記事