stm32之SPI通信协议

news2024/9/19 10:43:46

文章目录

  • 前言
  • 一、SPI通信协议
    • 1.1 SPI简介
    • 1.2 SPI通信特点
    • 1.3 SPI与I2C对比
  • 二、SPI硬件电路
  • 三、SPI通信原理
  • 四、SPI时序单元
    • 4.1 起始和终止条件
    • 4.2 交换一个字节(模式1)
    • 4.3 交换一个字节(模式0)
    • 4.4 交换一个字节(模式2和3)
  • 五、SPI时序
    • 5.1 发送指令
    • 5.2 指定地址写
    • 5.3 指定地址读


前言

提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者

本文主要探讨SPI通信协议。关于SPI通信的内容我主要会分为两大块来讲,第一块,就是介绍协议规则,然后用软件模拟的形式来实现协议。第二块,就是介绍stm32的SPI外设,然后用硬件来实现协议。


一、SPI通信协议

1.1 SPI简介

SPI(Serial Peripheral Interface)是由 Motorola 公司开发的一种通用同步串行数据通信总线。它是一种广泛用于短距离通信的标准接口协议,主要用于微控制器与外设之间的通信,如传感器、显示屏、存储器模块等。

下图所示依次为Flash存储器,型号为W25Q64、OLED显示屏、2.4G无线通信模块,芯片型号为NRF24L01以及Micro SD卡,他们都支持SPI通信协议。

在这里插入图片描述

1.2 SPI通信特点

  • 同步通信: SPI 使用主设备(Master)产生的时钟信号(SCK)来同步数据传输,确保主从设备的数据通信在精确的时钟信号下进行。

  • 全双工通信: SPI 是全双工通信协议,可以同时进行数据的发送和接收。数据在两个方向上通过两条独立的线进行传输,使其能够实现高速通信。

  • 一主多从架构: SPI 通信支持一个主设备(Master)控制多个从设备(Slave)。主设备通过选择特定的从设备来进行通信,每个从设备都需要一个独立的从设备选择线(SS,Slave Select)来激活或禁用该设备。

1.3 SPI与I2C对比

以下是SPI与I2C通信特性的一些对比:

特性SPII2C
通信方式全双工半双工
通信线数4 根 (MOSI, MISO, SCK, SS)2 根 (SDA, SCL)
通信速度高速 (通常可达几 Mbps,部分设备可达几十 Mbps)低速至中速 (通常最高1Mbps,部分设备可达3.4Mbps)
协议复杂性较低,不需要地址解析和握手较高,需要处理器协议的握手、应答信号、地址解析
多设备支持支持,但需要为每个从设备单独配置 SS 线支持,通过 7 位或 10 位地址选择设备
总线长度较短,适合短距离高速通信较长,可支持长距离通信
同步时钟是,由 SCK 线提供是,由 SCL 线提供
硬件开销较高,需要 4 根线,且多个从设备需额外的 SS 线低,只需要 2 根线和上拉电阻
功耗较高,高速通信下功耗会增加较低,适合低功耗应用
主从关系固定的单主多从,主设备控制通信支持多主多从,主从角色可动态切换
可靠性较低,没有应答机制,无法检测从设备错误较高,具有应答机制,检测和处理错误较为简单
实现难度较低,协议简单,实现容易较高,协议复杂,实现较为困难
典型应用ADC、DAC、显示器、闪存、传感器、高速外围设备温度传感器、EEPROM、RTC、低速外围设备

简而言之就是:

I2C 适合多设备通信,低功耗和长距离应用场景,如传感器网络、低速外围设备等。其复杂的协议结构使其在多设备通信时具有优势,但在高速通信场景下,SPI 更为适合。

SPI 适合需要高速、全双工通信的应用场景,适合短距离、高速的数据传输,如存储器模块、显示屏等。虽然它需要更多的通信线和额外的 SS 线来选择从设备,但其简单性和高速性能使其在实时和高吞吐量应用中表现突出。

二、SPI硬件电路

在这里插入图片描述

