STM32F4 | 窗口门狗(WWDG)实验

news/2024/4/27 22:53:39/文章来源:https://blog.csdn.net/F4_Family/article/details/128336328

文章目录

    • 一、STM32F4 窗口看门狗简介
    • 二、硬件设计
    • 三、软件设计
    • 四、实验现象
    • 五、STM32CubeMX 配置 WWDG

  在本章中,我们将使用窗口看门狗的 中断功能来喂狗,通过 DS0DS1 提示程序的运行状态。

一、STM32F4 窗口看门狗简介

  窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。窗口看门狗工作示意图如下:
在这里插入图片描述
  图中,T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是窗口配置寄存器WWDG->CFR 的低七位。T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
  上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40,否则窗口就不存在了。
  窗口看门狗的超时公式如下:
Twwdg=(4096×2WDGTB×(T[5:0]+1))/Fpclk1Twwdg=(4096×2^{WDGTB}×(T[5:0]+1)) /Fpclk1Twwdg=(4096×2WDGTB×(T[5:0]+1))/Fpclk1
其中:

  • TwwdgWWDG 超时时间(单位为 ms
  • Fpclk1APB1 的时钟频率(单位为 Khz
  • WDGTBWWDG 的预分频系数
  • T[5:0]:窗口看门狗的计数器低 6 位

  根据上面的公式,假设 Fpclk1=45Mhz,那么可以得到最小-最大超时时间表如表所示:
在这里插入图片描述
  接下来,我们介绍窗口看门狗的 3 个寄存器:

  • 控制寄存器WWDG_CR
      该寄存器的各位描述如图所示:
    在这里插入图片描述
    可以看出,这里我们的 WWDG_CR 只有低八位有效,T[6:0]用来存储看门狗的计数器值,随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB)减 1。当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。

  • 配置寄存器WWDG_CFR
      该寄存器的各位描述如图所示:
    在这里插入图片描述
    该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 42MWDGTB 为 0 的条件下,该时间为 97.52us)内重新写 WWDG_CR,否则,看门狗将产生复位!

  • 状态寄存器WWDG_SR
      该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。它必须通过软件写 0 来清除。对此位写 1 无效。即使中断未被使能,在计数器的值达到 0X40的时候,此位也会被置 1。

  下面介绍如何启用 STM32F4 的窗口看门狗。这里我们介绍 HAL 中用中断的方式来喂狗的方法,窗口看门狗 HAL 库相关源码和定义分布在文件 stm32f4xx_hal_wwdg.c 文件和头文件 stm32f4xx_hal_wwdg.h 中。步骤如下:

  1. 使能 WWDG 时钟
      WWDG 不同于 IWDGIWDG 有自己独立的 32Khz 时钟,不存在使能问题。而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。方法是

    __HAL_RCC_WWDG_CLK_ENABLE(); //使能窗口看门狗时钟
    
  2. 设置窗口值,分频数和计数器初始值
      在 HAL 库中,这三个值都是通过函数 HAL_WWDG_Init 来设置的。该函数声明如下:

    HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
    

    该函数只有一个入口参数,就是 WWDG_HandleTypeDef 结构体类型指针变量。这里我们来看看 WWDG_HandleTypeDef 结构体定义:

    typedef struct
    {WWDG_TypeDef *Instance; WWDG_InitTypeDef Init; HAL_LockTypeDef Lock; __IO HAL_WWDG_StateTypeDef State; 
    }WWDG_HandleTypeDef;
    
    • 成员变量Init,它是 WWDG_InitTypeDef 结构体类型,该结构体定义如下:
      typedef struct
      {uint32_t Prescaler; //预分频系数uint32_t Window; //窗口值uint32_t Counter; //计数器值
      }WWDG_InitTypeDef;
      
      该结构体有 3 三个成员变量,分别用来设置 WWDG 的预分频系数,窗口之以及计数器值。

    函数 HAL_WWDG_Init 的使用范例如下:

    WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄WWDG_Handler.Instance=WWDG; //窗口看门狗
    WWDG_Handler.Init.Prescaler=WWDG_PRESCALER_8;//设置分频系数为 8
    WWDG_Handler.Init.Window=0X5F; //设置窗口值 0X5F
    WWDG_Handler.Init.Counter=0x7F; //设置计数器值 0x7F
    HAL_WWDG_Init(&WWDG_Handler); //初始化 WWDG
    
  3. 开启 WWDG
      HAL 库中开启 WWDG 的函数有两个:

    HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg);
    HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);
    

    函数 HAL_WWDG_Start 仅仅只是用来开启 WWDG,而函数 HAL_WWDG_Start_IT 除了启动 WWDG,还同时启动 WWDG中断。

  4. 使能中断通道并配置优先级(如果开启了 WWDG 中断)

    HAL_NVIC_SetPriority(WWDG_IRQn,2,3); //抢占优先级 2,子优先级为 3
    HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能窗口看门狗中断
    

    这里大家要注意, 跟串口一样HAL 库同样为看门狗提供了 MSP 回调函数HAL_WWDG_MspInit,一般情况下,步骤 1 和步骤 4 的步骤,是与 MCU 相关的,我们均放在该回调函数中。

  5. 编写中断服务函数
      编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则,当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。
      窗口看门狗中断服务函数为:

    void WWDG_IRQHandler(void);
    

      在 HAL 库中,喂狗函数为:

    HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t cnt);
    

    WWDG 的喂狗操作实际就是往 CR 寄存器重写计数器值,这里的第二个入口函数就是重写的计数器的值。

  6. 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_WakeupCallback
      跟串口和外部中断一样,首先,HAL 库定义了一个中断处理共用函数HAL_WWDG_IRQHandler,我们在 WWDG 中断服务函数中会调用该函数。同时该函数内部会经过一系列判断,最后调用回调函数HAL_WWDG_WakeupCallback,所以提前唤醒中断逻辑我们一般在回调函数 HAL_WWDG_WakeupCallback 中。 回调函数声明为:

    void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg);
    

