【STM32项目实战系列】基于STM32G474的看门狗驱动配置

前言:曾经刚开始学习单片机的时候,老是会听说一个关于看门狗的概念,猛地一听非常的懵逼,但是随着学习的深入发现这个东西其实就是一个硬件定时器,只不过是功能是为了监测系统运行的稳定性,如果出现系统异常就会触发复位,其作用被人们形象的称之为看门狗。哈哈,不过如此,虽然简单,但还是要介绍一下,仅供大家参考学习。


1,看门狗简介

看门狗是一种硬件定时器,用于监控系统的运行状态。如果系统由于软件错误或硬件故障导致无法正常工作时,看门狗会在设定的时间内未被“喂狗”(即重置定时器)时,自动复位系统,从而恢复系统的正常运行。

STM32G474提供了两种看门狗外设:

  • 独立看门狗(IWDG):基于独立的低速内部时钟(LSI),适用于需要高可靠性的场合。

  • 窗口看门狗(WWDG):基于APB1总线时钟,适用于需要精确时间窗口监控的场合。

以下详细介绍参考官方提供的参考手册:估计这大家读一篇就会对于这个外设功能有一个详细的了解。

1.1  独立看门狗(IWDG)

特性

  • 独立的时钟源:使用LSI(低速内部时钟),频率约为32 kHz,不受主时钟影响。

  • 可配置的预分频器:提供多种预分频系数,调整看门狗的计数周期。

  • 12位递减计数器:计数范围从0xFFF到0x000,当计数器达到0x000时,系统复位。

  • 硬件看门狗:即使系统进入低功耗模式,看门狗仍然有效。

配置步骤

  1. 使能IWDG:通过设置IWDG_KR寄存器为0xCCCC,启动独立看门狗。

  2. 配置预分频器:通过设置IWDG_PR寄存器,选择预分频系数。

  3. 设置重装载值:通过设置IWDG_RLR寄存器,设置计数器的初始值。

  4. 喂狗:通过向IWDG_KR寄存器写入0xAAAA,重置计数器。

详细介绍

1,这些设备具有嵌入式看门狗外围设备(IWDG),它提供了高安全性、时间准确性和使用灵活性的组合。该外围设备检测并解决由于软件故障而引起的故障,并在计数器达到给定超时值时触发系统复位。

2,该独立监控器由自己的专用低速时钟(LSI)计时,即使主时钟失效也能保持活动状态。

3,IWDG最适用于需要在主应用程序之外作为一个完全独立的进程运行,但具有较低时间准确性限制的应用程序。

IWDG 主要功能
1,自由运行计数器:由独立的RC振荡器定时(可在待机模式和停止模式下运行)
2,条件重置:当下计数器值低于0x000时重置(如果看门狗被激活),如果下计数器在窗口外重新加载,则重置(如果看门狗被激活)

1.2  窗口看门狗(WWDG)

特性

  • 基于APB1时钟:时钟频率较高,适用于需要精确时间窗口监控的场合。

  • 可配置的窗口值:设置一个时间窗口,只有在窗口内喂狗才有效,否则系统复位。

  • 6位递减计数器:计数范围从0x3F到0x40,当计数器达到0x3F时,系统复位。

  • 早期唤醒中断:可以在计数器达到0x40时产生中断,提前处理异常。

配置步骤

  • 使能WWDG:通过设置WWDG_CR寄存器的WDGA位,启动窗口看门狗。

  • 配置窗口值:通过设置WWDG_CFR寄存器的W位,设置窗口的上限值。

  • 设置计数器初始值:通过设置WWDG_CR寄存器的T位,设置计数器的初始值。

  • 喂狗:通过向WWDG_CR寄存器写入0x7F,重置计数器。

详细介绍:

1,系统窗口监视器(WWDG)用于检测软件故障的发生,通常由外部干扰或未预见的逻辑条件引起,导致应用程序放弃其正常序列。

2,监控电路会在预定时间到期时生成MCU复位,除非程序在T6位被清除之前刷新下计数器的值。

3,如果在下计数器达到窗口寄存器值之前刷新了7位下计数器值(在控制寄存器中),也会生成MCU复位。这意味着计数器必须在有限的时间窗口内刷新。

