wenbo2005.online

学习记录 / 驱动库

定时器输入捕获(失败)

驱动库2025-05-22
volatile uint32_t measure_Cnt = 0;
volatile uint32_t measure_Buf[3];
volatile float distance = 0;

uint32_t sr04_time=0;
void SR04_Display(void)
{
    if(uwTick - sr04_time<200) return;
    sr04_time = uwTick;

    if(measure_Cnt==0)
    {
        measure_Cnt=1;
        DL_GPIO_setPins(SR04_PORT,SR04_TRIG_PIN);
        delay_us(100);
        DL_GPIO_clearPins(SR04_PORT, SR04_TRIG_PIN);
        //启动定时器
        NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
        DL_TimerG_startCounter(CAPTURE_0_INST);
    }
}

void CAPTURE_0_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(CAPTURE_0_INST))
    {
        case DL_TIMERG_IIDX_CC0_UP:
            measure_Buf[0] = DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
             DL_TimerG_clearInterruptStatus(CAPTURE_0_INST,
            DL_TIMERG_INTERRUPT_CC0_UP_EVENT); // 清除标志
            break;
        case DL_TIMERG_IIDX_CC0_DN:
            measure_Buf[1] = DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMERG_CAPTURE_COMPARE_0_INDEX);
            measure_Buf[2] = measure_Buf[1] - measure_Buf[0];
            //转换为微秒(假设时钟频率为1MHz)
            distance = (measure_Buf[2] * 0.0343) / 2;
            DL_TimerG_clearInterruptStatus(CAPTURE_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
            measure_Cnt = 0; // 重置状态,等待下次触发
            break;
        case DL_TIMERG_IIDX_ZERO:
            DL_TimerG_clearInterruptStatus(CAPTURE_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
            measure_Cnt = 0;
            break;
        default:
            break;
    }
}

void TIMERG_Capture_Init(void)
{
    // 启用CC0的上升沿和下降沿中断
    DL_TimerG_enableInterrupt(CAPTURE_0_INST,
        DL_TIMERG_INTERRUPT_CC0_UP_EVENT |
        DL_TIMERG_INTERRUPT_CC0_DN_EVENT);

    // 启用定时器中断(确保NVIC已使能)
    NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
}

//{"P":21.58,"I":18.52,"D":0.01,"V":0.5}
//系统初始化
void System_Init(void)
{
    //初始化外部中断
    Encoder_Init();
    //开启串口接收中断
    NVIC_ClearPendingIRQ(UART_BLE_INST_INT_IRQN);
    NVIC_EnableIRQ(UART_BLE_INST_INT_IRQN);
    //OLED初始化
    OLED_Init();
    OLED_Clear();
    //使能定时器中断
    TIMERG_Capture_Init();
    // NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
    // DL_TimerG_startCounter(CAPTURE_0_INST);
    //PID初始化
    Pid_Init(&MotorA_PID,21.58, 18.62, 0.01, 99, 0);
    Pid_Init(&MotorB_PID,21.58, 18.62, 0.01, 99, 0);
}