上图所示为一个典型的SPI应用电路,下面我们来看一下这几根通信线。

  • SCK(Serial Clock): 串行时钟线,由主设备生成的时钟信号,用于同步数据传输。
  • MOSI(Master Output, Slave Input): 主设备输出、从设备输入线,用于主设备向从设备发送数据。
  • MISO(Master Input, Slave Output): 主设备输入、从设备输出线,用于从设备向主设备发送数据。
  • SS(Slave Select): 从设备选择线,由主设备控制,用于选择和激活特定的从设备。通常为低电平有效。

首先,SCK,时钟线。时钟线完全由主机掌控,所以对于主机来说,时钟线为输出,对于所有从机来说,时钟线都为输入,这样主机的同步时钟就能送到各个从机了。然后是MOSI,主机输出从机输入。数据传输方向是,主机通过MOSI输出,所有的从机通过MOSI输入。接着是MISO,主机输入从机输出。数据传输方向是,所有的从机通过MISO输出,主机通过MISO输入。

那到这里,SCK、MOSI、MISO的链接方式我们就清楚了。

为了确定通信的目标,主机需要另外引出多条SS控制线,分别接到各从机的SS引脚,主机的SS线都是输出,从机的SS线都是输入。SS线是低电平有效,主机想指定谁就把对应的SS线输出置低电平就行了。比如,主机初始化之后所有的SS都输出高电平,这样就是谁也不指定。假设主机需要和从机1进行通信,那主机直接将SS1线输出置低电平即可。当主机和从机1通信完成之后再把SS1置回高电平,这样从机1就知道主机结束了和我的通信了。

我们再来看一下SPI的引脚配置:输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入。

对于输出,我们配置为推挽输出。推挽输出,高低电平均有很强的驱动能力,这将使得SPI引脚信号的上升以及下降沿都非常迅速。得益于推挽输出的驱动能力使得SPI信号变化得很快,那自然它也就能达到更高的传输速度了。一般SPI都能轻松达到MHz的速度级别。

对比于I2C,I2C下降沿非常迅速,但是上升沿就比较缓慢了。I2C并不是不想使用更快的推挽输出,而是I2C要实现半双工,经常需要切换输入输出,而且I2C又要实现多主机的时钟同步和总线仲裁,这些功能都不允许I2C使用推挽输出,要不然一不小心就电源短路了。因此,I2C既然选择了更多的功能那就自然要放弃更强的性能了。

注意:在SPI协议里有一条规定,当从机的SS引脚为高电平也就是从机未被选中时,从机的MISO引脚必须切换为高阻态,高阻态就相当于引脚断开,不输出任何电平。在从机的SS线为低电平时,MISO才允许变为推挽输出。这样就可以防止一条线上有多个输出而导致电平冲突的问题了。

总结一下就是:
- 所有SPI设备的SCK、MOSI、MISO分别连在一起。
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚。
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入。

三、SPI通信原理

在讲时序单元之前我们先来看一下SPI的移位示意图,它是SPI硬件电路设计的核心,只要你把这个移位示意图搞懂了,那无论是上面的硬件电路还是等会要讲到的软件时序理解起来都会更加轻松。

在这里插入图片描述

SPI的基本收发电路就是使用了这样一个移位的模型。左边是SPI主机,里面有一个8位的移位寄存器,右边是SPI从机,里面也有一个8位的移位寄存器。移位寄存器这里有一个时钟输入端,因为SPI一般都是高位先行的,所以每来一个时钟移位寄存器都会向左进行移位,从机中的移位寄存器也是同理。移位寄存器的时钟源是由主机提供的,这里叫作波特率发生器。它产生的时钟驱动主机的移位寄存器进行移位,同时这个时钟也通过SCK引脚进行输出接到从机的移位寄存器里。

移位寄存器的接法是,主机移位寄存器左边移出去的数据通过MOSI引脚输入到从机移位寄存器的右边,从机移位寄存器左边移出去的数据通过MISO引脚输入到主机移位寄存器的右边,这样组成一个圈。

在这里插入图片描述

接下来我们来分析一下这个电路是如何工作的。

首先,我们规定波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出去的位放在引脚上。波特率发生器时钟的下降沿,引脚上的位采样输入到移位寄存器的最低位。现在我们假设主机有个数据10101010要发送到从机,同时,从机也有个数据01010101要发送到主机。

在这里插入图片描述

