newiot 发表于 2024-4-2 10:21

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

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 );

谢谢。


xdvca 发表于 2024-7-31 22:35

确保中断服务例程(ISR)实现正确。可能需要在中断服务例程中使用 volatile 关键字来确保编译器不会优化掉某些操作。
页: [1]
查看完整版本: F4A0,timer4,计数器谷顶中断,然后在中断中修改比较器的值,发现有脉冲丢失。