在华大CIU32F032的资源中只有IWDT,它是由独立的RC振荡器作为时钟,因此在芯片进入Stop模式后IWDT依旧可以正常工作,计数器溢出会产生复位;
如果此时恰好需要进入stop模式并且不能复位该怎么办,下面列举我的操作方法;
1、利用创芯工坊的烧录器进行配置,在选项字节配置设置“独立看门狗在STOP下计数器停止计数”。
2、在程序中对Flash的option bytes进行设置,要注意的是Flash的解锁操作;如果不解锁直接改写会锁死Flash;
void configure_iwdg_stop_mode(void) { // 使用标准库提供的读取函数判断当前配置 if (std_flash_get_iwdg_stop() == false) { // false 表示停止模式(即 STOP 模式停止计数) // 已经配置为停止模式,无需操作 return; } // 否则执行解锁、配置、锁定 // 注意解锁函数返回 void,但我们可以检查锁定状态位来验证是否成功 std_flash_unlock(); if (std_flash_get_lock_status()) { // 解锁失败,复位 NVIC_SystemReset(); } std_flash_opt_unlock(); if (std_flash_get_opt_lock_status()) { std_flash_lock(); NVIC_SystemReset(); } // 配置结构体 std_flash_option_config_t ob_config = {0}; ob_config.config_select = FLASH_OB_CONFIG_IWDG_STOP; // 0x08 ob_config.iwdg_stop = FLASH_IWDG_STOP_MODE_STOP; // 0 std_status_t status = std_flash_option_bytes_config(&ob_config); if (status != STD_OK) { // 错误处理 std_flash_opt_lock(); std_flash_lock(); NVIC_SystemReset(); } // 锁定 std_flash_opt_lock(); std_flash_lock(); }以上两种方式都可以使芯片的看门狗在STOP模式下停止计数,但是我遇到一种很危险的情况;在批量生产过程中,烧录车间会忘记对烧录器进行配置,所以在程序上也要配置;
最好是在程序上判断两种方式是否都有生效,如果两种方式都没有生效,就不要开启IWDT,因为一旦开启就无法关闭;