首先,主机驱动时钟产生一个上升沿,这时移位寄存器中所有的位都向左移动一位,然后从最高位移出去的数据就会被放到通信线上,数据放到通信线上实际上是放到了输出数据寄存器。

在这里插入图片描述

可以看到,此时MOSI的数据是1,所以MOSI的电平就是高电平,MISO的数据是0,所以MISO的电平就是低电平,这就是第一个时钟上升沿执行的结果。

在这里插入图片描述

之后,时钟继续运行,上升沿之后下一个边沿就是下降沿。在下降沿时主机和从机内都会进行数据采样输入。即MOSI的1会采样输入到从机移位寄存器的最低位,MISO的0会采样输入到主机移位寄存器的最低位,这就是第一个时钟结束后的结果。

在这里插入图片描述

那下一个时钟继续运行,下一个上升沿同样的操作,移位输出,随后,下降沿,数据采样输入。如此循环8个时钟即可完成一个字节的数据交换,交换的结果是主机的数据10101010发送到了从机的移位寄存器里,从机的数据01010101发送到了主机的移位寄存器里来,这就实现了主机和从机一个字节数据的交换了。实际上,SPI的运行过程就是这样,SPI的数据收发都是基于字节交换这个基本单元来进行的。

在这里插入图片描述

简而言之就是,SPI通信的基础是交换一个字节,有了交换一个字节就可以实现发送一个字节、接收一个字节以及发送同时接收一个字节这三种功能。

四、SPI时序单元

接下来我们来看一下数据传输的基本时序单元,这个基本时序单元就是建立在我们刚刚讲过的移位模型上的。那么这个基本单元什么时候开始移位?是上升沿移位还是下降沿移位的呢?这些SPI都没有限定死而是给了我们可以配置的选择,这样的话SPI就可以兼容更多的芯片。

SPI有两个可以配置的位,分别叫作 CPOL(Clock Polarity,时钟极性)CPHA(Clock Phase,时钟相位) ,CPOL 和 CPHA 是用于控制SPI总线数据采样和数据发送时序的两个关键配置,这两个参数决定了数据与时钟信号的关系,影响数据的采样和传输时机。

CPOL决定了SPI通信中空闲状态下时钟信号SCK的电平状态。当时钟信号没有进行数据传输时(空闲状态),SCK可以处于高电平或低电平,这由CPOL来决定。当CPOL = 0时,表示为空闲时SCK保持低电平,当CPOL = 1时,表示为空闲时SCK保持高电平。

CPHA决定了数据采样的时机,控制在时钟的哪个边沿进行数据采样。当CPHA = 0时,表示数据在第一个时钟边沿采样,当CPHA = 1时,表示数据在第二个时钟边沿采样。

如下表所示,CPOL和CPHA的不同组合决定了SPI通信的4种模式,每种模式定义了时钟和数据的同步方式。

模式CPOLCPHA时钟空闲时SCK电平SCK第一个边沿SCK第二个边沿
模式000低电平移入数据移出数据
模式101低电平移出数据移入数据
模式210高电平移入数据移出数据
模式311高电平移出数据移入数据

虽然模式有四种,但是它们的功能是一样的,在实际使用中模式0的应用是最多的,其他模式到时候用到了再回来查表就行了。ok,废话不多说,让我们先来看一下第一个基本时序单元吧。

4.1 起始和终止条件

在这里插入图片描述
起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平

简而言之就是SS低电平选中从机,然后SS低电平期间表示正在通信,SS高电平结束通信。

4.2 交换一个字节(模式1)

这个时序的基本功能是交换一个字节,接下来我们详细分析一下这个时序。

在这里插入图片描述

CPOL=0:空闲状态时,SCK为低电平。
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据。

首先是SS,从机选择。在通信开始前,SS为高电平,在通信过程中SS始终保持为低电平,通信结束SS恢复为高电平。

再来看一下MISO,主机输入从机输出。因为有多个从机输出连接了在一起,如果同时开启输出容易造成冲突。所以我们的解决方案是,在SS未被选中的状态下从机的MISO引脚必须关断输出,即配置输出为高阻状态。那在这里,SS高电平时,MISO用一条中间的线表示为高阻态。SS下降沿之后,从机的MISO被允许开启输出。SS上升沿之后,从机的MISO必须置回高阻态。

