OSDN Git Service

コメントの修正及びPLL設定ルーチンの記述。
authorsuikan <suikan@users.sourceforge.jp>
Mon, 22 Oct 2012 14:53:54 +0000 (23:53 +0900)
committersuikan <suikan@users.sourceforge.jp>
Mon, 22 Oct 2012 14:53:54 +0000 (23:53 +0900)
asp/arch/arm_m_gcc/lpc1800_gcc/chip_config.c
asp/arch/arm_m_gcc/lpc1800_gcc/chip_config.h
asp/arch/arm_m_gcc/lpc4300_gcc/chip_config.c
asp/arch/arm_m_gcc/lpc4300_gcc/chip_config.h
asp/target/lpc1768_generic_gcc/lpc1768_generic.h
asp/target/lpc1830_generic_gcc/target_config.c
asp/target/lpc4330_generic_gcc/lpc4330_generic.h
asp/target/lpc4330_generic_gcc/target_config.c

index 112473f..b18ba53 100644 (file)
@@ -66,28 +66,45 @@ void chip_initialize(void)
 
 }
 
-// Todo:ビルドは通るがPLLの設定が正しいか確認
-extern void initPLL1(
-               pllClockSource_type     clkSrc,
-               unsigned int                    N,
-               unsigned int                    M,
-               unsigned int                    cpuClkDiv
-       )
+extern void initPLL1( unsigned int  Hz  )
 {
 
-               // Set PLL
-       LPC_CGU->PLL1_CTRL =  ((M-1)<<CGU_PLL1_CTRL_MSEL_Pos)           // Multiplier
-                                               | ((N-1)<<CGU_PLL1_CTRL_NSEL_Pos)               // Pre-PLL div
-                                               | ((clkSrc-1)<<CGU_PLL1_CTRL_CLK_SEL_Pos)       // clock source
-                                               | CGU_PLL1_CTRL_AUTOBLOCK_Msk;
-       while
-         (!(LPC_CGU->PLL1_STAT & CGU_PLL1_STAT_LOCK_Msk));             /* PLLの準備が整うまで待つ  */
-
-               // select PLL1 as input for M3 core
-       LPC_CGU->BASE_M3_CLK = CGU_BASE_M3_CLK_AUTOBLOCK_Msk | (0x09 << CGU_BASE_M3_CLK_CLK_SEL_Pos);
+    LPC_CGU->BASE_M3_CLK = 0x01000800;          // select IRC as cortex-m4 input, auto hold
+
+            // Set PLL1 frequency to 96MHz
+    LPC_CGU->PLL1_CTRL =
+                        1 << 24 |   // 28:24, clock sel = 1 (IRC)
+                       23 << 16 |   // 23:16, MSEL = 23 ( multiply by (MSEL+1) )
+                        2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
+                        1 << 11 |   // 11,    AUTOBLOCK = 1
+                        1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
+                        1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
+                        0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
+                        0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
+                             0;      // 0,     PD = 0   ( 1 : power down, 0 active );
+            // wait for lock
+    while ( ! LPC_CGU->PLL1_STAT )
+       ;
+        // Set PLL1 frequency to desired
+        // PLL reference is 4MHz (12MHz/3). So, the multiplier have to be ( desired freq / 4 )-1
+    LPC_CGU->PLL1_CTRL =
+                1 << 24 |   // 28:24, clock sel = 1 (IRC)
+               (Hz/4000000-1) << 16 |   // 23:16, MSEL = 47 ( multiply by (MSEL+1) )
+                2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
+                1 << 11 |   // 11,    AUTOBLOCK = 1
+                1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
+                1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
+                0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
+                0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
+                     0;      // 0,     PD = 0   ( 1 : power down, 0 active );
+    // wait for lock
+    while ( ! LPC_CGU->PLL1_STAT )
+        ;
+    LPC_CGU->BASE_M3_CLK = 0x09000800;          // select PLL1, auto hold
 
 }
 
