历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | stm32学习笔记(五)独立看门狗

2018-12-29 来源:eefocus


独立看门狗源时钟频率为40KHZ,可以设置一个预装载值IEDG_PR,还可以设置分频值,把独立看门狗源时钟的频率除以这个值。


独立看门狗的复位时间


Tout=((4*2^prer)*rlr)/40 (ms).



只要对以上三个寄存器进行相应的设置,我们就可以启动STM32的独立看门狗,启动过程可以按如下步骤实现:


1)向IWDG_KR写入0X5555。


通过这步,我们取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。


设置IWDG_PR和IWDG_RLR的值。


这两步设置看门狗的分频系数,和重装载的值。由此,就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:


Tout=((4×2^prer) ×rlr) /40


其中Tout为看门狗溢出时间(单位为ms);prer为看门狗时钟预分频值(IWDG_PR值),范围为0~7;rlr为看门狗的重装载值(IWDG_RLR的值);


比如我们设定prer值为4,rlr值为625,那么就可以得到Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAA到IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。


2)向IWDG_KR写入0XAAAA。


通过这句,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。


3)向IWDG_KR写入0XCCCC。


通过这句,来启动STM32的看门狗。注意IWDG在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不用IWDG的话,就不要去打开它,免得麻烦。


通过上面3个步骤,我们就可以启动STM32的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个LED灯来指示程序是否重启,来验证STM32的独立看门狗。


在配置看门狗后,DS0将常亮,如果WK_UP按键按下,就喂狗,只要WK_UP不停的按,看门狗就一直不会产生复位,保持DS0的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致DS0熄灭一次。




IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s

0代表分频数为4,1代表分频数为8,以此类推,


#include "iwdg.h"

#include "led.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//Mini STM32开发板

//看门狗 驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2010/5/30

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 正点原子 2009-2019

//All rights reserved

void IWDG_Init(u8 prer,u16 rlr) 

{

  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作


IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64


IWDG_SetReload(rlr);  //设置IWDG重装载值


IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器


IWDG_Enable();  //使能IWDG

}

//喂独立看门狗

void IWDG_Feed(void)

{   

  IWDG_ReloadCounter();    

}



/**

  ******************************************************************************

  * @file    stm32f10x_iwdg.c

  * @author  MCD Application Team

  * @version V3.5.0

  * @date    11-March-2011

  * @brief   This file provides all the IWDG firmware functions.

  ******************************************************************************

  * @attention

  *

  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY

  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

  *

  *

© COPYRIGHT 2011 STMicroelectronics

  ******************************************************************************

  */

 

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_iwdg.h"

 

/** @addtogroup STM32F10x_StdPeriph_Driver

  * @{

  */

 

/** @defgroup IWDG 

  * @brief IWDG driver modules

  * @{

  */ 

 

/** @defgroup IWDG_Private_TypesDefinitions

  * @{

  */

 

/**

  * @}

  */

 

/** @defgroup IWDG_Private_Defines

  * @{

  */ 

 

/* ---------------------- IWDG registers bit mask ----------------------------*/

 

/* KR register bit mask */

#define KR_KEY_Reload    ((uint16_t)0xAAAA)

#define KR_KEY_Enable    ((uint16_t)0xCCCC)

 

/**

  * @}

  */ 

 

/** @defgroup IWDG_Private_Macros

  * @{

  */

 

/**

  * @}

  */

 

/** @defgroup IWDG_Private_Variables

  * @{

  */

 

/**

  * @}

  */

 

/** @defgroup IWDG_Private_FunctionPrototypes

  * @{

  */

 

/**

  * @}

  */

 

/** @defgroup IWDG_Private_Functions

  * @{

  */

 

/**

  * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.

  * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.

  *   This parameter can be one of the following values:

  *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers

  *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers

  * @retval None

  */

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)

{

  /* Check the parameters */

  assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));

  IWDG->KR = IWDG_WriteAccess;

}

 

