[技术问答]

F4A0,timer4,计数器谷顶中断,然后在中断中修改比较器的值,发现有脉冲丢失。

[复制链接]
375|2
手机看帖
扫描二维码
随时随地手机跟帖
newiot|  楼主 | 2024-4-2 10:21 | 显示全部楼层 |阅读模式
F4A0,timer4,计数器谷顶中断,然后在中断中修改比较器的值,发现有脉冲丢失。


下面是中断的设置部分:

    TMR4_SetCountIntMaskTime(TMR4_UNIT, TMR4_INT_CNT_PEAK,0);// TMR4_INT_CNT_MASK15);

    /* Register IRQ handler && configure NVIC. */
    stcIrqConfig.enIRQn = INT010_IRQn;//TMR4_COUNT_PEAK_IRQn;
    stcIrqConfig.enIntSrc = INT_SRC_TMR4_1_OVF;//TMR4_COUNT_PEAK_INT_SRC;
    stcIrqConfig.pfnCallback = &TMR4_PeakMatch_IrqCallback;
    (void)INTC_IrqSignIn(&stcIrqConfig);
    NVIC_ClearPendingIRQ(stcIrqConfig.enIRQn);
    NVIC_SetPriority(stcIrqConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqConfig.enIRQn);
        TMR4_IntCmd(CM_TMR4_1, TMR4_INT_CNT_PEAK, ENABLE);//上溢中断

下面是中断回调函数:
__IO uint16_t TMR4_U1_ACnt=0;//比较器值。
static void TMR4_PeakMatch_IrqCallback(void)
{

TMR4_U1_Cnt+=10;//比较器值参考,增加。
if(TMR4_U1_Cnt>8000)TMR4_U1_Cnt=1;//限制最大值。
if(TMR4_U1_Cnt<5)TMR4_U1_Cnt=5;//限制最小值
        
TMR4_OC_SetCompareValue(TMR4_UNIT, TMR4_OC_CH_UH,TMR4_U1_Cnt);        //更新比较器的值。
TMR4_OC_SetCompareValue(TMR4_UNIT, TMR4_OC_CH_UL,TMR4_U1_Cnt);        //更新比较器的值。
        
}

还有哪里要设置,或是哪里有错误?

使用特权

评论回复
wubangmi| | 2024-4-2 10:31 | 显示全部楼层
要使用通道缓存功能,不然比较值太小的话,就会丢脉冲

使用特权

评论回复
newiot|  楼主 | 2024-4-2 10:38 | 显示全部楼层
本帖最后由 newiot 于 2024-4-2 11:41 编辑
wubangmi 发表于 2024-4-2 10:31
要使用通道缓存功能,不然比较值太小的话,就会丢脉冲

通道缓存功能开启后,在中断程序中增加清除中断标志就可以了。
TMR4_ClearStatus(TMR4_UNIT,TMR4_FLAG_CNT_PEAK );

谢谢。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

79

帖子

1

粉丝