接下来我们看一下移位传输的操作。SCK第一个边沿,也就是上升沿,主机和从机同时移出数据,主机通过MOSI移出最高位,此时MOSI的电平就表示了主机要发送数据的B7。从机通过MISO移出最高位,此时MISO的电平表示从机要发送数据的B7。然后时钟运行产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样,主机移出的B7进入从机移位寄存器的最低位,从机移出的B7进入主机移位寄存器的最低位。

这样,一个时钟脉冲产生完毕,一个数据位也就传输完毕了。接下来就是同样的流程重复8次,这样一个字节的数据交换就完成了。如果主机只想交换一个字节,那这时就可以把SS重新置回高电平结束通信了。

4.3 交换一个字节(模式0)

在这里插入图片描述
CPOL=0:空闲状态时,SCK为低电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

模式0和模式1的区别,在时序上来看,模式0的数据移出移入的时机会比模式1提前半个时钟,也就是相位提前了。

模式0在SCK第一个边沿就要移入数据,但数据总得先移出再移入对吧?所以在模式0的配置下,SCK在第一个边沿之前就要提前开始移出数据了。所以趁SCK还没有变化,SS下降沿时,就要立刻触发移位输出。所以这里MOSI和MISO的输出是对齐到SS的下降沿的,或者说这里把SS的下降沿也当作时钟的一部分了。那SS下降沿触发了输出,SCK上升沿就可以采样输入数据了,这样B7就传输完毕。之后,SCK下降沿,移出B6,SCK上升沿,移入B6,然后继续,下降沿移出数据,上升沿移入数据,最终在第8个上升沿时B0位移入完毕,整个字节交换完成。

之后,SCK还有一个下降沿,如果主机只需要交换一个字节就结束的话,那在这个下降沿时MOSI可以置回默认电平或者不去管它。MISO也会变化一次,SS上升沿之后,从机的MISO置回高阻态,这就是SPI交换一个字节模式0。

总结一下就是,模式0和模式1的区别就在于,模式0把这个数据变化的时机给提前了。在实际应用中模式0的应用是最多的,所以我们重点掌握模式0即可。

4.4 交换一个字节(模式2和3)

1. 交换一个字节(模式2)

在这里插入图片描述

CPOL=1:空闲状态时,SCK为高电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

2. 交换一个字节(模式3)

在这里插入图片描述

CPOL=1:空闲状态时,SCK为高电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

五、SPI时序

SPI对字节流功能的规定不像I2C那样,I2C的规定一般是,有效数据流第一个字节是寄存器地址,之后依次是读写的数据,使用的是读写寄存器的模型,而在SPI中通常采用的是指令码加读写数据的模型。这个过程就是,SPI起始后第一个交换发送给从机的数据一般叫作指令码,在从机中对应的会定义一个指令集,当我们需要发送什么指令时就可以在起始后第一个字节发送指令集里面的数据,这样就能指导从机完成相应的功能了。

不同的指令可以有不同的数据个数,有的指令只需要一个字节的指令码就可以完成,比如W25Q64的写使能、写失能等指令。而有的指令后面就需要再跟读写的数据,比如W25Q64的写数据、读数据等。写数据,指令后面就得跟上写入的地址和数据,读数据,指令后面就得跟上读取的地址,这就是指令码加读写数据的模型。

由于每个芯片对SPI时序字节流功能的定义都不一样,在这里我们就以读写W25Q64存储器为例进行讲解。

5.1 发送指令

这个时序的功能是向SS指定的设备发送指令(0x06)

在这里我们使用的是SPI的模式0,模式0的规定是:
CPOL=0:空闲状态时,SCK为低电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

在W25Q64里面,0x06表示的是写使能。下图所示,由上至下依次为SS、SCK、MOSI、MISO,红色竖线用于间隔时序单元,绿色竖线用于标记读取数据的时刻。

在这里插入图片描述
在空闲状态时,SS为高电平,SCK为低电平,MOSI和MISO的默认电平没有严格规定。

