#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#define LED_PIN 0
#define SW_PIN 20
// 125MHzを分周して点滅周期を作る設定値
// クロック: 125MHz / 250 = 500kHz (カウント速度: 1秒間に500,000カウント)
#define CLKDIV 250.0f
#define WRAP_500MS 499999 // 500,000 / (49999 + 1) = 10Hz (点滅周期 1Hz: ON 500ms / OFF 500ms)
#define WRAP_100MS 99999 // 500,000 / ( 9999 + 1) = 50Hz (点滅周期 5Hz: ON 100ms / OFF 100ms)
volatile bool fast_mode = false;
uint slice_num;
uint chan_num;
void on_switch(uint gpio, uint32_t events) {
fast_mode = !fast_mode;
uint16_t wrap = fast_mode ? WRAP_100MS : WRAP_500MS;
// 周期(wrap)と デューティ比50%(wrap / 2)を再設定
pwm_set_wrap(slice_num, wrap);
pwm_set_chan_level(slice_num, chan_num, wrap / 2);
}
int main() {
stdio_init_all();
// スイッチ設定
gpio_init(SW_PIN);
gpio_set_dir(SW_PIN, GPIO_IN);
gpio_set_irq_enabled_with_callback(SW_PIN, GPIO_IRQ_EDGE_FALL, true, &on_switch);
// LEDピンをPWM出力モードに設定
gpio_set_function(LED_PIN, GPIO_FUNC_PWM);
slice_num = pwm_gpio_to_slice_num(LED_PIN);
chan_num = pwm_gpio_to_channel(LED_PIN);
// PWM初期設定(初期状態: 500ms間隔)
pwm_set_clkdiv(slice_num, CLKDIV);
pwm_set_wrap(slice_num, WRAP_500MS);
pwm_set_chan_level(slice_num, chan_num, WRAP_500MS / 2); // デューティ比 50%
pwm_set_enabled(slice_num, true);
// PWMモジュールが自動でハザード/点滅処理を行うため、CPUは何もする必要がない
while (true) {
sleep_ms(1000);
}
}