#申请原创# 最近在使用HK32F030MF4P6的IWDG时,参照官方例程进行配置,发现IWDG无法工作。
官方例程IWDG配置代码如下:
static void IWDG_Configurature(void)
{
IWDG_WriteAccessCmd(ENABLE);
IWDG_SetPrescaler(IWDG_Prescaler_8);
IWDG_SetReload(1280);
IWDG_ReloadCounter();
IWDG_Enable();
}
问题就出在配置函数的第一行代码上,IWDG_WriteAccessCmd()函数为修改和启动IWDG,定位到该函数定义如下:
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
{
/* Check the parameters */
assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));
IWDG->KR = IWDG_WriteAccess;
}
可以看到,实际上是操作IWDG_KR寄存器,查找用户手册可发现:
对IWDG_KR写入0x5555后才能解锁IWDG_PR,OWDG_RLR,IWDG_WINR寄存器,我们才能根据自己的需要进行配置看门狗,
再回过头看官方的例程代码,IWDG_WriteAccessCmd(ENABLE); 我们定位到该代码传入的参数“ENABLE",如下:
可以看到,通过枚举的形式定义了ENABLE,其值为非0,也即为1。
看到这里,大家也就知道了官方例程提供IWDG不能正常工作的原因了,可以认为的将IWDG配置代码修改为:
IWDG_WriteAccessCmd(0x5555)。
但这就不符合人家做库的初衷了,仔细观察void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)函数,其第一行代码有个断言
assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));
通过断言我们可以定位到断言的内容,如下:
可以看到,官方提供的头文件中已经对0x5555做了预处理定义,所以我们在配置代码中传入的参数可以修改如下:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable)。
如此,IWDG即可正常运行工作。
PS:偶尔出现问题可以理解,但还是建议官方多做检查!
|