首先,SS产生下降沿,时序开始。 在这个下降沿时刻MOSI和MISO就要开始变换数据了。由于MOSI指令码最高位依然是0,所以这里保持低电平不变。MISO,从机现在没有数据发给主机,引脚电平没有变化(实际上W25Q64不需要回传数据时手册里规定的是MISO仍然是高阻态,从机并没有开启输出,这里因为STM32的MISO是上拉输入,所以这里MISO呈现高电平

然后,SCK第一个上升沿,进行数据采样。 从机采样输入得到0,主机采样输入得到1。接着,SCK第一个下降沿,进行数据输出。 主机输出0,从机输出1。再接着,SCK第二个上升沿,进行数据采样,然后SCK第二个下降沿,进行数据输出 … 如此循环8次,在SCK第八个上升沿时完成一个字节数据交换。

最后,在SCK下降沿之后SS置回高电平,结束通信。

本次通信的结果就是,主机用0x06换来了从机的0xFF。当然实际上从机并没有输出,这个0xFF是默认的高电平,不过这个0xFF没有意义,我们可以不管它,这就是发送单字节指令的时序了。

5.2 指定地址写

这个时序的功能是向SS指定的设备,发送写指令(0x02),随后在指定地址(Address[23:0])下,写入指定数据(Data)

注意:这里的地址是24位3个字节的

在这里插入图片描述

指定地址写的时序跟上面我们讲的发送指令其实道理是差不多的。这些时序都是由一个个交换字节的时序单元组成的,不同的只是比如说上面发送指令之后就完事了,而这里是发送完指令之后要连续发送三个字节的地址指定写的位置,然后再发送一个写入的一个字节数据就行了,最后如果不想继续写就直接将SS置回高电平结束通信即可。

注意:SPI里也会有跟I2C一样的地址指针,每读写一个字节,地址指针自动加1。如果发送一个字节之后不终止,继续发送的字节就会依次写入到后续的存储空间里,这样就可以实现从指定地址开始写入多个字节了。

在这里插入图片描述
最终这条时序实现的功能就是在指定地址0x123456下写入数据0x55。

5.3 指定地址读

向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data)

在这里插入图片描述

同样的套路,起始之后主机发送的第一个字节0x33表示要读取数据,之后还是一样,主机依次交换三个字节地址,分别是0x12、0x34、0x56,组合到一起就是0x123456,代表24位地址。

紧接着,关键点来了,因为我们是要读取数据,指定地址之后显然我们就要开始接收数据了,我们需要随便发送一个数据进行交换(当然也不是随便发的,我们一般会发0XFF),然后从机就会把0x123456地址下的一个字节数据交换过来。如下所示,我们用0xFF跟从机交换了0x55,如果我们想要连续读取多个字节也是一样的道理,这里的指针每读取一次就会自动加1,这里我就不再累述了。

在这里插入图片描述
最后,如果主机不想继续读取数据了就可以把SS置回高电平,结束本次通信。这条时序最终的结果是,主机读取到从机0x123456地址下的数据为0x55。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件部署-Docker容器化技术

开始前的环境说明 VMware 17 Pro Centos release 7.9.2009(防火墙已关闭) Docker 26.1.4 Docker镜像加速器配置:"https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io", "https://dockerproxy.com", &…

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的…

十一、MySQL高级—工具和技巧拾遗~视图 VIEW(4)

🌻🌻 目录 一、是什么二、作用三、适用场景四、语法五、注意事项(适用5.5) 文章大纲 👇👇 一、是什么 将一段查询sql封装为一个虚拟的表。 这个虚拟表只保存了sql逻辑,不会保存任何查询结果。 二、作用 1、封装复杂sql…

开放式系统互连(OSI)模型的实际意义

0 前言 开放式系统互连(OSI,Open Systems Interconnection)模型,由国际标准化组织(ISO)在1984年提出,目的是为了促进不同厂商生产的网络设备之间的互操作性。 定义了一种在层之间进行协议实现…

EVO进行轨迹评估

EVO进行轨迹评估 文章目录 EVO进行轨迹评估1 前言1.1 轨迹对齐1.2 尺度变换1.3 绝对轨迹误差ATE和相对轨迹误差RTE1.4 绝对姿态误差APE和相对姿态误差RPE 2 安装evo2.1 evo安装2.2 相关报错2.2.1 版本不兼容问题2.2.2 解决PATH警告 2.3 测试 3 evo指令3.1 evo_traj3.2 evo_ape3…