/**

  * @brief  Sets IWDG Prescaler value.

  * @param  IWDG_Prescaler: specifies the IWDG Prescaler value.

  *   This parameter can be one of the following values:

  *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4

  *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8

  *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16

  *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32

  *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64

  *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128

  *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256

  * @retval None

  */

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)

{

  /* Check the parameters */

  assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler));

  IWDG->PR = IWDG_Prescaler;

}

 

/**

  * @brief  Sets IWDG Reload value.

  * @param  Reload: specifies the IWDG Reload value.

  *   This parameter must be a number between 0 and 0x0FFF.

  * @retval None

  */

void IWDG_SetReload(uint16_t Reload)

{

  /* Check the parameters */

  assert_param(IS_IWDG_RELOAD(Reload));

  IWDG->RLR = Reload;

}

 

/**

  * @brief  Reloads IWDG counter with value defined in the reload register

  *   (write access to IWDG_PR and IWDG_RLR registers disabled).

  * @param  None

  * @retval None

  */

void IWDG_ReloadCounter(void)

{

  IWDG->KR = KR_KEY_Reload;

}

 

/**

  * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).

  * @param  None

  * @retval None

  */

void IWDG_Enable(void)

{

  IWDG->KR = KR_KEY_Enable;

}

 

/**

  * @brief  Checks whether the specified IWDG flag is set or not.

  * @param  IWDG_FLAG: specifies the flag to check.

  *   This parameter can be one of the following values:

  *     @arg IWDG_FLAG_PVU: Prescaler Value Update on going

  *     @arg IWDG_FLAG_RVU: Reload Value Update on going

  * @retval The new state of IWDG_FLAG (SET or RESET).

  */

FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)

{

  FlagStatus bitstatus = RESET;

  /* Check the parameters */

  assert_param(IS_IWDG_FLAG(IWDG_FLAG));

  if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET)

  {

    bitstatus = SET;

  }

  else

  {

    bitstatus = RESET;

  }

  /* Return the flag status */

  return bitstatus;

}

 

/**

  * @}

  */

 

/**

  * @}

  */

 

/**

  * @}

  */

 

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/


--------------------- 

作者:yuyangyg 

来源:CSDN 

原文:https://blog.csdn.net/yuyangyg/article/details/77150381 

版权声明:本文为博主原创文章,转载请附上博文链接!


推荐阅读

史海拾趣

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

HI Microwave Technology Limited公司的发展小趣事

随着技术的不断积累和市场需求的日益增长,HI Microwave不断加大研发投入,成功开发出了一系列高性能的微波组件产品,包括隔离器、循环器、开关、滤波器、功率分配器/合成器、定向耦合器、天线、混频器、压控振荡器(VCOs)和射频放大器等。这些产品广泛应用于无线电信和光纤通信行业,满足了客户多样化的需求。同时,公司还积极与国内外知名企业和科研机构合作,共同推动微波通信技术的发展。

AXTAL公司的发展小趣事

AXTAL公司诞生于2003年,是由物理学家兼电子工程师Bernd Neubig创立的。Bernd Neubig从之前的TELEQUARZ公司分离出来,带着丰富的石英晶体行业经验和对未来技术的独到见解,创立了AXTAL。公司的员工团队拥有超过80年的石英晶体行业累积经验和专业知识,为公司的起步奠定了坚实的基础。

ERP公司的发展小趣事

为了进一步拓展市场和提高竞争力,电子智链开始寻求与其他企业建立生态合作关系。公司与多家电子制造设备供应商、原材料供应商和物流服务商建立了战略合作关系,共同打造了一个覆盖电子产业全链条的生态圈。这一合作模式不仅为客户提供了更加全面和高效的解决方案,还促进了整个电子产业的协同发展。

CAROLCABLE公司的发展小趣事