+
 void chip_exit(void)
 {
        /* チップ依存部の終了処理 */
index 22feb52..ab6cbaf 100644 (file)
 typedef enum { eIrc, eMainOsc, eRtcOsc} pllClockSource_type;
 
 /**
- * @param clkSrc PLLのソースとなるクロック。0から0x10のうち一つを指定する。PLL1CTRLレジスタの解説参照
- * @param M 逓倍比を決める整数。1から256が許される。
- * @param N PLLのリファレンス入力の分周比を決める整数。1から4が許される
- * @param pSel PLLの出力の分周器。1から4が許される。
+ * @param Hz PLLの出力周波数。Hz単位。4の倍数が許される。
  * @details
- * PLL0の周波数を設定する。クロックソースとなる発振器、その周波数、PLLのデバイダ、PLL後のデバイダを
- * 指定する。生成するクロックの周波数は以下の通りとなる。CCLKがCPUのコアクロックである。
- * @code
- * PLLCLK = (2 × M × FIN) / N
- * CCLK = PLLCLK / cpuClkDiv
- * @endcode
- * LPC1768のPLLに関しては次のような物理上限値がNXPによって定められている
- * - 入力は32kHz - 50MHz (UM10360, section 5.1)
- * - PLL出力は 275MHz - 550MHz (同上)
- * - CCLKは最大100MHz (データシート)
- *
- * このプログラムはNXP社のCMSIS中のルーチンをコピーし、改良したものである。
+ * PLL1の周波数を設定する。クロックソースとなる発振器はIRC(12Mhz)で、それを元に
+ * PLL1を設定する。周波数は任意のものを与えてよいが、設定されるのは4MHzの倍数である。
  */
 extern void initPLL1(
-               pllClockSource_type     clkSrc,
-               unsigned int                    N,
-               unsigned int                    M,
-               unsigned int                    pSel
-       );
+        unsigned int            Hz
+    );
+
 
 
 /**
index df2c356..b6b26cb 100644 (file)
@@ -66,25 +66,41 @@ void chip_initialize(void)
 
 }
 
-// Todo:ビルドは通るがPLLの設定が正しいか確認
-extern void initPLL1(
-               pllClockSource_type     clkSrc,
-               unsigned int                    N,
-               unsigned int                    M,
-               unsigned int                    cpuClkDiv
-       )
+extern void initPLL1( unsigned int     Hz      )
 {
 
-               // Set PLL
-       LPC_CGU->PLL1_CTRL =  ((M-1)<<CGU_PLL1_CTRL_MSEL_Pos)           // Multiplier
-                                               | ((N-1)<<CGU_PLL1_CTRL_NSEL_Pos)               // Pre-PLL div
-                                               | ((clkSrc-1)<<CGU_PLL1_CTRL_CLK_SEL_Pos)       // clock source
-                                               | CGU_PLL1_CTRL_AUTOBLOCK_Msk;
-       while
-         (!(LPC_CGU->PLL1_STAT & CGU_PLL1_STAT_LOCK_Msk));             /* PLLの準備が整うまで待つ  */
-
-               // select PLL1 as input for M3 core
-       LPC_CGU->BASE_M4_CLK = CGU_BASE_M4_CLK_AUTOBLOCK_Msk | (0x09 << CGU_BASE_M4_CLK_CLK_SEL_Pos);
+    LPC_CGU->BASE_M4_CLK = 0x01000800;          // select IRC as cortex-m4 input, auto hold
+
+            // Set PLL1 frequency to 96MHz
+    LPC_CGU->PLL1_CTRL =
+                        1 << 24 |   // 28:24, clock sel = 1 (IRC)
+                       23 << 16 |   // 23:16, MSEL = 23 ( multiply by (MSEL+1) )
+                        2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
+                        1 << 11 |   // 11,    AUTOBLOCK = 1
+                        1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
+                        1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
+                        0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
+                        0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
+                             0;      // 0,     PD = 0   ( 1 : power down, 0 active );
+            // wait for lock
+    while ( ! LPC_CGU->PLL1_STAT )
+       ;
+        // Set PLL1 frequency to desired
+        // PLL reference is 4MHz (12MHz/3). So, the multiplier have to be ( desired freq / 4 )-1
+    LPC_CGU->PLL1_CTRL =
+                1 << 24 |   // 28:24, clock sel = 1 (IRC)
+               (Hz/4000000-1) << 16 |   // 23:16, MSEL = 47 ( multiply by (MSEL+1) )
+                2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
+                1 << 11 |   // 11,    AUTOBLOCK = 1
+                1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
+                1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
+                0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
+                0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
+                     0;      // 0,     PD = 0   ( 1 : power down, 0 active );
+    // wait for lock
+    while ( ! LPC_CGU->PLL1_STAT )
+        ;
+    LPC_CGU->BASE_M4_CLK = 0x09000800;          // select PLL1, auto hold
 
 }
 
