v850e2/px4 クロック供給に関して

v850e2/px4で、周辺機能の制御レジスタへ書き込みを行う場合、その周辺機能へのクロック供給を有効にしておかないと値は反映されないのでしょうか?
Parents
  • こんにちは、NAKAといいます。

    一般的には、周辺機能へクロック供給してやらないと、機能しないので供給しておけば良いような気がします。制御レジスタだけを設定しなければならない理由があるのでしょうか?僕はクロック供給を先にしておき、周辺機能の初期設定をしますが、それで気になったことはありません。消費電力などに気を使う特殊な使い方なのかなぁ~?

    P.S.

    最近ぼくも、V850E2FG4-Lを触ってますが、UMが読みにくいですね!V850は今までGreenHillsのMulti環境で、今までの資産を使っていたのでよかったのですが、CubeSute+でゼロからプロジェクトを作っていくと結構大変ですね!..涙)

  • こんにちは、NAKAです。

    笑ってやってください!クロックの設定をスタートアップでアセンブラで記載すればシンプルになるのかもしれませんが、よくわからなかったのでCで書いたらこんなことになってしまいました!!  あぁ!死にそう!

    /*******************************************************************************

    // 関数名 : fn_Init_Clock(void)

    // 動作 : システムクロックの初期化

    // 引数 :

    // 作成 : NAKA 14.03.19

    // 備考 : Xtal=20MHz

    // ****************************************************************************/

    void fn_Init_Clock(void)

    {

    MOSCC = 0x00000004; //SHTSTBY:1⇒安定時間短縮に設定

       //メインオシレータ起動

    MOSCST = 0x000F; //?メインオシレータ安定時間設定 16.38ms デフォルトで高速IntOscの為 P308 

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    MOSCE = 0x00000001; //2.保護されたレジスタに所定の値をライト

    MOSCE = 0xFFFFFFFE; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    MOSCE = 0x00000001; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    MOSCE = 0x00000001; //2.保護されたレジスタに所定の値をライト

    MOSCE = 0xFFFFFFFE; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    MOSCE = 0x00000001; //4.保護されたレジスタに所定の値をライト

    }

    PLLC0 = 0x00000205; //(20MHz×6)/2 = 60MHz?

    PLLST0 = 0x00000007; // PLL安定時間設定 2048ms デフォルトで高速IntOscの為 P308  

    //PLL起動

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    PLLE0 = 0x00000001; //2.保護されたレジスタに所定の値をライト

    PLLE0 = 0xFFFFFFFE; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    PLLE0 = 0x00000001; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    PLLE0 = 0x00000001; //2.保護されたレジスタに所定の値をライト

    PLLE0 = 0xFFFFFFFE; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    PLLE0 = 0x00000001; //4.保護されたレジスタに所定の値をライト

    }

    //***************クロック選択*************************************************************************

    //IsoLatedエリア----------------------------------------------------------------------------------

    //CKSC_000(CPU&サブシステム)  :0x0014⇒PLL/1=60MHz     0bitに出力継続を加えると 0x00000029

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_000 = 0x00000029; //2.保護されたレジスタに所定の値をライト

    CKSC_000 = 0xFFFFFFD6; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_000 = 0x00000029; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_000 = 0x00000029; //2.保護されたレジスタに所定の値をライト

    CKSC_000 = 0xFFFFFFD6; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_000 = 0x00000029; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_006(TAUB0&TAUB0のPCLK) :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B      

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_006 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_006 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_006 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_006 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_006 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_006 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_007(WDTA1&WDTATCKI)  :0x0001⇒IntOSC(240KHz/1)=240KHz  0bitに出力継続を加えると 0x00000003  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_007 = 0x00000003; //2.保護されたレジスタに所定の値をライト

    CKSC_007 = 0xFFFFFFFC; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_007 = 0x00000003; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_007 = 0x00000003; //2.保護されたレジスタに所定の値をライト

    CKSC_007 = 0xFFFFFFFC; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_007 = 0x00000003; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_011(URTE10・LMA10等のPCLK) :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_011 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_011 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_011 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_011 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_011 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_011 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_012(ADCA0KのPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_012 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_012 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_012 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_012 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_012 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_012 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_016(ポート・フィルタ)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_016 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_016 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_016 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_016 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_016 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_016 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_028(CSIG0&IICB0のPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_028 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_028 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_028 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_028 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_028 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_028 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    /*

    //CKSC_029(CSIG7のPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B  

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_029 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_029 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_029 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_029 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_029 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_029 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    */

    //CKSC_032(OSTM0のPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B   

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_032 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_032 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_032 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_032 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_032 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_032 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_033(FCN0-5のPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B   

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_033 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_033 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_033 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_033 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_033 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_033 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_034(URTEのPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B   

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_034 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_034 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_034 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS0) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_034 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_034 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_034 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //AWOエリア--------------------------------------------------------------------------------------------

    //CKSC_A02(WDTA0&CLMA0等PCLK)  :0x000C⇒PLL/1=60MHz 0bitに出力継続を加えると 0x00000029

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A02 = 0x00000029; //2.保護されたレジスタに所定の値をライト

    CKSC_A02 = 0xFFFFFFD6; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A02 = 0x00000029; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A02 = 0x00000029; //2.保護されたレジスタに所定の値をライト

    CKSC_A02 = 0xFFFFFFD6; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A02 = 0x00000029; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_A03(TAUJ0のPCLK)  :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A03 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_A03 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A03 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A03 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_A03 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A03 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_A05(WDTA0&WDATCKIのPCLK) :0x0015⇒PLL/2=30MHz 0bitに出力継続を加えると 0x0000002B

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A05 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_A05 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A05 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A05 = 0x0000002B; //2.保護されたレジスタに所定の値をライト

    CKSC_A05 = 0xFFFFFFD4; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A05 = 0x0000002B; //4.保護されたレジスタに所定の値をライト

    }

    //CKSC_A07(WDTA0&WDATCKIのPCLK) :0x0001⇒IntOSC(240KHz/1)=240KHz  0bitに出力継続を加えると 0x00000003

    PROTCMD2 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A07 = 0x00000003; //2.保護されたレジスタに所定の値をライト

    CKSC_A07 = 0xFFFFFFFC; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A07 = 0x00000003; //4.保護されたレジスタに所定の値をライト

    while(PROTS2) //5.保護ステータス・レジスタのエラー・モニタ・ビットが0 であることを確認する

       {

    PROTCMD0 = 0xA5; //1.保護コマンド・レジスタに A5H をライト

    CKSC_A07 = 0x00000003; //2.保護されたレジスタに所定の値をライト

    CKSC_A07 = 0xFFFFFFFC; //3.保護されたレジスタに所定の値のビットごとに値を反転させた値をライト

    CKSC_A07 = 0x00000003; //4.保護されたレジスタに所定の値をライト

    }

    }

  • v850e2/px4に限った話ではありませんが、周辺機能へのクロック供給なしには設定は行えません。

    (モジュールストップ機能ですね)

    システム動作内で頻繁に周辺機能のクロック供給行ったり、止めたりする場合は注意が必要です。

    クロック供給を行っているつもりでレジスタ値を変更すると「アレ?変えたはずなのに!」ということが発生します。

  • 孔子さん こんにちは!

    すと先生! いつも勉強させていただいております.....笑)

    すぐ手元にV850E2/FG4-Lがあるので、試してみましたが、クロック供給してない状態でも、制御レジスタを設定できるようです。

    タイマー(TAUB0)のクロックを供給してない状態で、ボーレート設定(TAUB0CDR0)などしているところで、ブレークさせて、I/Oモニタで確認すると、ちゃんと設定されています。

    >(モジュールストップ機能ですね)

     ⇒っていうより、ある機能ブロックへのクロック供給機能みたいな感じですかね?

    P.S.

    邪魔なコード貼り付けて見にくくなってすみません。

    すとさんのアバターがまた変わってる!!!ひょっとして飽き性?

Reply
  • 孔子さん こんにちは!

    すと先生! いつも勉強させていただいております.....笑)

    すぐ手元にV850E2/FG4-Lがあるので、試してみましたが、クロック供給してない状態でも、制御レジスタを設定できるようです。

    タイマー(TAUB0)のクロックを供給してない状態で、ボーレート設定(TAUB0CDR0)などしているところで、ブレークさせて、I/Oモニタで確認すると、ちゃんと設定されています。

    >(モジュールストップ機能ですね)

     ⇒っていうより、ある機能ブロックへのクロック供給機能みたいな感じですかね?

    P.S.

    邪魔なコード貼り付けて見にくくなってすみません。

    すとさんのアバターがまた変わってる!!!ひょっとして飽き性?

Children
  • V850は構成が違うんでしょうかね?

    日立系マイコンはモジュールストップすると関連レジスタは変更できない仕様でした。

    これで結構痛い思いをしたので、激しく記憶に残っています。

     

    この仕様はモジュールストップすると関連レジスタへのクロック/電源が供給されなくなり、FFが動作しなくなるものだと思っていました。

    もちろん、中の人ではないので勝手な想像ですが…

     

    >NAKAさん

    理想のアバターを求めて三千里…(汗