IWDG

1.Introduction

stm32 有两个嵌入式看门狗外设,一个是independent watch dog,一个是window watch dog 。IWDG 是由stm32内部LSI提供的低速时钟,即使主时钟发生故障也不会影响IWDG。WWDG clocked from APB1 ,而且至于WWDG能触发中断。

LSI(40KH)

2.IWDG main features

• Free-running downcounter
• clocked from an independent RC oscillator (can operate in Standby and Stop modes)
• Reset (if watchdog activated) when the downcounter value of 0x000 is reached

3.Function description

IWDG有四个寄存器分别是IWDG_KR,IWDG_RLR,IWDG_SR,IWDG_PR.

IWDG_PR和IWDG_RLR的write access是未使能的。我们可以通过向IWDG_KR写入0x5555使能write。

IWDG_PR设置IWDG的分频系数。

IWDG_SR更新IWDG_RLR和IWDG_PR的工作状态

向IWDG_KR写入0xCCCC,启动独立看门狗,看门狗计数器从0xFFF开始以设置的分频后的频率递减到0x000时,产生一个复位信号。如果在此之前向IWDG_KR写入0xAAAA,计数器将把IWDG_RLR中的值加载到计数器中,因此计数器不会递减到0x000,即不会产生复位信号。

溢出时间:

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

prer : 预分频系数 乘以4是因为s't'm32f1中定义000是4分频

rlr:是重装载值

4.Register

1.Key register (IWDG_KR)

必须以一定的间隔向IWDG_KR写0xAAAA,否则会Reset

写0x5555 使能寄存器IWDG_PR,IWDG_RLR

写0xCCCC start watch dog(除非使能了硬件看门狗)

2.Prescaler register (IWDG_PR)

IWDG_PR 后三位是设置其分频系数,如下:

3.Reload register(IWDG_RLR)

独立看门狗计数器重载值

4.Status register(IWDG_SR)

判断RLR和PR寄存器是否在工作

溢出时间

Tout = (4*2^PR[2:0])/40 单位s

 

附上IWDG初始化程序:

//start IWDG
WRITE_REG(hiwdg->Instance->KR,0x0000CCCC);

//write access
WRITE_REG(hiwdg->Instance->KR,0x00005555);

//set PR RLR
hiwdg->Instance->PR = Prescaler;//数,你设置的值
hiwdg->Instance->RLR= Reload;//常数,你设置的值

//上面是初始化

//refresh counter
WRITE_REG(hiwdg->Instance->KR,0x0000AAAA);

 

