WCH沁恒单片机
直播中

二霸

11年用户 633经验值
私信 关注
[问答]

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
", ( TMR0_CAPGetData(  ) & 0x1FFFFFF )/60000.0 );
        }
    }
}

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

  
  

回帖(2)

蔡柱刚

2022-7-28 10:54:29
MR0不支持DMA的功能,其他和TMR1的使用方式一样
举报

张秀云

2022-7-28 10:54:33
我知道问题了
我在中断里面读取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:%.1frn", ( temp & 0x1FFFFFF )/60000.0 );
        }
        TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );                     // 清除中断标志
    }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分