// RA4M1コアボードの16MHz水晶でのPLLを試す // D12ピンをGNDにつなぐとPLLに切り替え // 周波数は元と同じ48MHz // 16MHZ * 12逓倍で192MHz, 192MHz ÷ 4分周で 48MHz // D5ピン P102 GT2B 1MHzでトグル出力 // D4ピン P103 GT2A 2相パルスでトグル出力 // D8ピン P304 loopでH/L // D9ピン P303 millis変化でトグル(500Hz) // D13ピン P111 LED PLL切り替えで点灯 // P012 RA4M1のLED 〃 // D12ピン P110 pull up入力 GND接続でPLL on // UNO R4のLEDはD13 P111 Hで点灯 // RA4M1のLEDはP012 Hで点灯 // ポートH/L制御出力 #define D8_H (R_PORT3->PODR_b.PODR4 = 1) // D8:P304 H/L #define D8_L (R_PORT3->PODR_b.PODR4 = 0) #define D9_H (R_PORT3->PODR_b.PODR3 = 1) // D9:P303 H/L #define D9_L (R_PORT3->PODR_b.PODR3 = 0) #define D10_H (R_PORT1->PODR_b.PODR12 = 1) // D10:P112 H/L #define D10_L (R_PORT1->PODR_b.PODR12 = 0) #define D13_H (R_PORT1->PODR_b.PODR11 = 1) // D13:P111 H/L (R4のLED on/off) #define D13_L (R_PORT1->PODR_b.PODR11 = 0) #define LED_ON (R_PORT0->PODR_b.PODR12 = 1) // P012 H/L (RA4M1のLED on/off) #define LED_OFF (R_PORT0->PODR_b.PODR12 = 0) // 入力チェック #define INP_D12 (R_PORT1->PIDR_b.PIDR10) // D12 P110入力 offで1 GND接続で0 #define INP_SW (R_PORT0->PIDR_b.PIDR13) // RA4M1のSW入力 P013 /***** メインクロックをPLLに切り替え *****/ void PLLon(void) { byte b; R_SYSTEM->PRCR = 0xA501; // クロック関連レジスタのプロテクト解除 // メインクロック水晶発振 R_SYSTEM->MOSCWTCR = 0b1001; // 発振安定32.768ms待ち (初期値2.08ms) R_SYSTEM->MOSCCR_b.MOSTP = 0; // XTAL発振開始 b = R_SYSTEM->MOSCCR_b.MOSTP; // MOSTPの状態, 0の確認はいるのか? while(1){ // 発振安定待ち if(R_SYSTEM->OSCSF_b.MOSCSF == 1) break; // MOSCSFが1で安定 } // PLL切り替え R_SYSTEM->PLLCCR2_b.PLLMUL = 12 - 1; // 12逓倍 16MHz*12 = 192MHz R_SYSTEM->PLLCCR2_b.PLODIV = 0b10; // 4分周 192MHz/4 = 48MHz R_SYSTEM->PLLCR_b.PLLSTP = 0; // PLL開始 while(1){ // PLL安定待ち if(R_SYSTEM->OSCSF_b.PLLSF == 1) break; // PLLSFが1で安定 } R_SYSTEM->SCKSCR_b.CKSEL = 0b101; // クロックソースをPLLに R_SYSTEM->PRCR = 0xA500; // プロテクト戻す } /***** SETUP *****/ void setup() { pinMode(8, OUTPUT); // D8:P304 pinMode(9, OUTPUT); // D9:P303 pinMode(10, OUTPUT); // D10:P112 pinMode(13, OUTPUT); // D13:P111 (LED) pinMode(12, INPUT_PULLUP); // D12:P110 GND接続でPLLをオン R_PORT0->PDR_b.PDR12 = 1; // P012 出力に (RA4M1のLED) // PFSプロテクト解除 R_PMISC->PWPR_b.B0WI = 0; // PFS書き込みプロテクト解除 R_PMISC->PWPR_b.PFSWE = 1; // (プロテクト戻してないよ) // P013 pullup R_PFS->PORT[0].PIN[13].PmnPFS_b.PCR = 1; // P013入力pullup // D5:P102 (参:19.2.5) R_PFS->PORT[1].PIN[2].PmnPFS_b.PDR = 1; // ポート出力 R_PFS->PORT[1].PIN[2].PmnPFS_b.PSEL = 0b00011; // GTIOC2B出力に R_PFS->PORT[1].PIN[2].PmnPFS_b.PMR = 1; // 周辺機能有効 // D4:P103 R_PFS->PORT[1].PIN[3].PmnPFS_b.PDR = 1; // ポート出力 R_PFS->PORT[1].PIN[3].PmnPFS_b.PSEL = 0b00011; // GTIOC2A出力に R_PFS->PORT[1].PIN[3].PmnPFS_b.PMR = 1; // 周辺機能有効 // GPT2 B出力を1MHzでトグル A出力と合わせて2相パルスに (参:図22.15) R_MSTP->MSTPCRD_b.MSTPD6 = 0; // PWMモジュールストップ解除 R_GPT2->GTCR_b.MD = 0b000; // ノコギリ波モード R_GPT2->GTUDDTYC = 0b11; // 強制的にupカウント R_GPT2->GTUDDTYC = 0b01; // up継続 R_GPT2->GTCR_b.TPCS = 0b000; // PCLKD/1 48MHz R_GPT2->GTPR = 24 - 1; // 48MHz/24=2MHz トグルで1/2して1MHz R_GPT2->GTCNT = 0; // 初回カウント値 R_GPT2->GTIOR_b.GTIOB = 0b01100; // GTIOC2B 周期の終わりでトグル出力 R_GPT2->GTIOR_b.GTIOA = 0b10011; // GTIOC2A コンペアマッチでトグル出力 R_GPT2->GTIOR_b.OBE = 1; // B出力許可 R_GPT2->GTIOR_b.OAE = 1; // A出力許可 R_GPT2->GTCCR[0] = 12; // GTCCRA:Aのトグル位置 R_GPT2->GTCR_b.CST = 1; // カウント開始 } // コンペアキャプチャレジスタのGTCCRAのアクセスは // 「R_GPT2->GTCCR[0] = n;」と // GTCCRAなら[0]と番号で指定 しなければエラーになる。 //  「R_GPT2->GTCCRA」や //  「R_GPT2->GTCCR_b.GTCCRA」とはできない。 /***** LOOP *****/ // D12入力 GND接続でPLLに切り替え void loop() { uint32_t ms , a; // 1msチェックデータ int f_x9 = 0; // D9ポート反転フラグ int f_pllok = 0; // PLL切り替え完了フラグ ms = millis(); // 現1ms値 // loop while(1){ D8_H; // D8:P304 H/L D8_L; a = millis(); // 新1ms値 if(ms != a){ // 1ms変化? f_x9 ^= 1; // 0/1 if(f_x9) D9_H; // D9:P303 H/L else D9_L; ms = a; // 次の1msを待つ } // PLL変更タイミング if(((INP_D12 == 0) || // D12をGNDにタッチするとPLLに切り替え (INP_SW == 0)) && // RA4M1のSWでも (f_pllok == 0)){ // まだPLLにしていない D13_H; // UNO R4 LED on LED_ON; // RA4M1のLEDをon PLLon(); // PLLに切り替え f_pllok = 1; // 1回だけ実行 以降はPLLで動作 } } } // <2025-05-04 JH3DBO>