完成了以上 6 个步骤之后,我们就可以使用 STM32F4 的窗口看门狗了。这一章的实验,我们将通过 DS0 来指示 STM32F4 是否被复位了,如果被复位了就会点亮 300ms。DS1 用来指示中断喂狗,每次中断喂狗翻转一次。

二、硬件设计

  本实验用到的硬件资源有:

  • 指示灯 DS0DS1
  • 窗口看门狗

其中指示灯前面介绍过了,窗口看门狗属于 STM32F429 的内部资源,只需要软件设置好即可正常工作。我们通过DS0DS1来指示STM32F429的复位情况和窗口看门狗的喂狗情况。

三、软件设计

  我们直接复制“独立看门狗实验”的工程模板,将复制过来的模板文件夹重新命名为“6-窗口看门狗实验”。在HARDWARE->WWDG 文件夹下面新建wwdg.c 文件以及头文件 wwdg.h
  打开wwdg.c 文件,代码如下:

#include "wwdg.h"
#include "led.h"WWDG_HandleTypeDef WWDG_Handler;     //窗口看门狗句柄//保存WWDG计数器的设置值,默认为最大
u8 WWDG_CNT=0X7F;//初始化窗口看门狗 	
//tr   :T[6:0],计数器值 
//wr   :W[6:0],窗口值 
//fprer:分频系数(WDGTB),仅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=45Mhz
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{WWDG_Handler.Instance=WWDG;WWDG_Handler.Init.Prescaler=fprer;   //设置分频系数WWDG_Handler.Init.Window=wr;         //设置窗口值WWDG_Handler.Init.Counter=tr;        //设置计数器值HAL_WWDG_Init(&WWDG_Handler);        //初始化WWDGHAL_WWDG_Start_IT(&WWDG_Handler);    //开启窗口看门狗,并开启WWDG中断
}//WWDG底层驱动,时钟配置,中断配置
//此函数会被HAL_WWDG_Init()调用
//hwwdg:窗口看门狗句柄
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{   __HAL_RCC_WWDG_CLK_ENABLE();    //使能窗口看门狗时钟HAL_NVIC_SetPriority(WWDG_IRQn,2,3);    //抢占优先级2,子优先级为3HAL_NVIC_EnableIRQ(WWDG_IRQn);          //使能窗口看门狗中断
}//窗口看门狗中断服务函数
void WWDG_IRQHandler(void)
{HAL_WWDG_IRQHandler(&WWDG_Handler);//调用WWDG共用中断处理函数
}//中断服务函数处理过程
//此函数会被HAL_WWDG_IRQHandler()调用
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{HAL_WWDG_Refresh(&WWDG_Handler,WWDG_CNT);//更新窗口看门狗值LED1=!LED1; 
}