4,WWDG时钟是从APB时钟预分频的,并且具有可配置的时间窗口,可以编程以检测异常迟到的或提前的应用程序行为。

5,WWDG最适合需要监控器在精确的时间窗口内做出反应的应用。,

WWDG 主要功能:
1,可编程自由运行减计数器,

2,条件重置
- 复位(如果看门狗激活)当下计数器值低于0x40时
- 复位(如果看门狗激活)如果下计数器在窗口外重新加载

3,早期唤醒中断(EWI):当下计数器等于0x40时触发(如果已启用且看门狗激活)。


2,cubemx看门狗配置

这个配置方法我在前面的文章有过介绍,大家直接查看即可,我当时配置的是IWDG,不过两种配置方法大同小异。

【STM32项目实战系列】基于CUBEMX创建一个ST项目工程(详细版)_smbus-alert-mode-优快云博客


3,看门狗demo代码

虽然简单,还是拿出来供大家参考一下,这个基本上没有太多的比较难理解的东西,上面的这个概念理解了之后配置就是很简单的事情了。

3.1 独立看门狗(IWDG)配置示例

#include "stm32g4xx_hal.h"

IWDG_HandleTypeDef hiwdg;

void SystemClock_Config(void);
static void MX_IWDG_Init(void);

int main(void) {
    // 初始化HAL库
    HAL_Init();
    // 配置系统时钟
    SystemClock_Config();
    // 初始化IWDG
    MX_IWDG_Init();

    while (1) 
    {
        // 主循环中定期喂狗
        HAL_IWDG_Refresh(&hiwdg);
        // 模拟任务运行
        HAL_Delay(500); // 每500ms喂一次狗
    }
}

// IWDG初始化函数
static void MX_IWDG_Init(void) 
{
    hiwdg.Instance = IWDG;
    hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 预分频器为32
    hiwdg.Init.Reload = 1000;                 // 重装载值为1000
    if (HAL_IWDG_Init(&hiwdg) != HAL_OK) {
        // 初始化错误处理
        Error_Handler();
    }
}

3.2  窗口看门狗(WWDG)配置示例

#include "stm32g4xx_hal.h"

WWDG_HandleTypeDef hwwdg;

void SystemClock_Config(void);
static void MX_WWDG_Init(void);

int main(void) 
{
    // 初始化HAL库
    HAL_Init();
    // 配置系统时钟
    SystemClock_Config();
    // 初始化WWDG
    MX_WWDG_Init();

    while (1) {
        // 主循环中定期喂狗
        HAL_WWDG_Refresh(&hwwdg);
        // 模拟任务运行
        HAL_Delay(50); // 每50ms喂一次狗
    }
}

// WWDG初始化函数
static void MX_WWDG_Init(void) 
{
    hwwdg.Instance = WWDG;
    hwwdg.Init.Prescaler = WWDG_PRESCALER_8; // 预分频器为8
    hwwdg.Init.Window = 0x50;               // 窗口值为0x50
    hwwdg.Init.Counter = 0x7F;              // 计数器初始值为0x7F
    hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;  // 禁用早期唤醒中断
    if (HAL_WWDG_Init(&hwwdg) != HAL_OK) {
        // 初始化错误处理
        Error_Handler();
    }
}


// 错误处理函数
void Error_Handler(void) {
    while (1) {
        // 错误处理逻辑
    }
}

完结。。。

