打印
[技术问答]

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

[复制链接]
1385|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 );

谢谢。


使用特权

评论回复
地板
xdvca| | 2024-7-31 22:35 | 只看该作者
确保中断服务例程(ISR)实现正确。可能需要在中断服务例程中使用 volatile 关键字来确保编译器不会优化掉某些操作。

使用特权

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

本版积分规则

58

主题

79

帖子

1

粉丝