其头文件wwdg.h

#ifndef __WWDG_H
#define __WWDG_H
#include "sys.h"void WWDG_Init(u8 tr,u8 wr,u32 fprer);
#endif

  wwdg.c 文件一共包含四个函数。第一个函数 WWDG_Init()实现的是前面讲解的步骤 1 和步骤 3,主要作用是调用函数 HAL_WWDG_Init 设置 WWDG 的分频系数,窗口值和计数器初始值,同时还调用HAL_WWDG_Start_IT 函数开启看门狗和使能看门狗中断。包括看门狗计数器的值和看门狗比较值等。第二个函数 HAL_WWDG_MspInitWWDGMSP 回调函数,该函数主要作用是使能 WWDG 时钟,以及设置 NVIC,实现的是前面讲解的步骤 2 和 4。第三个函数 WWDG_IRQHandler 也就是中断服务函数,该函数在前面步骤 5 有讲解,一般情况下,在该函数内部会调用中断共用处理函数 HAL_WWDG_IRQHandler 。第四个函数HAL_WWDG_WakeupCallback 是提前唤醒中断回调函数,该函数内部我们主要编写了喂狗操作以及LED1翻转。注意到这里有个全局变量WWDG_CNT,该变量用来保存最初设置WWDG_CR计数器的值。在后续的中断服务函数里面,就又通过 HAL_WWDG_Refresh 函数把该数值放回到 WWDG_CR 上。
  主函数main.c代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "wwdg.h"int main(void)
{HAL_Init();                     //初始化HAL库   Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhzdelay_init(180);                //初始化延时函数uart_init(115200);              //初始化USARTLED_Init();                     //初始化LED KEY_Init();                     //初始化按键LED0=0;                         //点亮LED0delay_ms(300);                  //延时300ms再初始化看门狗,LED0的变化"可见"WWDG_Init(0X7F,0X5F,WWDG_PRESCALER_8); //计数器值为7F,窗口寄存器为5F,分频数为8while(1){LED0=1;                     //熄灭LED灯 }
}

  该函数通过 LED0(DS0)来指示是否正在初始化。而 LED1(DS1)用来指示是否发生了中断。我们先让 LED0 亮 300ms,然后关闭以用于判断是否有复位发生了。在初始化 WWDG 之后,我们回到死循环,关闭 LED1,并等待看门狗中断的触发/复位。

四、实验现象

  使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),把编译后产生的.hex 文件烧入到芯片内。可以看到 DS0 亮一下之后熄灭,紧接着 DS1 开始不停的闪烁。

五、STM32CubeMX 配置 WWDG

  首先我们看看使能 WWDG 的方法,勾选上 Activated 选项即可使能 WWDG。操作方法如下图所示:
在这里插入图片描述
  接下来配置 WWDG 的三个参数,进入 Configuration->WWDG 界面,如下图所示:
在这里插入图片描述
  第一个参数是配置分频系数,这里我们配置为 8。第二个参数是配置窗口值,第三个参数是配置计数器初始值。配置好之后,因为我们要开启提前唤醒中断,所以这里我们要使能中断并配置 NVIC 中断优先级。进入 Configuration->NVIC 界面。配置方法如下图所示:
在这里插入图片描述
配置完成之后直接生成工程源码。在 main.c 文件中生成的 MX_WWDG_Init 函数和本实验的 WWDG_Init 函数实现功能类似。

/* WWDG init function */
void MX_WWDG_Init(void)
{hwwdg.Instance = WWDG;hwwdg.Init.Prescaler = WWDG_PRESCALER_8;hwwdg.Init.Window = 0x5F;hwwdg.Init.Counter = 0x7F;HAL_WWDG_Init(&hwwdg);}

stm32f4xx_it.c 中生成的中断服务函数和我们实验一致。

