STM32F103的独立看门狗代码例程

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独立看门狗,即可获取

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据