苦行記録

有益な情報は特にありません.

RX631で適当にするクロック設定

はじめに

タイトルにもあるように"適当"な記事です。自身がハマった箇所等を説明しながら、最低限で動く設定しか記載しません。というか、RXマイコンに関して(も)よく分かっていないことが多く、難しいことは書けません。恐らく無駄にレジスタに書き込んでいたりするので、適当に参考にしてください。

 

開発環境

・CS+ for CC V6.00.00 - 統合開発環境

・Renesas Flash Programmer V3.03 - 書き込みツール


 
プログラム

SYSTEM.PRCR.WORD = 0xA503;    //プロテクト解除
SYSTEM.MOSCCR.BIT.MOSTP = 1;   //メインクロック停止
SYSTEM.SOSCCR.BIT.SOSTP = 1;   //サブクロック停止
SYSTEM.PLLCR2.BIT.PLLEN = 1;   //PLL停止
SYSTEM.PLLCR.WORD = 0x0f00;    //PLL入力分周比:1分周(=12.5MHz)
                   //周波数逓倍率:16倍(=200MHz)
SYSTEM.PLLCR2.BIT.PLLEN = 0;   //PLL動作
SYSTEM.MOSCCR.BIT.MOSTP = 0;   //メインクロック動作
SYSTEM.SCKCR.LONG = 0x21C11211;  //PCLKB:4分周(=50MHz)
                   //PCLKA:2分周(=100MHz)
                   //SDCLK端子出力停止
                   //BLCK端子出力停止
                   //ICLK:2分周(=100MHz)
                   //FCLK:4分周(=50MHz)
SYSTEM.SCKCR2.BIT.IEBCK = 2;   //IECLK:4分周(=50MHz)
SYSTEM.SCKCR2.BIT.IEBCK = 1;   //USB未使用設定
SYSTEM.SCKCR3.BIT.CKSEL = 4;   //クロックソース選択:PLL
SYSTEM.PRCR.WORD = 0xA500;    //プロテクト



解説

SYSTEM.PRCR.WORD = 0xA503;    //プロテクト解除
SYSTEM.MOSCCR.BIT.MOSTP = 1;   //メインクロック停止
SYSTEM.SOSCCR.BIT.SOSTP = 1;   //サブクロック停止
SYSTEM.PLLCR2.BIT.PLLEN = 1;   //PLL停止

まず、レジスタライトプロテクション機能というのがRX631にはあり、プロテクトレジスタ(PRCR)のPRC0とPRC1を「1:書き込み許可」に設定することでプロテクトが該当するレジスタに書き込みできます。その後、メインクロックとサブクロックとPLLを停止します。

SYSTEM.PLLCR.WORD = 0x0f00;    //PLL入力分周比:1分周(=12.5MHz)
                   //周波数逓倍率:16倍(=200MHz)

ここの値は外部クロックによって変わるかもしれません。自分は12.5MHzのセラロックXTAL-EXTAL間に接続し、外部クロックとしています。PLLコントロールレジスタ(PLLCR)で分周比と逓倍(ていばい)率を決めるのですが、CPUの動作周波数が100MHzだし逓倍も8倍の100MHzで十分なのでは?と思う方もいるかもしれません。いや、ちょっと待ってください。PLLを動作させたあとに、システムクロックコントロールレジスタ(SCKCR)で周辺モジュール等に分周し供給するクロックを決めるのですが、RX631のユーザーズマニュアルのSCKCRの注意書きを見てください。
f:id:nout:20170922023647j:plain
「PLL選択時は1分周は設定禁止」と、さらっと重要なことが書かれてあります。キレそう。つまり、周辺モジュール等に分周する際、最低でも2分周させないと動作してくれません。なので、200MHzに逓倍してから分周し100MHzや50MHzを作ります。

SYSTEM.PLLCR2.BIT.PLLEN = 0;   //PLL動作
SYSTEM.MOSCCR.BIT.MOSTP = 0;   //メインクロック動作

PLLとメインクロックを動作させます。

SYSTEM.SCKCR.LONG = 0x21C11211;  //PCLKB:4分周(=50MHz)
                   //PCLKA:2分周(=100MHz)
                   //SDCLK端子出力停止
                   //BLCK端子出力停止
                   //ICLK:2分周(=100MHz)
                   //FCLK:4分周(=50MHz)
SYSTEM.SCKCR2.BIT.IEBCK = 2;   //IECLK:4分周(=50MHz)
SYSTEM.SCKCR2.BIT.IEBCK = 1;   //USB未使用設定
SYSTEM.SCKCR3.BIT.CKSEL = 4;   //クロックソース選択:PLL
SYSTEM.PRCR.WORD = 0xA500;    //プロテクト

ここでPLLからクロックを分周し、周辺モジュール等に供給する設定をします。クロック発生回路の概要にある動作周波数を参考に分周比を決定します。
f:id:nout:20170922024725j:plain
システムクロックコントロールレジスタ2(SCKCR2)も同様にクロックを設定します。システムクロックコントロールレジスタ3(SCKCR3)ではクロックソース選択ビット(CKSEL)でPLL回路を選択してください。その後、プロテクトレジスタ(PRCR)を書き込み禁止に設定します。

クロックが安定するまでのウェイトについてですが、設定しなくても動きます。(経験則)



RX631に書き込めない・・・
ここからクロック設定とは関係ない話です。自分はどうしても書き込めない以前にRenesas Flash Programmerと接続ができずに苦しみました。PC7はプルダウンされてるし...MDはGNDと繋がってるし...オシロで見る限り、セラロックも発振して、リセット回路も機能してる...半田付け不良かと思って何度もRX631の足にコテを当てて...それでも接続できなく、数日悩みました。そして、最後は電源を疑いました。ずっと使ってたのが貧弱な電源だったので、試しにパソコンからArduin○→中華昇圧モジュール(6V程度)→マウスって電源供給したら難なく接続できました。いやそもそもLiPo繋げろよって話なんですが。
RX631に書き込めない・RFPに接続できない方は電源を疑ってみるといいかもしれません。