1、看门狗定时计算
看门狗的喂狗时间(也就是看门狗溢 出时间)的计算方式为:
Tout=((4×2^prer) ×rlr) /32
其中 Tout 为看门狗溢出时间(单位为 ms)。
prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7。
rlr 为看门狗的重装载值(IWDG_RLR 的值)。
cubmax就主要是配置这两个值。
2、制造一个 Hard-Fault
产生 hard fault 方法:
对不可访问的内存地址进行写操作
uint32_t *addr = (uint32_t *)0x20100000;
*addr = 0x12;
3、实验现象一(采用原子f429阿波罗)
不初始化看门狗,也不喂狗
led灯常亮,程序跑死在Hard-Fault错误处。
int main(void)
{
uint32_t *addr = (uint32_t *)0x20100000;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
delay_ms(100); //延时100ms再初始化看门狗,LED0的变化"可见"
IWDG_Init(IWDG_PRESCALER_64,2500); //分频数为64,重载值为500,溢出时间为1s
LED0=!LED0;
while(1)
{
// if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗
{
IWDG_Feed(); //喂狗
prinf()//可以加个打印
}
*addr = 0x12;
delay_ms(10);
}
}
始化看门狗,及喂狗
隔了5s,常亮的LED灯闪烁了一下,程序复位,跳出了while循环,执行了一次 LED0=!LED0;
思考:自己的tongxindu工装,定时6s,如果超时了,设置一个看门狗复位一下,将速度变到5500rpm。
工装程序配置好后,不喂狗也进行了复位,晚上有说法是:
MX_IWDG_Init();
__HAL_IWDG_START(&hiwdg);
注意事项:
1、网上有说:只能在主函数中喂狗,也不能在中断中喂狗。项目中的也是在main中的while中不停的喂狗(不然就会导致软件复位)。