CAROLCABLE公司的创立,标志着电子线缆行业迎来了一位新的竞争者。在电子科技飞速发展的时代背景下,创始人凭借对线缆技术的深刻理解和市场需求的敏锐洞察,决定创立CAROLCABLE公司。公司初期,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。然而,创始人凭借着坚定的信念和不懈的努力,带领团队克服了一个又一个困难。他们积极研发新产品,优化生产工艺,提高产品质量,逐渐在市场上站稳了脚跟。

随着公司业务的不断拓展,CAROLCABLE开始与一些知名的电子企业建立合作关系,为其提供高质量的线缆产品。这些合作不仅为公司带来了稳定的订单和收入,也进一步提升了CAROLCABLE在行业内的知名度和影响力。

Cal Test Electronics公司的发展小趣事

在市场竞争日益激烈的情况下,Cal Test Electronics不断拓展产品线,以满足不同客户的需求。公司研发团队致力于开发具有创新性和竞争力的新产品,同时在现有产品的基础上进行升级和优化。这些努力使得公司的产品线日益丰富,涵盖了七大连接类别中的3000多种产品。这些产品不仅在国内市场上受到欢迎,还逐渐走向国际市场。

问答坊 | AI 解惑

硬件设计鸡毛蒜皮之一

鸡毛蒜皮之一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K吧 点评:市场上不存在5K的阻值,最接近的是4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K高4倍和2倍。20%精度的电阻阻值只 ...…

查看全部问答>

RC有源带通滤波器的设计

RC有源带通滤波器的设计 …

查看全部问答>

3W LED驱动整流桥输入端开槽与否

对之前3*1W的线路板进行改版;整流桥输入端是否需要开槽(多宽?);一个专业工程师说不用开;桥堆本身就过了安规的;现在市面上我买的大多数产品,输入端也大多有开槽的; 不知道有经验人士怎么看待这个问题?…

查看全部问答>

如何将uboot linux内核 应用程序做成bin文件烧录

我自己做的一个嵌入式应用程序 现在我需要将uboot linux内核 然后和自己的应用程序 打包做成一个bin文件烧写入板子 请问应该怎么做啊? 本人对烧录知道的不多 请大家帮忙   说得越仔细越好   3Q…

查看全部问答>

WinCE驱动程序的存在形式及其意义

    所有基于WinCE的驱动程序都是以用户态下的dll文件的形式存在的。也就是说,一方面所有WinCE下的驱动程序都是运行在用户态下的,另一方面我们开发WinCE驱动程序的方法与开发普通的win32dll是完全一致的,还需要补充的一点就是所有的 ...…

查看全部问答>

能否不用IC自己做个简单的12V转5V的DC-DC转换电路?

想尽可能的降低成本,所以请教能否不用IC自己做个简单的12V转5V的DC-DC转换电路?…

查看全部问答>

分享我CRC校验的源代码给大家

-- ****************************************************************************--版权所有:www.eeleader.com--------------------------------------------------------------设计日期:2010.3.4------------------------------------------- ...…

查看全部问答>

D-LC谐振放大器D题172697592群

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 D-LC谐振放大器D题172697592群D-LC谐振放大器D题172697592群  …

查看全部问答>

STM32F107如何强制工作于设备模式

我在硬件设计的时候没有设计ID线,只需要STM32F107工作于设备模式即可,请问下如何让STM32F107强制工作在设备模式下呢,就是检测到VBUS以后能够上拉DP…

查看全部问答>

DCO_Library.h!如何正确使用?DCO产生标准的时钟信号!

我想利用DCO_Library.h 和DCO_Library.s43,通过DCO产生标准的时钟信号 根据DC0_ Library.h可以产生的标准的1MHz 或2MHz 但我使用时 有 Error[e46]: Undefined external \"TI_SetDCO\" referred in main ( E:\\桌面20120730\\Msp430\\铁电\\MSP430 ...…

查看全部问答>