打印
[技术文档]

HK32F030MF4P6 官方例程IWDG BUG修复

[复制链接]
4007|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# 最近在使用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:偶尔出现问题可以理解,但还是建议官方多做检查!



使用特权

评论回复

相关帖子

沙发
gygp| | 2021-7-2 21:48 | 只看该作者
原来还有这个问题。      

使用特权

评论回复
板凳
chenci2013| | 2021-7-2 21:48 | 只看该作者
不兼容stm32f0吗            

使用特权

评论回复
地板
biechedan| | 2021-7-2 21:48 | 只看该作者
IWDG_KR寄存器错误吗   

使用特权

评论回复
5
wangdezhi| | 2021-7-2 21:48 | 只看该作者
以后需要注意IWDG的操作了。   

使用特权

评论回复
6
isseed| | 2021-7-2 21:48 | 只看该作者
官方例程也有错误呢?        

使用特权

评论回复
7
xietingfeng| | 2021-7-2 21:49 | 只看该作者
IWDG无法工作,是配置问题还是寄存器的问题呢

使用特权

评论回复
8
suzhanhua| | 2021-7-2 21:49 | 只看该作者
这个兼容stm32f030吗

使用特权

评论回复
9
mituzu| | 2021-7-2 21:49 | 只看该作者
解锁IWDG_PR是写入bit吗?

使用特权

评论回复
10
uiint| | 2021-7-2 21:49 | 只看该作者
            

使用特权

评论回复
11
hellosdc| | 2021-7-2 21:50 | 只看该作者
谢谢楼主分享的资料了。     

使用特权

评论回复
12
单片小菜| | 2021-7-4 21:58 | 只看该作者
以后需要多注意一下了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

16

帖子

0

粉丝