深入理解单元测试

荐语 本文要介绍的是 2020 年 O’Reilly 出版的书籍 Unit Testing Principles, Practices, and Patterns,一本在豆瓣评分高达 9.9 的好书。 作为一名软件开发工程师,你应该对单元测试(unit test)很熟悉,但单元测试的目…

Scratch中秋节:中秋节赏月

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 作品推荐:中秋节赏月 | 一起享受中秋的美好时光 中秋佳节即将来临,一起感受传统节日的温馨氛围吧!小虎鲸Scratch资源站最新推出的节日作品《中秋节赏月》,将带你走进…

CTK框架(四): 插件编写

目录 1.生成插件 1.1.环境说明 1.2.服务类,纯虚类,提供接口 1.3.实现插件类,实现纯虚函数 1.4.激活插件,加入ctk框架的生命周期中 1.5.添加资源文件 1.6..pro文件 2.使用此插件 3.总结 1.生成插件 1.1.环境说明 编译ct…

【论文精读】 | 用于时间序列预测的通道对齐坚固的混合Transformer

文章目录 0、摘要1、介绍2、相关工作2.1 用于时间序列预测的Transformers2.2 用于时间序列预测的 RNN、MLP 和 CNN 模型 3、模型结构3.1 令牌化3.2 CARD 注意力胜过token3.3 CARD 注意力胜过渠道3.4 token 混合模块 4、基于信号衰减的损失函数5、实验5.1 长期预测5.2 基于重建的…

STM32——串口通信(发送/接收数据与中断函数应用)

文章目录 通信:串口通信简介:1.双工/单工:2.同步/异步:3.电平:电平标准: 串口参数以及数据帧时序:数据帧:1.波特率和比特率:例:无校验,1位停止位 …

B: 小球反弹

目录 一: 二: 三: 四: 一:问题描述 有一长方形,长为343720 单位长度,宽为233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所示且…

【MySQL】MySQL中表的增删改查——(基础篇)(超详解)

前言: 🌟🌟本期讲解关于MySQL中CDUD的基础操作,希望能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/fNldO 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 目录 …

Python Flask_APScheduler定时任务的正确(最佳)使用

描述 APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务,在使用过程当中也遇到很多问题,例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…

Transformer预测 | 基于Transformer心率时间序列预测(tensorflow)

效果一览 基本介绍 Transformer预测 | 基于Transformer心率时间序列预测(tensorflow) 程序设计 import pandas as pd from pandas.plotting import lag_plot from statsmodels.graphics

暴雨AMD,一起更YES

9月6日,暴雨信息联合AMD举办了“创新驱动 智能未来——2024年行业技术与应用分享会”。在这里,我们与行业领袖、技术专家们一起,深入探讨AI技术的前沿技术动态,洞悉高性能计算的发展趋势,在思维的碰撞和智慧的交融中&a…

BERT 论文逐段精读【论文精读】

BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想&#xff…

进程等待与退出

目录 前言 0.进程如何退出 1.进程status的获取 2.进程status的组成 3.退出status的分用与验证 4.解释一下errno与waitpid输中status参数的关系 5.status设计 前言 我们在编写程序的时候,我们往往需要知道这个程序中的某个进程执行情况是怎么样的&#xff…

我搞了一台switch

准确的说我搞了一台switch oled。为啥要买个游戏机呢?前些日子去轰趴馆团建,玩了一会switch,当时玩的游戏是《刺客信条3重制版》,感觉挺好玩的。我其实是手残党,很多网络游戏玩的都不是很好,而且大学的时候…

【阿一网络安全】如何让你的密码更安全?(二) - 非对称加密

上次《【阿一网络安全】如何让你的密码更安全?(一) - 对称加密》提到加密算法的对称加密,我们这次来聊聊非对称加密。 和对称加密不同,非对称加密的加密密钥和解密密钥不同。 非对称加密 大概过程就是,发送方使用公钥对明文数据…

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果&#xff1a; 解密后的数据就是正常数据&#xff1a; 后端&#xff1a;使用的是spring-cloud框架&#xff0c;在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…