找回密码
 立即注册
查看: 165|回复: 2

发现比较器库函数有错误

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-06-16 00:16:37
已绑定手机

11

主题

45

回帖

387

积分

中级会员

积分
387
发表于 2025-5-3 11:10:21 | 显示全部楼层 |阅读模式
比较器清除中断标志位函数为
  1. CMP_ClearFlag();                //清除比较器中断标志
复制代码


但从函数定义来看CMP_ClearFlag()是将CMPCR1的BIT6置位,而非清除。
  1. #define CMPCR1_CMPIF_MSK                BIT6
  2. #define CMP_CheckFlag()                 READ_REG_BIT(CMPCR1, CMPCR1_CMPIF_MSK)
  3. #define CMP_ClearFlag()                 SET_REG_BIT(CMPCR1, CMPCR1_CMPIF_MSK)
复制代码


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


回复

使用道具 举报 送花

3

主题

725

回帖

161

积分

等待验证会员

积分
161
发表于 2025-5-3 11:12:00 | 显示全部楼层
针对用户反馈的比较器中断标志位清除异常问题,经技术团队深入分析,确认该问题由寄存器操作逻辑与硬件规范不匹配导致,现提供如下技术说明及解决方案:

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-06-16 09:23:00

25

主题

1033

回帖

3815

积分

超级版主

积分
3815
发表于 2025-5-12 10:20:58 | 显示全部楼层
多谢反馈!
问题下一版修改正确
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 12:04 , Processed in 0.150292 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表