/**
* @brief This function handles Window watchdog interrupt.
*/
void WWDG_IRQHandler(void)
{/* USER CODE BEGIN WWDG_IRQn 0 *//* USER CODE END WWDG_IRQn 0 */HAL_WWDG_IRQHandler(&hwwdg);/* USER CODE BEGIN WWDG_IRQn 1 *//* USER CODE END WWDG_IRQn 1 */
}

stm32f4xx_hal_msp.c 文件中生成的 MSP 回调函数内容核我们实验内容一致。

void HAL_WWDG_MspInit(WWDG_HandleTypeDef* hwwdg)
{if(hwwdg->Instance==WWDG){/* USER CODE BEGIN WWDG_MspInit 0 *//* USER CODE END WWDG_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_WWDG_CLK_ENABLE();/* Peripheral interrupt init */HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);HAL_NVIC_EnableIRQ(WWDG_IRQn);/* USER CODE BEGIN WWDG_MspInit 1 *//* USER CODE END WWDG_MspInit 1 */}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_236352.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将PDF转换为PPT?2个免费好用的pdf转ppt工具

这个教程教你如何将PDF文件变成PowerPoint演示文稿文件。有几个不同的免费在线网站,您可以使用它们将PDF转换为PowerPoint演示文稿。请记住,扫描的 PDF(如扫描到计算机中的文档)无法转换为可编辑的 PowerPoint 演示文稿。 方法1、…

数据处理指令(二)—— 数据运算指令(加减乘)+ 逻辑运算指令(与或)+ 位清零(BIC)

无论是数据运算还是逻辑运算&#xff0c;需要满足如下格式&#xff1a; <操作码> <目标寄存器> <第一操作寄存器> <第二操作数> 操作码&#xff1a; 表示执行哪种操作&#xff08;加减乘&#xff09;目标寄存器&#xff1a; 用…

DVWA靶场安装

DVWA靶场安装1.环境准备2.安装步骤2.1.phpstudy安装2.2.DVWA安装2.2.1.下载DVWA2.2.2.解压DVWA2.2.3.放入服务器2.2.4.删除配置文件后缀2.2.5.修改配置文件2.2.6.访问DVWA2.2.7.报错修改2.2.8.修改php.ini2.2.9.重新访问DVWA2.2.10.登录DVWA3.修改过关等级1.环境准备 服务器环境…

SpringMVC:SpringMVC之JSON数据传输参数(5)

JSON数据传输参数1 JSON数据传输参数2 JSON普通数组3 JSON对象数据4 JSON对象数组5 小结1 JSON数据传输参数 现在比较流行的开发方式为异步调用。前后台以异步方式进行交换&#xff0c;传输的数据使用的是JSON,所以前端如果发送的是JSON数据&#xff0c;后端该如何接收? 对于…

【LeetCode每日一题:1785. 构成特定和需要添加的最少元素~~~数组公式推导+防止整型溢出+向上取整+贪心】

题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 abs(nums[i]) < limi…

小程序框架与生命周期

目录 框架 响应的数据绑定 页面管理 基础组件 丰富的 API 逻辑层 App Service 小程序的生命周期 注册页面 使用 Page 构造器注册页面 在页面中使用 behaviors 使用 Component 构造器构造页面 页面的生命周期 页面路由 页面栈 路由方式 注意事项 模块化 模块化…

用 Footprint Analytics 的数据 API 快速建立你的项目

Footprint 有一个独特的、非常灵活的API&#xff0c;允许你为数据分析建立成熟的数据管道&#xff0c;以及机器学习应用。这是通过提供两种类型的接口来实现的&#xff1a;第一种是用于将数据上传到平台&#xff08;Upload API&#xff09;&#xff1b;第二种是用于从平台获取数…

BI@report钻取操作

1.创建的表为浮动表 注意设置成浮动维单元格 把东西都选在红色框框里面 2.在对需要进行钻取的表元设置 设置参数 注意 参数是传递用的&#xff0c;值取的是当前表的值&#xff0c;这样参数可以带着这个表的值往下传 使用的是SQL数据源 在最后加上这行代码 having rso1.par…

3. 实例化Bean的三种方式

实例化Bean的三种方式 一、构造方法方式 1.1 BookDaoImpl package com.lin.dao.daoimpl;import com.lin.dao.BookDao;public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("BookDao的无参构造器");}/*** 数据层实现*/public …

【大数据技术Hadoop+Spark】MapReduce之单词计数和倒排索引实战(附源码和数据集 超详细)

