// RA4M1コアボードの16MHz水晶でのPLLを試す // D12ピンをGNDにつなぐとPLLに切り替え // 周波数は元と同じ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) // LEDポート #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) // D9:P303トグル #define D9_X (R_PORT3->PODR_b.PODR3 = !(R_PORT3->PODR_b.PODR3)) // 入力チェック #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に切り替え *****/ // m:逓倍値(8~16) d:分周値(2,4) // mもdも範囲チェックしていない // (a)16MHZ * 12逓倍で192MHz, 192MHz ÷ 4分周で 48MHz // (b)16MHZ * 6逓倍で 96MHz, 96MHz ÷ 2分周で 48MHz // (c)12MHZ * 8逓倍で 96MHz, 96MHz ÷ 2分周で 48MHz // (a)(b)は規定外 12MHzの水晶を使う(c)がまっとうな逓倍,分周値 void PLLon(int m, int d) { 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 = m - 1; // m逓倍 (8~31) 8未満でも動作するようだ R_SYSTEM->PLLCCR2_b.PLODIV = d / 2; // d分周 (2,4) 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 *****/ // 初期値でokのところはコメントに void setup() { // PFSプロテクト解除 // R_PMISC->PWPR_b.B0WI = 0; // PFS書き込みプロテクト解除 // R_PMISC->PWPR_b.PFSWE = 1; // すでに解除されている // モジュールストップ解除 R_MSTP->MSTPCRD_b.MSTPD6 = 0; // PWMモジュールストップ解除 // 入出力 pinMode(8, OUTPUT); // D8:P304 pinMode(9, OUTPUT); // D9:P303 pinMode(13, OUTPUT); // D13:P111 (LED) pinMode(12, INPUT_PULLUP); // D12:P110 GND接続でPLLをオン R_PORT0->PDR_b.PDR12 = 1; // P012 出力に (RA4M1のLED) // P013 pullup R_PFS->PORT[0].PIN[13].PmnPFS_b.PCR = 1; // P013入力pullup // D5:P102 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相パルスに // 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->GTCCR[0] = 12; // GTCCRA:Aのトグル位置 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->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_pllok = 0; // PLL切り替え完了フラグ ms = millis(); // 現1ms値 // loop while(1){ D8_H; // D8:P304 H/L D8_L; a = millis(); // 新1ms値 if(ms != a){ // 1ms変化? D9_X; // D9:P303 H/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(6, 2); // PLLに切り替え (16MHz*6/2) // PLLon(8, 4); // (16MHz*8/4) f_pllok = 1; // 1回だけ実行 以降はPLLで動作 } } } // <2025-05-20 JH3DBO>