STM32的看门狗有两个,这一点和STM8S很像,一个是独立看门狗,另一个是窗口看门狗。32的看门狗之前用的不多,这次研究下。
其实用法很简单,首先看下它的时钟源:
可以看到,STM32内部有一个独立的40KHZ的RC时钟,单独做为独立看门狗的时钟源,无需外部时钟,这是很方便的。
配置方法上也很简单,这里我用野火的LED例程为模板,增加独立看门狗的代码做演示。现有工程里,增加一个bsp_iwdg.c和bsp_iwdg.h文件,填写看门狗的配置函数:
#include "bsp_iwdg.h"
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();
}
果然,又出现了乱码,我再截个图吧,实在懒得重新手写一遍文字了:
然后在主函数里调用即可:
int main(void)
{
/* LED ¶Ë¿Ú³õʼ»¯ */
LED_GPIO_Config();
//ÅжÏ֮ǰÊÇ·ñ·¢Éú¿´ÃŹ·¸´Î»
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
/* Èç¹ûÊÇ£¬Çå³ý±êÖ¾ */
RCC_ClearFlag();
}
//³õʼ»¯¿´ÃŹ·£¬1Ã븴λ
IWDG_Config(IWDG_Prescaler_64 ,625);
/* ·½·¨2£¬Ê¹Óù̼þ¿â¿ØÖÆIO */
while (1)
{
IWDG_Feed();
LED1( ON ); // ÁÁ
Delay(0x0FFFFF);
LED1( OFF ); // Ãð
LED2( ON ); // ÁÁ
Delay(0x0FFFFF);
LED2( OFF ); // Ãð
}
}
在截个图:
有人可能会好奇,这个1秒复位是怎么计算出来的。首先看门狗时钟是40KHZ,分频64,得到625HZ,刚好看门狗的计数值就是625,所以得到1秒。
最后编译、下载、上电。额,看门狗不像流水灯,看不到什么特殊的结果。我们知道它能运行就行了。完整工程代码我上传到了公众号(单片机爱好者)后台,有感兴趣的,回复关键词:32独立看门狗,即可获取