源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、统计单词出现次数 单词计数是最简单也是最能体现MapReduce思想的程序之一&#xff0c;可以称为MapReduce版“Hello World。其主要功能是统计一系列文本文件中每个单词出现的次数 程序解析 首先MapReduce将文件拆分成spli…

CRM客户管理系统源码带手机端+Uniapp小程序源码+调试部署视频

一套Java大型CRM客户关系管理源码带手机端和小程序源码&#xff08;带调试部署视频&#xff09; 了解CRM源码更多信息可私信我。 相关技术&#xff1a; 1. 前端&#xff1a;Vue 2. 后端&#xff1a;Spring boot 3. 数据库&#xff1a;MySQL 4.小程序端&#xff1a;UNIAPP …

【JAVA程序设计】基于JAVA Swing的飞机票订票系统-有报告

基于JAVA Swing的飞机票订票系统零、项目获取一、项目简介二、开发环境三、项目结构四、运行截图零、项目获取 获取方式&#xff08;点击下载&#xff09;&#xff1a;是云猿实战 项目经过多人测试运行&#xff0c;可以确保100%成功运行。 一、项目简介 本项目是基于JAVA Sw…

MindFusion.Diagramming for JavaScript V4.2.4

MindFusion.Diagramming for JavaScript V4.2.4 现在支持使用套索工具进行缩放的多种方式。2022 年 12 月 15 日 - 15:44新版本特征 套索缩放工具- 该控件现在支持使用套索工具进行缩放的多种方式。新的“PanAndModify”行为允许您在鼠标指针悬停在某个项目上或平移视图时进行选…

Ac-GA-K(Ac)-AMC,577969-56-3

Ac- gak (Ac)-AMC&#xff0c;在蛋白酶偶联试验中测量组蛋白去乙酰化酶I类(HDAC 1、2、3和8)和II类(HDAC 6和10)活性的荧光底物。hdac催化Lys脱乙酰生成Ac-GAK-AM。 Ac-GAK(Ac)-AMC, fluorogenic substrate for measuring histone deacetylase class I (HDAC 1, 2, 3, and 8) a…

32-Vue之ECharts-雷达图

ECharts-雷达图前言雷达图特点雷达图的基本实现雷达图的常见效果显示数值区域面积绘制类型完整代码前言 本篇来学习写雷达图 雷达图特点 可以用来分析多个维度的数据与标准数据的对比情况 雷达图的基本实现 ECharts 最基本的代码结构定义各个维度的最大值准备具体产品的数…

深入Java线程池:从设计思想到源码解读

1. 前言 线程池深入详解 2. 初识线程池 我们知道&#xff0c;线程的创建和销毁都需要映射到操作系统&#xff0c;因此其代价是比较高昂的。出于避免频繁创建、销毁线程以及方便线程管理的需要&#xff0c;线程池应运而生。 2.1. 线程池优势 降低资源消耗&#xff1a;线程池…

前端基础_传统Web页面

传统Web页面 传统Web页面就是打开浏览器&#xff0c;整个页面都会打开的应用。例如&#xff0c;笔者的个人网站http://siwei.me就是一个典型的“传统Web应用”&#xff0c;每次单击其中任意一个链接&#xff0c;都会引起页面的整个刷新 传统的页面每次打开&#xff0c;都要把…

谷歌浏览器是最容易受到攻击的

©网络研究院 不幸的是&#xff0c;那些看起来越多&#xff0c;他们发现的越多&#xff0c;这个规则总是适用的&#xff0c;除了来自体育场的无节制的欢呼声。 Windows 比 Linux 更容易受到攻击&#xff0c;因为 Chrome 比 Edge 更容易受到攻击。这也是因为它们是最受欢迎…

详解即时通讯音视频开发实时语音通讯丢包补偿技术

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 现如今&#xff0c;随着移动互联网越来越普及&#xf…

NLP学习笔记(二) LSTM基本介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲长短期记忆网络 (Long Short-Term Memory, LSTM) 文章行文思路如下&#xff1a; 首先通过循环神经网络引出为啥需要长短期记忆网络然后介绍长短期记忆网络的核心思想与运作方式最后通过简短的代码深入理解长短期记忆网络的…