}
-// 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)
{
/* チップ依存部の終了処理 */
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
+ );
+
/**
}
-// 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
}
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
);
* \details
* CORTEX-M3コアに入力する動作クロックの周波数[Hz]。
*/
-#define SYS_CLOCK (INTERNAL_CLOCK * 25) // コアに入力するクロック 100MHz
+#define SYS_CLOCK (180000000) // コアに入力するクロック 180MHz
#ifndef TOPPERS_MACRO_ONLY
*/
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は自動的にリセットにピンが割り当てられるので、何もしない。
/*
* バナー出力用のシリアル初期化
/**
* \brief コア・クロック周波数
* \details
- * CORTEX-M4Fコアに入力する動作クロックの周波数[Hz]。
+ * CORTEX-M4Fコアに入力する動作クロックの周波数[Hz]。現在のチップ依存部の制限により、周波数は4の倍数にする。
*/
-#define SYS_CLOCK (INTERNAL_CLOCK * PLL_MULTIPLYER) // コアに入力するクロック
+#define SYS_CLOCK 192000000 // コアに入力するクロック
#ifndef TOPPERS_MACRO_ONLY
*/
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