//###################################
//④ 割り込み関係関数 (interrupt.c 想定)
//###################################
#include "main.h"

extern SystemParams global_params;
extern volatile uint8_t lcd_update_flag; 
uint16_t Read_ADC(uint8_t ch);
uint16_t Read_ADC2(uint8_t ch);
uint16_t Process_BPF(uint16_t input_raw, SystemParams* params);

// 💡関数名を TIM1_UP_IRQHandler に変更
void TIM1_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM1_UP_IRQHandler(void)
{
    static uint8_t lcd_count = 0;

    // 💡判断を TIM_IT_Update に変更
    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 💡クリアするビットも変更

        lcd_count++;
        if (lcd_count >= 20) // 10ms × 20 = 200ms
        {
            lcd_count = 0;
            lcd_update_flag = 1; // メインループへ通知
        }
    }
}

// 定期サンプリング用タイマー割り込み (TIM4などを用いて8kHzを生成)
void TIM4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void TIM4_IRQHandler(void) {
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {

//  GPIOB->BSHR = (1 << 6);              //OSC PB7 SET (0->1)66ns
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);

        // PB0 (ADC1_IN8) から音声入力を取得
        uint16_t raw_in = Read_ADC2(ADC_Channel_8); //音がはいらなかったら、ためしに　ADC_Channel_9　としてみる

        // フィルタ処理実行
         uint16_t raw_out = Process_BPF(raw_in, &global_params);

         // PWMに出力反映 (TIM3 CH1)
        TIM_SetCompare1(TIM3, raw_out);

//  GPIOB->BSHR = (1 << 22);             //OSC PB7 RSET (1->0)59ns
    }
}