index 811f5d8..67a959a 100644 (file)
 typedef enum { eIrc, eMainOsc, eRtcOsc} pllClockSource_type;
 
 /**
- * @param clkSrc PLLのソースとなるクロック。0から0x10のうち一つを指定する。PLL1CTRLレジスタの解説参照
- * @param M 逓倍比を決める整数。1から256が許される。
- * @param N PLLのリファレンス入力の分周比を決める整数。1から4が許される
- * @param pSel PLLの出力の分周器。1から4が許される。
+ * @param Hz PLLの出力周波数。Hz単位。4の倍数が許される。
  * @details
- * PLL0の周波数を設定する。クロックソースとなる発振器、その周波数、PLLのデバイダ、PLL後のデバイダを
- * 指定する。生成するクロックの周波数は以下の通りとなる。CCLKがCPUのコアクロックである。
- * @code
- * PLLCLK = (2 × M × FIN) / N
- * CCLK = PLLCLK / cpuClkDiv
- * @endcode
- * LPC1768のPLLに関しては次のような物理上限値がNXPによって定められている
- * - 入力は32kHz - 50MHz (UM10360, section 5.1)
- * - PLL出力は 275MHz - 550MHz (同上)
- * - CCLKは最大100MHz (データシート)
- *
- * このプログラムはNXP社のCMSIS中のルーチンをコピーし、改良したものである。
+ * PLL1の周波数を設定する。クロックソースとなる発振器はIRC(12Mhz)で、それを元に
+ * PLL1を設定する。周波数は任意のものを与えてよいが、設定されるのは4MHzの倍数である。
  */
 extern void initPLL1(
-               pllClockSource_type     clkSrc,
-               unsigned int                    N,
-               unsigned int                    M,
-               unsigned int                    pSel
+               unsigned int                    Hz
        );
 
 
index ee40adb..6ba374c 100644 (file)
@@ -98,7 +98,7 @@
  * \details
  * CORTEX-M3コアに入力する動作クロックの周波数[Hz]。
  */
-#define SYS_CLOCK              (INTERNAL_CLOCK * 25)   // コアに入力するクロック 100MHz
+#define SYS_CLOCK              (180000000)     // コアに入力するクロック 180MHz
 
 
 #ifndef TOPPERS_MACRO_ONLY
index c018a87..1004f95 100644 (file)
@@ -72,25 +72,11 @@ void target_initialize(void)
      */
     chip_initialize();
 
-    /* Flash Accelerator はLPC1830には存在しない */
-//    LPC_SC->FLASHCFG = 0x403a;
+    initPLL1(SYS_CLOCK);  // Set coreclock to desired frequency
 
-    /*
-     *  プロセッサクロックの初期化
-     */
-        // PLLの設定 (15 * 12MHz) = 180MHz
-/*
-    initPLL1(
-            1,                             // pllClockSource_type     IRC,
-            1,                     // unsigned int            N,
-            PLL_MULTIPLYER,         // unsigned int            M,
-            1                      // unsigned int            cpuClkDiv
-        );
-
-*/
+    // USART0のピンの設定
     LPC_SCU->SFSP6_4 = 2;                       // TXD0 : Mode 2
     LPC_SCU->SFSP6_5 = 2 | (1<<4) | (1<<6) ;    // RXD0 : Mode 2, EPUN, EZI
-    // USART0は自動的にリセットにピンが割り当てられるので、何もしない。
 
     /*
      *  バナー出力用のシリアル初期化
index 7f108fd..f8b0e5c 100644 (file)
@@ -97,9 +97,9 @@
 /**
  * \brief コア・クロック周波数
  * \details
- * CORTEX-M4Fコアに入力する動作クロックの周波数[Hz]。
+ * CORTEX-M4Fコアに入力する動作クロックの周波数[Hz]。現在のチップ依存部の制限により、周波数は4の倍数にする。
  */
-#define SYS_CLOCK        (INTERNAL_CLOCK * PLL_MULTIPLYER)    // コアに入力するクロック
+#define SYS_CLOCK        192000000    // コアに入力するクロック
 
 
 #ifndef TOPPERS_MACRO_ONLY
index c19f2c6..50292c1 100644 (file)
@@ -72,22 +72,8 @@ void target_initialize(void)
      */
     chip_initialize();
 
-    /* Flash Accelerator はLPC4330には存在しない */
-//    LPC_SC->FLASHCFG = 0x403a;
 
-    /*
-     *  プロセッサクロックの初期化
-     */
-        // PLLの設定 (15 * 12MHz) = 180MHz
-/*
-    initPLL1(
-            1,                             // pllClockSource_type     IRC,
-            1,                     // unsigned int            N,
-            PLL_MULTIPLYER,         // unsigned int            M,
-            1                      // unsigned int            cpuClkDiv
-        );
-
-*/
+    initPLL1(SYS_CLOCK);  // Set coreclock to desired frequency
 
     // USART0ピン割り当て
     LPC_SCU->SFSP6_4 = 2;                       // TXD0 : Mode 2