历史上的今天
今天是: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
版权声明:本文为博主原创文章,转载请附上博文链接!
下一篇:stm32学习笔记(四)外部中断
史海拾趣
|
鸡毛蒜皮之一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K吧 点评:市场上不存在5K的阻值,最接近的是4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K高4倍和2倍。20%精度的电阻阻值只 ...… 查看全部问答> |
|
对之前3*1W的线路板进行改版;整流桥输入端是否需要开槽(多宽?);一个专业工程师说不用开;桥堆本身就过了安规的;现在市面上我买的大多数产品,输入端也大多有开槽的; 不知道有经验人士怎么看待这个问题?… 查看全部问答> |
|
如何将uboot linux内核 应用程序做成bin文件烧录 我自己做的一个嵌入式应用程序 现在我需要将uboot linux内核 然后和自己的应用程序 打包做成一个bin文件烧写入板子 请问应该怎么做啊? 本人对烧录知道的不多 请大家帮忙 说得越仔细越好 3Q… 查看全部问答> |
|
所有基于WinCE的驱动程序都是以用户态下的dll文件的形式存在的。也就是说,一方面所有WinCE下的驱动程序都是运行在用户态下的,另一方面我们开发WinCE驱动程序的方法与开发普通的win32dll是完全一致的,还需要补充的一点就是所有的 ...… 查看全部问答> |
|
-- ****************************************************************************--版权所有:www.eeleader.com--------------------------------------------------------------设计日期:2010.3.4------------------------------------------- ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 D-LC谐振放大器D题172697592群D-LC谐振放大器D题172697592群 … 查看全部问答> |
|
我在硬件设计的时候没有设计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 ...… 查看全部问答> |