<think>首先,用户的问题是:“我想启用IWDG(独立看门狗)的配置或代码实现 请问如何启用STM32的IWDG独立看门狗”。这是一个关于STM32微控制器中IWDG(独立看门狗)的配置和代码实现的问题。 根据系统指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考提供的引用: - 引用[1]:解释了IWDG的作用和重要性。 - 引用[2]:描述了IWDG的基本功能和特性。 - 引用[3]:提供了一个IWDG初始化的函数代码示例。 - 引用[4]:解释了IWDG的工作原理。 用户的问题是如何启用STM32的IWDG独立看门狗。我需要基于引用内容,提供一个清晰的、逐步的指导。 步骤1:理解IWDG的作用。 IWDG用于检测和解决软件错误引起的故障。当计数器达到超时值时,会产生系统复位。如果定期“喂狗”(刷新计数器),系统就不会复位。 步骤2:配置IWDG的基本步骤。 从引用[3]和[4]: - 开启LSI(低速内部)振荡器作为时钟源。 - 等待LSI就绪。 - 解除IWDG寄存器的写保护。 - 设置预分频器(PR)以确定时钟频率。 - 设置重载值(RLR)以确定超时时间。 - 初始化喂狗。 - 启动看门狗并激活写保护。 步骤3:计算超时时间。 超时时间取决于预分频器和重载值。公式为: \[ T_{out} = \frac{4 \times 2^{PR} \times (RLR + 1)}{f_{LSI}} \] 其中: - \( T_{out} \) 是超时时间(秒)。 - PR 是预分频器值(0到7)。 - RLR 是重载值(0到4095)。 - \( f_{LSI} \) 是LSI时钟频率,通常为40kHz(但需参考具体芯片手册)。 在引用[3]的代码中,分频设置为32分频(PR=3),因为 \( 2^{PR} = 2^3 = 8 \),但实际预分频因子是 \( 4 \times 2^{PR} \),所以PR=3时是32分频。 步骤4:提供代码实现。 基于引用[3],我可以提供一个类似的代码示例,但需要确保语法正确并解释关键部分。 步骤5:结构化回答。 - 先解释IWDG的作用。 - 然后给出配置步骤。 - 提供代码示例。 - 解释如何计算超时时间。 - 最后生成相关问题。 步骤6:添加引用标识。 在解释或引用内容时,在末尾添加[^1]、[^2]等。 步骤7:生成相关问题。 在回答结束时,生成3-5个相关问题,如示例所示。 最终回答结构: 1. 介绍IWDG的作用。 2. 启用IWDG的步骤。 3. 代码实现示例。 4. 超时时间计算。 5. 相关问题。</think>### 启用STM32 IWDG独立看门狗的配置与实现 IWDG(独立看门狗)是STM32微控制器中的硬件安全机制,用于检测软件故障(如死循环或程序跑飞)。当计数器超时未刷新时,系统会自动复位,提高系统可靠性[^1][^2]。以下是启用IWDG的详细步骤和代码实现,基于STM32标准外设库(如STM32F1系列)。假设使用低速内部时钟(LSI,典型频率40kHz),具体值需查阅芯片手册。 #### 1. **IWDG工作原理简述** - IWDG是一个12位递减计数器,时钟源为LSI(独立于主时钟)。 - 计数器从重载值(RLR)递减至0时,触发系统复位。 - 需定期“喂狗”(刷新计数器)以防止复位。超时时间$T_{out}$由预分频器(PR)和重载值(RLR)决定[^4]。 #### 2. **启用IWDG的配置步骤** 启用IWDG需完成以下操作(确保在系统初始化阶段执行): - **步骤1:开启LSI时钟源** LSI是IWDG的时钟源,需在RCC寄存器中启用并等待就绪。 - **步骤2:解除IWDG寄存器写保护** 通过向键寄存器(KR)写入`0x5555`解除保护。 - **步骤3:设置预分频器(PR)** 决定时钟分频系数,影响计数速度。分频因子为$4 \times 2^{PR}$,PR值范围0–7。 - **步骤4:设置重载值(RLR)** 决定超时时间,RLR值范围0–4095。 - **步骤5:刷新计数器并启动IWDG** 首次喂狗(写入`0xAAAA`)后,启动看门狗(写入`0xCCCC`)并激活写保护。 - **步骤6:在主循环中定期喂狗** 避免计数器归零复位。 #### 3. **代码实现示例(基于STM32标准外设库)** 以下是一个完整的IWDG初始化函数,参数为超时时间(毫秒)。代码基于引用[^3]优化,确保可移植性。 ```c #include "stm32f10x.h" // 包含STM32头文件 // IWDG初始化函数 // 参数:timeout_ms - 超时时间(毫秒) void IWDG_Init(uint32_t timeout_ms) { // 步骤1:开启LSI时钟并等待就绪 RCC->CSR |= RCC_CSR_LSION; // 开启LSI振荡器 while (!(RCC->CSR & RCC_CSR_LSIRDY)); // 等待LSI就绪[^3] // 步骤2:解除IWDG寄存器写保护 IWDG->KR = 0x5555; // 解锁PR和RLR寄存器 while (IWDG->SR & IWDG_SR_PVU); // 等待预分频器更新就绪[^3] // 步骤3:设置预分频器(PR) // 分频因子 = 4 * 2^PR, 典型LSI=40kHz // PR值示例:0(4分频), 1(8分频), 2(16分频), 3(32分频), ..., 7(256分频) IWDG->PR = 3; // 默认32分频(时钟频率=40kHz/32=1.25kHz) // 步骤4:设置重载值(RLR) // 超时时间 T_out = (4 * 2^PR * (RLR + 1)) / f_LSI // 计算RLR:RLR = (timeout_ms * f_LSI) / (4000 * 2^PR) - 1 uint32_t f_lsi = 40000; // LSI典型值40kHz(需根据芯片手册调整) uint32_t clock_div = 4 * (1 << IWDG->PR); // 当前分频因子 IWDG->RLR = (timeout_ms * f_lsi) / (clock_div * 1000) - 1; // 计算并设置RLR // 步骤5:首次喂狗并启动IWDG IWDG->KR = 0xAAAA; // 刷新计数器(喂狗) IWDG->KR = 0xCCCC; // 启动IWDG并激活写保护[^4] } // 主循环中定期喂狗(例如放在while(1)内) void IWDG_Feed(void) { IWDG->KR = 0xAAAA; // 刷新计数器,防止复位 } ``` #### 4. **超时时间计算** 超时时间$T_{out}$(秒)由公式计算: $$ T_{out} = \frac{4 \times 2^{PR} \times (RLR + 1)}{f_{LSI}} $$ 其中: - $f_{LSI}$ 是LSI频率(通常40kHz)。 - $PR$ 是预分频器值(0–7)。 - $RLR$ 是重载值(0–4095)。 例如,设置$PR=3$(32分频)、$RLR=1249$、$f_{LSI}=40000$ Hz时: $$ T_{out} = \frac{4 \times 2^3 \times (1249 + 1)}{40000} = \frac{4 \times 8 \times 1250}{40000} = 1 \text{ 秒} $$ 在代码中,通过`IWDG_Init(1000)`可设置1秒超时[^3][^4]。 #### 5. **关键注意事项** - **时钟源**:LSI频率可能有±5%偏差,需在芯片手册中确认实际值。 - **喂狗时机**:在主循环或定时器中断中定期调用`IWDG_Feed()`,间隔小于超时时间。 - **调试影响**:在调试模式下,IWDG可能被暂停,需在IDE中配置。 - **应用场景**:适用于工业控制、车载设备等需高可靠性的系统[^1][^2]。 通过以上步骤,IWDG即可启用。实际开发中,建议结合STM32CubeMX工具生成初始化代码,并参考《STM32F10xxx参考手册》验证寄存器配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值