STM32 SP706S 外部看门狗的应用示例

看门狗是防止程序跑飞的一种兜底方案,STM32有自己片内的独立看门狗和串口看门狗,但是很意外的发现我测试片内的看门狗不好用,关闭了一扇门的同时,我又发现了一扇窗,板子上有SP706S外部看门狗芯片,那么STM32 SP706S的测试就应运而生。

STM32和SP706S的电路部分说明示意图

STM32 SP706S 外部看门狗的应用示例_第1张图片

关于SP706S的文档描述

STM32 SP706S 外部看门狗的应用示例_第2张图片

对于SP706S来说,WDI是输入,那么对于STM32来说,对应连接的STM32引脚PA0就是输出(推挽输出)。

图中红框描述的意思是如果WDI这个引脚持续高电平或持续低电平到1.6秒的时间,内部看门狗定时器就会WDO(上划线)持续低电平。从上面的示意图可以看出WDO(上划线)和MR(上划线)连接在一起;RESET(上划线)又和STM32的NRST连接在一起,也就是说 RESET(上划线)决定了STM32的复位效果。

总结一下,从STM32这个角度出发,如果初始化了PA0为推挽输出,即使能了外部看门狗,PA0需要再1.6s内变化一次高低电平实现喂狗,否则STM32程序就会被复位。

按照上述思路,编写测试工程代码来进行验证。

根据板子现有的资源2个LED灯,一个拨码开关。要实现测试效果的描述:

程序开始,初始化LED和拨码开关的GPIO,延时2秒钟,这时候LED灯有2秒是灭的状态。再使能看门狗,即设置PA0的GPIO为推挽输出。程序进入循环,循环中判断拨码开关的状态,如果是1就喂狗,否则就不喂狗。紧接着LED1和LED2亮灭,延时了400毫秒。

测试过程,程序编译下载,最初拨码开关是0的状态,即不喂狗,程序执行的现象是LED有2秒灭,然后亮灭闪烁4次左右,就又灭了2秒,再次执行这个过程。即SP706S外部看门狗起作用了,STM32程序重启了。再将拨码开关调为1的状态,程序不断亮灭,没有2秒左右的灭的现象,说明程序喂狗成功。

测试的主函数代码

#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif

#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endif

#ifndef __Z_HARDWARE_LED_H
#define __Z_HARDWARE_LED_H
#include "z_hardware_led.h"
#endif

#ifndef __Z_HARDWARE_SWITCHKEYS_H
#define __Z_HARDWARE_SWITCHKEYS_H
#include "z_hardware_switchkeys.h"
#endif

#ifndef __Z_HARDWARE_SP706S_H
#define __Z_HARDWARE_SP706S_H
#include "z_hardware_sp706s.h"
#endif

void func_led_onoff_cross(void);

int main()
{	
	init_led();
	init_switchkeys();
	
	delay_ms(2000);
	
	func_init_sp706s();
	
	for(;;)
	{
		if(func_get_switchkey1() == 1)
		{
			func_feed_dog();
		}
		
		func_led_onoff_cross();
	}
	
}

void func_led_onoff_cross()
{
	func_led1_on();
	func_led2_off();
	delay_ms(200);
	func_led2_on();
	func_led1_off();
	delay_ms(200);
}

z_hardware_sp706s.c

#ifndef __Z_HARDWARE_SP706S_H
#define __Z_HARDWARE_SP706S_H
#include "z_hardware_sp706s.h"
#endif

void func_init_sp706s(void)
{
	GPIO_InitTypeDef GPIO_InitStructure_A;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
	GPIO_InitStructure_A.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure_A);
}

void func_feed_dog(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
	}
  else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	}		
}

z_hardware_sp706s.h

#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif

void func_init_sp706s(void);
void func_feed_dog(void);

以上。

你可能感兴趣的:(STM32,SP706S,看门狗)