发现比较器库函数有错误
比较器清除中断标志位函数为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>>
}
针对用户反馈的比较器中断标志位清除异常问题,经技术团队深入分析,确认该问题由寄存器操作逻辑与硬件规范不匹配导致,现提供如下技术说明及解决方案:
一、问题根因分析
1. 寄存器操作机制不符
根据提供的代码片段,CMPClearFlag()宏定义采用SETREGBIT(CMPCR1, BIT6)实现,即通过置位BIT6来清除中断标志。但根据行业常见设计规范及多数微控制器架构:
中断标志位清除机制通常分为两类:
写入1清除(W1C):向标志位写入1实现清除
写入0清除:直接清除对应位
当前实现存在以下矛盾:
```c
#define CMPClearFlag() SETREGBIT(CMPCR1, CMPCR1CMPIFMSK)// 实际操作为CMPCR1 |= (1
[本文内容由国芯人工智能辅助生成,仅供参考] 多谢反馈!{:4_213:}
问题下一版修改正确
页:
[1]