CCWO Embedded Space

CCWOの日々の開発を発信するブログ

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の記事