本帖最后由 Alden 于 2023-11-13 16:00 编辑
#申请原创# #技术资源#
独立看门狗:
看门狗是用来监测由软件错误引起的系统故障。片上一共有两个看门狗设备:独立看门狗和窗口看门狗,它们提高了安全性、使时间更加精确以及使用变得更加
灵活。
独立看门狗只有在计数器减到 0 时,会复位,在没有减到 0 之前,刷新计数器的值不会发生复位。
窗口看门狗在计数器减到 0x3F 时会发生复位,当计数器计数的值在配置寄存器的窗口值之前,刷新计数器也会发生复位。
独立看门狗有独立的时钟源LSI,即使是在主时钟(PLL或HSE)失效的情况下,它仍然有效。独立看门狗适用于需要独立的环境但对精确度要求不高的场所。
窗口看门狗的时钟源是总线时钟,精度相比独立看门狗的LSI要高,适用于对精度较高的场合,但缺点就是当主频异常或受到强干扰芯片死机时,窗口看门狗可能无法将芯片复位。
对于开发者应用而言,独立看门狗有独立的时钟源,即使是在主时钟失效的情况下,它仍然有效。跟适合作为防止系统跑飞或死机的场景。
但是想让独立看门狗生效,那就要让独立看门狗打开。正常软件配置独立看门狗是在外设初始化过程中使能开启独立看门狗才能生效。
而在很强干扰的场景,芯片可能会出现连续死机的场景。
在第一次死机时独立看门狗能够正常复位,但在复位后到独立看门狗初始化会有一段时间,如果在这段时间内再次跑飞或死机,看门狗就会失效。
那有什么办法能够避免这种情况呢?
芯片设计上就有考虑到这种情况,有一个叫硬件看门狗的配置就能解决这个问题。
查看芯片手册就能看到硬件看门狗的介绍:
启动了“硬件看门狗”功能之后,当系统上电复位,看门狗会自动运行。如果没有向关键字寄存器中写入 0xAAAA,计数器计数结束后,产生复位。
硬件看门狗的开启是在选项字节中FMC_OPTCTRL的WDTSEL位
可以使用烧录器烧录时配置选项字节,或者在代码中配置开启硬件看门狗。
硬件看门狗的开启本质上是硬件上强制打开独立看门狗,只要上电独立看门狗就是运行状态。
上电运行可以再次软件配置独立看门狗的分频值和装载值来调整看门狗计时时间。
如果不就行软件配置的话,复位间隔就是默认值,大约400ms。
需注意:开启独立看门狗后擦写flash的代码不会影响硬件看门狗的开关,也就是开启硬件看门狗后如果没有再配置选项字节关闭,独立看门狗就是一直开着的。如果开启后忘了关,再烧录没有配置看门狗喂狗的代码,就会看门狗复位,影响调试。
测试硬件看门狗需注意这一点,也要注意烧录器烧录时误操作开启硬件看门狗,也会导致代码异常复位。
硬件看门狗的开启有两种方式:
1、烧录器写入选项字节
离线烧录器一般都有选项字节的配置,可以加读写保护硬件看门狗等,具体方法要看是哪家的烧录器,如果没有可以配置选项字节的烧录器就可以试试用下面的软件方式来实现。
2、软件代码配置选项字节打开。
在极海APM32F411的SDK中,基于IWDG例程可以增加硬件看门狗的配置。
都是基于极海完善的库函数调用FMC_OPT_ConfigUser();中的FMC_OPT_IWDT_HARD就是打开硬件看门狗,FMC_OPT_IWDT_SOFT是默认的软件看门狗配置。
void UserOptionByte(void)
{
FMC_UnlockOptionByte();
FMC_OPT_ConfigUser(FMC_OPT_IWDT_HARD,FMC_OPT_STOP_NORST,FMC_OPT_STDBY_NORST);
FMC_OPT_Launch();
FMC_LockOptionByte();
}
外设初始话中增加硬件看门狗开启,可以测试到即使不初始化软件看门狗,也能用示波器或者串口打印观察到有看门狗复位。
测试硬件看门狗是否生效也很简单,在软件看门狗的初始化前面加个while(1);死循环。
int main(void)
{
APM_LEDInit(LED2);
APM_LEDInit(LED3);
APM_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);
/* USART Initialization */
USART_Init();
// printf("IWDT is running, if press KEY1 to start feed watchdog, Ohterwise System will reset about 4 seconds!\r\n");
SysTick_Config(SystemCoreClock / 1000);
if(RCM_ReadStatusFlag(RCM_FLAG_IWDTRST) == SET)
{
/* IWDT Reset */
APM_LEDOn(LED3);
printf("\r\n IWDT Reset! \r\n");
RCM_ClearStatusFlag();
}
else
{
APM_LEDOff(LED3);
}
UserOptionByte();
while(1);
IWDT_EnableWriteAccess();
/* Colck is 1000Hz(32k/32) */
IWDT_ConfigDivider(IWDT_DIVIDER_32);
/* About 4 seconds */
IWDT_ConfigReload(4000);
IWDT_Refresh();
IWDT_Enable();
while(1)
{
if(bKEY1_Flag == 1)
{
APM_LEDToggle(LED2);
Delay();
IWDT_Refresh();
printf("\r\nif press KEY1 again to finish feeding watchdog, System will reset about 4 seconds!\r\n");
}
else
{
APM_LEDOff(LED2);
}
}
}
这样的话就能验证到即使没有初始化独立看门狗,都会出现看门狗复位。复位间隔受LSI精度影响。
即使注释掉选项字节的配置重新烧录,硬件看门狗依然可以生效。证明硬件看门狗激活后可以一直生效。
如果将选项字节配置成软件看门狗,就会发现芯片运行会停在while循环,不会复位。
|
@Alden :收到,我这边问一下
@21小跑堂 :实名一直卡在待验证,一直等就行吗
以APM32F411为例,介绍硬件开门勾搭使用,提升软件安全性,防止系统跑飞和环境干扰,使用者需注意使用场景,在实时性较高的场合可能不会适用,注意做好硬件的安全防护哦。(申请蓝V认证通过后可提升打赏额度,快来联系管理员升级权限吧!)
@21小跑堂