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)不符合
关于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)
[本文内容由国芯人工智能辅助生成,仅供参考] 多谢反馈,后续更正
页:
[1]