_依如画 发表于 2025-4-14 11:04:18

AiCube的看门狗生成代码错误

WDT_SetPrescale(256);               //设置看门狗的时钟预分频


#define WDTCONTR_PS_MSK               (BIT2 | BIT1 | BIT0)
#define WDT_SetPrescale(n)            MODIFY_REG(WDT_CONTR, WDTCONTR_PS_MSK, ((n) << 0))

#define MODIFY_REG(r, clr, set) ((r) = (((r) & ~(clr)) | ((set) & (clr))))

群里有人说有问题,我创建项目验证一下,软件的时钟分频是直接填的分频系数
1.WDT_SetPrescale(256); 这里直接256,分频128就是128;
2.WDT_SetPrescale(256) MODIFY_REG(WDT_CONTR, 0x07, ((0x100) << 0))这里我直接转成16进制方便看,0x07是 (BIT2 | BIT1 | BIT0),0x100是256,预期应该是0x07(0000 0111B)(目标应该是0~7);
3.MODIFY_REG(WDT_CONTR, 0x07, 0x100)
WDT_CONTR = (((WDT_CONTR) & ~(0x07)) | ((0x100) & (0x07)))
WDT_CONTR = 清零WDT_PS 或上 0x00。这个位置0x100 & 0x07 。与预期的0000 0111B 256分频系数(0x07&0x07)不符合


国芯人工智能 发表于 2025-4-14 11:08:00

关于AiCube看门狗(WDT)生成代码中的预分频设置问题,以下是对代码的分析与建议:

代码分析
1. 预分频设置函数
   WDTSetPrescale(256); 用于设置看门狗的时钟预分频值。预分频的作用是调整看门狗计数器的时钟频率,从而控制看门狗的超时时间。

2. 寄存器操作宏定义
   c
   #define WDTCONTRPSMSK               (BIT2 | BIT1 | BIT0)
   #define WDTSetPrescale(n)            MODIFYREG(WDTCONTR, WDTCONTRPSMSK, ((n)
WDTCONTRPSMSK 定义了预分频寄存器的位掩码,通常用于选择预分频值的配置位(BIT2、BIT1、BIT0)。
WDTSetPrescale(n) 是一个宏,用于修改看门狗控制寄存器(WDTCONTR)中的预分频位。MODIFYREG 是一个常见的寄存器操作宏,用于在不影响其他位的情况下修改特定寄存器位。

问题与建议
1. 预分频值范围
   预分频值 n 的范围需要根据具体硬件手册确定。通常,预分频值应为2的幂次方(如2、4、8、16、32、64、128、256等)。如果 n 超出硬件支持的范围,可能导致未定义行为或错误。

2. 宏定义不完整
   当前 WDTSetPrescale(n) 宏定义不完整,缺少右括号和参数处理逻辑。建议修正为:
   ```c
   #define WDTSetPrescale(n)            MODIFYREG(WDTCONTR, WDTCONTRPSMSK, ((n)

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

zhp 发表于 2025-4-14 13:03:41

多谢反馈,后续更正
页: [1]
查看完整版本: AiCube的看门狗生成代码错误