| パソコン制御をもっと気軽に 電子制御をもっと気楽に |
低速CPUクロックによる省電力化
Arduino RP2040 2026/01/10
#include "arduino.h"
#include "PowerSaveHelper.hpp"
void setup() {
// power save中はUSBが使えなくなるのでSerial2を
// 経過ログ用に使用します
Serial2.begin(115200);
//
// CPUによりコンパイルをスイッチするのでその確認用
#ifdef ARDUINO_ARCH_RP2040
Serial2.printf("CPU is RP2040 group\n");
#endif
#ifdef PICO_RP2040
Serial2.printf("CPU is RP2040\n");
#endif
#if defined( PICO_RP2350 )
Serial2.printf("CPU is RP2350\n");
Serial2.printf("CPU is %s\n",PICO_RP2350A==1?"RP2350A":"RP2350B");
#endif
// CPUクロックを切り替える時にclk_periも操作するので
// その前にSerial2の送信完了を待つ
Serial2.flush();
// XOSCによるCpuSpeed12MHzへの切り替え
// PLL_sys,PLL_usb停止
cPowerSave::WithXOSC();
// delay(xx) , millis() , micros()は正しく動きます
// XOSCでのボーレート再設定
Serial2.begin(115200);
//
Serial2.println("Setup done");
}
int Cu=1;
u_int32_t PreMSec;
u_int32_t NowMSec;
void loop() {
Serial2.printf("\nCPU 12MHz Cu=%3d\n",Cu++);
cShowClkRegs::ShowClockFrequency( &Serial2 );
// CPU clock change to 40MHz
cPowerSave::CpuSpeed40MHz() ;
delay(2000);
Serial2.printf("\nCPU 40MHz Cu=%3d\n",Cu++);
cShowClkRegs::ShowClockFrequency( &Serial2 );
// CPU clock change to 2MHz
cPowerSave::CpuSpeed2MHz() ;
PreMSec = millis() & 0x7fffffff ;
// wait 2000 mSec
do {
NowMSec=millis() & 0x7fffffff ;
} while( ((NowMSec-PreMSec ) & 0x7fffffff ) < 2000) ;
Serial2.printf("\nCPU 2MHz Cu=%3d\n",Cu++);
cShowClkRegs::ShowClockFrequency( &Serial2 );
// CPU clock change to 12MHz
cPowerSave::CpuSpeed12MHz() ;
PreMSec = millis() & 0x7fffffff ;
// wait 2000 mSec
do {
NowMSec=millis() & 0x7fffffff ;
} while( ((NowMSec-PreMSec ) & 0x7fffffff ) < 2000) ;
}
CPU is RP2040 group
CPU is RP2040
Setup done
CPU 12MHz Cu= 1
PLL_SYS : 0KHz
PLL_USB : 0KHz
ROSC : 0KHz
XOSC : 12000KHz
CLK_REF : 12002KHz
CLK_SYS : 12000KHz <-- 12MHz
CLK_PERI: 12002KHz
CLK_USB : 0KHz
CLK_ADC : 0KHz
CLK_RTC : 0Hz
CPU 40MHz Cu= 2
PLL_SYS : 40000KHz <-- PLL_SYSが動作している
PLL_USB : 0KHz
ROSC : 0KHz
XOSC : 12000KHz
CLK_REF : 12002KHz
CLK_SYS : 40000KHz <-- 40MHz
CLK_PERI: 12002KHz
CLK_USB : 0KHz
CLK_ADC : 0KHz
CLK_RTC : 0Hz
CPU 2MHz Cu= 3
PLL_SYS : 0KHz
PLL_USB : 0KHz
ROSC : 0KHz
XOSC : 12000KHz
CLK_REF : 4002KHz
CLK_SYS : 2000KHz <-- 2MHz
CLK_PERI: 12000KHz
CLK_USB : 0KHz
CLK_ADC : 0KHz
CLK_RTC : 0Hz
| シーブイデブ e-mail:mnakatani@cvdev-jp.com |