<think>好的,我现在需要帮用户解答如何使用STM32制作T12焊台的问题。首先,用户提到了两个引用,一个是关于STM32智能照明控制系统的I2C配置,另一个是STM32_T12_Controller项目的推荐。我需要结合这些信息来提供教程和资源。 首先,我应该先理解用户的需求。用户想制作一个T12焊台,使用STM32开发。T12焊台的核心是控制加热器的温度,这需要用到PID算法、PWM输出、ADC读取温度信号,以及可能的OLED显示和按键输入等功能。 接下来,我需要参考用户提供的引用。引用[1]中提到了使用STM32CubeMX配置I2C引脚,并生成代码导入到IDE中。这可能和T12焊台中可能用到的I2C设备有关,比如OLED显示屏或者温度传感器。引用[2]则直接指向了一个具体的项目STM32_T12_Controller,这可能是一个开源的T12控制器项目,用户可以去查看代码和文档。 现在,我需要将这些信息整合成一个步骤指南。首先,硬件部分需要列出所需的元件,比如STM32开发板、T12烙铁头、运放电路、MOS管、电源等。然后软件部分需要配置STM32CubeMX,设置PWM、ADC、定时器、I2C等外设,并生成代码。接着,编写PID控制算法,处理温度信号,实现用户界面等。 另外,用户可能需要了解如何获取相关资源,比如推荐的项目链接、教程文档以及开发工具的使用。需要确保提到的步骤清晰,并且引导用户参考已有的项目,这样可以节省他们的时间,避免重复造轮子。 还需要考虑用户可能遇到的问题,比如PID参数的调整,硬件电路的设计注意事项,或者如何连接OLED显示。这些问题可能在相关项目中已经有解决方案,可以建议用户查阅项目文档或代码。 最后,生成相关问题,帮助用户深入理解,比如如何优化温度控制,如何添加功能,或者故障排除的方法。这些问题应该基于制作T12焊台过程中常见的难点和扩展需求。 总结一下,我需要按照硬件准备、软件配置、代码实现、资源推荐的步骤来组织回答,并确保引用提供的项目和信息被正确利用,同时语言要简洁明了,适合开发者参考。</think>### 使用STM32开发T12焊台的教程与资源 #### 1. **硬件设计与关键组件** - **核心控制器**:STM32F103C8T6(性价比高,资源丰富)或STM32G0系列(低功耗)[^2] - **T12烙铁头**:集成热电偶,需通过运放电路(如LM358)放大微伏级温度信号 - **功率驱动**:MOS管(如IRF3205)控制加热电源,需配合PWM信号调节占空比 - **电源模块**:24V/5A以上开关电源,建议添加过流保护电路 - **人机交互**:OLED屏幕(I2C/SPI接口)、旋转编码器或按键 #### 2. **软件配置步骤** **步骤1:STM32CubeMX配置** - 启用PWM输出(TIMx_CHx)控制MOS管,频率建议1-10kHz - 配置ADC采集温度信号(12位分辨率,DMA模式提高效率) - 设置定时器中断(如1ms周期)用于PID计算 - 若使用OLED,配置I2C/SPI接口(参考引用[1]的引脚配置方法) **步骤2:生成代码框架** ```bash # 生成工程后导入IDE(如STM32CubeIDE/Keil) # 添加用户代码至标记区域(/* USER CODE BEGIN */) ``` #### 3. **核心代码实现** **PID温度控制算法** ```c // PID结构体定义 typedef struct { float Kp, Ki, Kd; float integral, prev_error; } PID_Controller; float PID_Update(PID_Controller *pid, float setpoint, float measured) { float error = setpoint - measured; pid->integral += error * dt; // dt为采样时间 float derivative = (error - pid->prev_error) / dt; pid->prev_error = error; return pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative; } ``` **ADC温度换算** $$ V_{temp} = \frac{ADC_{value} \times V_{ref}}{4095} $$ 通过查表法或公式将电压值转换为温度值(需校准T12热电偶特性曲线) #### 4. **推荐资源与项目** 1. **开源项目参考** - **STM32_T12_Controller**:[项目地址](https://gitcode.com/gh_mirrors/st/STM32_T12_Controller) 包含完整硬件原理图、PCB设计文件与嵌入式代码,支持多语言菜单和自动休眠功能 2. **关键文档** - 《T12热电偶特性手册》 - 《STM32CubeMX用户指南》(配置外设必备) - 《PID整定方法实战》 3. **开发工具链** - STM32CubeMX + STM32CubeIDE(官方工具链) - LogicAnalyzer(调试PWM/通信时序) - Saleae逻辑分析仪(验证ADC采样精度) #### 5. **关键调试技巧** - **PID参数整定**:先设$K_i=0, K_d=0$,逐步增加$K_p$至系统震荡,取50%作为初始值 - **噪声抑制**:ADC输入添加RC低通滤波,软件端采用移动平均滤波 - **安全保护**:在代码中添加最大占空比限制和硬件看门狗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是星凡呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值