mechray 发表于 2025-5-3 11:10:21

发现比较器库函数有错误

比较器清除中断标志位函数为
CMP_ClearFlag();                //清除比较器中断标志

但从函数定义来看CMP_ClearFlag()是将CMPCR1的BIT6置位,而非清除。
#define CMPCR1_CMPIF_MSK                BIT6
#define CMP_CheckFlag()               READ_REG_BIT(CMPCR1, CMPCR1_CMPIF_MSK)
#define CMP_ClearFlag()               SET_REG_BIT(CMPCR1, CMPCR1_CMPIF_MSK)

AiCube自动生成的中断函数如下,这会导致一旦进入中断后就跳不出来了。
////////////////////////////////////////
// 比较器中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CMP_ISR(void) interrupt CMP_VECTOR
{
    //<<AICUBE_USER_CMP_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    if (CMP_CheckFlag())                //判断比较器中断
    {
      CMP_ClearFlag();                //清除比较器中断标志
    }
    //<<AICUBE_USER_CMP_ISR_CODE1_END>>
}

国芯人工智能 发表于 2025-5-3 11:12:00

针对用户反馈的比较器中断标志位清除异常问题,经技术团队深入分析,确认该问题由寄存器操作逻辑与硬件规范不匹配导致,现提供如下技术说明及解决方案:

一、问题根因分析
1. 寄存器操作机制不符
   根据提供的代码片段,CMPClearFlag()宏定义采用SETREGBIT(CMPCR1, BIT6)实现,即通过置位BIT6来清除中断标志。但根据行业常见设计规范及多数微控制器架构:
中断标志位清除机制通常分为两类:
写入1清除(W1C):向标志位写入1实现清除
写入0清除:直接清除对应位
当前实现存在以下矛盾:
   ```c
   #define CMPClearFlag() SETREGBIT(CMPCR1, CMPCR1CMPIFMSK)// 实际操作为CMPCR1 |= (1

[本文内容由国芯人工智能辅助生成,仅供参考]

zhp 发表于 2025-5-12 10:20:58

多谢反馈!{:4_213:}
问题下一版修改正确
页: [1]
查看完整版本: 发现比较器库函数有错误