实验介绍
首先介绍一下本次使用的独立看门狗
看门狗框图:
相当于一个12位定时器,同时有8位预分频
看门狗超时时间:
这些时间是按照40kHz时钟给出。实际上, MCU内部的RC频率会在30kHz到60kHz之间变化。
此外,即使RC振荡器的频率是精确的,确切的时序仍然依赖于APB接口时钟与RC振荡器时钟
之间的相位差,因此总会有一个完整的RC周期是不确定的。
键寄存器IWDG_KR:
大体的流程为:配置看门狗,启用看门狗,按需喂狗
下面介绍实验做法:配置看门狗的定时时间为3s,3s内若按下按键,则喂狗,否则闪烁三次
效果如下
看门狗
实验代码
iwdg.c文件
#include "stm32f10x.h" // Device header
/**
* Tout = prv/40 * rlv (s) prv¿ÉÒÔÊÇ[4,8,16,32,64,128,256]
* prv:Ô¤·ÖƵÆ÷Öµ£¬È¡ÖµÈçÏ£º
* ²ÎÊý IWDG_Prescaler_4: IWDG prescaler set to 4
* ²ÎÊý IWDG_Prescaler_8: IWDG prescaler set to 8
* ²ÎÊý IWDG_Prescaler_16: IWDG prescaler set to 16
* ²ÎÊý IWDG_Prescaler_32: IWDG prescaler set to 32
* ²ÎÊý IWDG_Prescaler_64: IWDG prescaler set to 64
* ²ÎÊý IWDG_Prescaler_128: IWDG prescaler set to 128
* ²ÎÊý IWDG_Prescaler_256: IWDG prescaler set to 256
* IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s
*/
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
IWDG_SetPrescaler( prv );
IWDG_SetReload( rlv );
IWDG_ReloadCounter();
IWDG_Enable();
}
void IWDG_Feed(void)
{
IWDG_ReloadCounter();
}
main.c文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Led.h"
#include "Key.h"
#include "iwdg.h"
int main()
{
uint16_t keynum;
led_init();key_init();IWDG_Config(IWDG_Prescaler_64 ,625*3);
led1(0);
Delay_ms(100);
led1(1);
Delay_ms(100);
led1(0);
Delay_ms(100);
led1(1);
Delay_ms(100);
led1(0);
Delay_ms(100);
led1(1);
Delay_ms(100);
while(1)
{
keynum=key_scan();
if(keynum)
{
if(keynum==1)
{
IWDG_Feed();
led2toggle();
Delay_ms(100);
led2toggle();
}
}
}
}
实验结果
实验非常成功