CH582捕获模式下的问题

使用定时器捕获输入脉冲(来自于红外遥控器)时长,初始设置如下:

    TMR0_CapInit(Edge_To_Edge);

    TMR0_CAPTimeoutCfg(1000 * (g_sys_clock_hz/1000)); 

    TMR0_ITCfg(ENABLE, TMR0_3_IT_DATA_ACT); // 开启中断

     PFIC_EnableIRQ(TMR0_IRQn);

在中断函数中先TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT ),然后使用TMR0_CAPGetData()读取数据。


经过多次测试,按下一次遥控按键后,前60个左右的Edge_To_Edge边沿变化可以正常捕获(包括NEC红外引导码在内的数据都正确),但到60个(或62个,64个,似乎与脉冲所代表的数据有关)时,不再产生中断。间隔任意时长后,再次按下遥控按键时,中断再次产生,前一次按键未接收完的数据会首先被接收到(完整的红外数据帧应该产生差不多67个中断),之后才是第二次按键自己的数据。但前一次按键的第60个Edge_To_Edge边沿变化的捕获时长是一个非常大的值,明显超出了红外脉冲编码的范围。


请帮忙看一下以上捕获代码是否有问题,为什么在接收到60个左右的边沿变化后就不再产生中断了?


可以先用GPIO输出一个特定波形,然后捕获查看是否每次都可以正常获取。

其次用逻辑分析仪查看脉冲波,注意在60个的时候是否有明显的变化。

cap的功能实现和计算可以参考:

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


问题似乎是FIFO中可以保存8个数据,而TMR0_3_IT_DATA_ACT不能对FIFO中的8个数据每个都产生中断。

只要在中断函数中尝试一次性读取FIFO中的全部数据,问题就解决了。


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