CH573 TMR0 捕获的问题

我TMR0想捕捉脉冲里高电平的持续时间

我的配置如下:

void Cap_Init( void )
{
    GPIOA_ResetBits( GPIO_Pin_9 );                                  // 配置PWM口 PA9
    GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_Floating );

    TMR0_CapInit( Edge_To_Edge );                                   // 边沿
    TMR0_CAPTimeoutCfg( 0xFFFFFFFF );                               // 设置捕捉超时时间
    TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT );                       // 开启有效电平结束中断
    PFIC_EnableIRQ( TMR0_IRQn );
}


中断判断是高电平还是低电平:

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR0_IRQHandler( void )                                        // TMR0 定时中断
{
    if( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) )
    {
        TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );                     // 清除中断标志
        if( ( TMR0_CAPGetData(  ) >> 25 ) != 0 )
        {
            PRINT( "CAP_H:%.1f\r\n", ( TMR0_CAPGetData(  ) & 0x1FFFFFF )/60000.0 );
        }
    }
}



但是为啥我捕捉到的是低电平时间?

6666666666666.png

TMR0不支持DMA的功能,其他和TMR1的使用方式一样,这里提供一个不带DMA功能的博客,按照其修改就可以:

CH579_TMR定时器边沿捕获 - SweetTea_lllpc - 博客园 (cnblogs.com)


我知道问题了

我在中断里面读取cap值并判断完高低电平之后再次读取判断持续时间的时候读到的值 已经是低电平的了,应该是这样:

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR0_IRQHandler( void )                                        // TMR0 定时中断
{
    if( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) )
    {
        UINT32 temp = TMR0_CAPGetData(  );
        if( ( temp >> 25 ) != 0 )
        {
            PRINT( "CAP_H:%.1f\r\n", ( temp & 0x1FFFFFF )/60000.0 );
        }
        TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );                     // 清除中断标志
    }
}


只有登录才能回复,可以选择微信账号登录