王者农药更新版

GPIO简介

STM32开发板有5组GPIO引脚,分别是GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,每组GPIO有16个引脚。

每个引脚都有4个位来配置其端口,可以配置出不同的输入\输出模式。

1、普通推挽输出(GPIO_Mode_Out_PP):

使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。

使用方法:直接使用

输出电平:推挽输出的低电平是0V,高电平是3.3V。

2、普通开漏输出(GPIO_Mode_Out_OD):

使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。

使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。

输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则既不输出高电平 也不输出低电平,为高组态。为正常使用,必须在外部接一个上拉电 阻。

特性: 它具“线与”特性,即很多个开漏模式 引脚连接到一起时,只有当所有 引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部 上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当 于短路接地,使得整条线路都为低电平,0 伏。

3、复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。

4、复用开漏输出(GPIO_Mode_AF_OD):用在IIC。

所有的开漏输出都需要接上拉电阻。

5.模拟输入(GPIO_Mode_AIN):将物理信号(例如:声音、光线等)转换成模拟数字,多用于ADC模数转换。

6.浮空输入(GPIO_Mode_IN_FLOATING):一般指输入端口没有固定的电平值。

7.下拉输入(GPIO_Mode_IPD):当输入端口没有输入高电平时,输入端口一直保持低电平。

8.上拉输入(GPIO_Mode_IPU):当输入端口没有输入低电平时,输入端口一直保持高电平

APB1与APB2

APB1是低速总线,最大允许频率为36MHz,而APB2是高速总线,最大允许频率为72MHz

这意味着APB2能够支持更高的数据传输速率,适合需要高速处理的外设,如GPIO等

一、启动文件配置

二、GPIO使用

14759a9178074fbab3bd918ca69e301d.png 2.1基本步骤

1.RCC开启APB2下的GPIOA时钟(我们把led接到GPIOA的pin0引脚)

2.GPIO初始化(结构体,设置成推挽输出)

3.给GPIO引脚设置高/低电平(WriteBit)

2.2Led循环点亮(GPIO输出)

1.RCC开启APB2下GPIOA时钟。

RCC_APB2PeriphClockCmd(GPIOA,ENABLE)

2.GPIO_init初始化GPIO。设置推挽输出模式,

GPIO_PIN0 | GPIO_PIN1可以同时初始化。

3.GPIO输出

GPIO_ResetBits给GPIO端口设为低电平(led点亮)

GPIO_SetBits给GPIO端口设为高电平(熄灭)

GPIO_WriteBit(),第三个参数决定

51ae154c4845412cba99a04552455597.jpg

5、添加延时函数

6、循环点亮

ae634e2b49a04908a0a953f5d49dfc78.jpg

 2.3按键控制两个led(GPIO输入)

Led:

1.RCC开启APB2下GPIOA时钟

2.GPIOA初始化,默认设置为高电平

3.写函数分别控制GPIOA对应引脚的高/低电平,为之后按键控制做准备

按键:

1.RCC开启APB2下GPIOB时钟(按键放在GPIOB的pin1引脚)

2.GPIOB初始化,设置成上拉输入,端口保持高电平

3.GPIOB读取输入信息,按键按下时读取为0

GPIO_ReadInputDataBit,代表输入寄存器的某个端口的值

0代表按下,防抖,如果不松开按键一直循环,松开按键后,跳出循环,再防抖,修改变量KeyNum的值代表按下pin_1对应的按键了。

GPIO_ReadInputData,代表整个输入寄存器。

1c4fe8622f6c4566b73459a8b457c1d6.jpg

 4.反转

GPIO_ReadOutputDataBit,输入的是什么,输出什么,输出0时,设为高电平灯灭。

58ede2fe11f241d5823c91cb604ee8a9.jpg

 三、显示屏(OLED)

3.1调试方法

1.串口调试

2.显示屏调试

3.keil调试

3.2显示屏调试(OLED)

c59f059ed0214a519e8431b58ffd1975.jpg

参数:行,列,值,(长度)

采用IIC或SPI协议。这里采用IIC,IIC有两个引脚SCL,SDA

1.RCC打开APB2下GPIOB时钟

2.GPIOB初始化,要注意SCL和SDA对应GPIOB引脚都要初始化,这里是pin8和pin9,设置为开漏输出(因为采用IIC协议,后续IIC解释)

3.引脚配置,默认SCL和SDA两个引脚都配置为高电平

e77f371b5b3f4e079b87ae0a9b0c6962.jpg

9c597040741343469051b117d39cbc16.jpg

 4.最后通过导入OLED.h显示

四、EXTI中断

4.1stm32中断

中断方法有很多,EXTI,TIM,ADC,USART,IIC

6395a5f47f044cdeae85313c0f0643ba.jpg

NVIC用来决定优先级。

4.2中断基本步骤

3b69ff15a61e4b7f9c484b8a011f6805.png

 

a0b1a3ff38ba4c0c9ba20f3670e022cc.jpg

1.RCC开启APB2下的GPIO和AFIO的时钟,EXTI和NVIC默认是开着的

2.GPIO初始化(结构体)

3.AFIO配置,用来选择哪个GPIO,GPIO的哪个引脚发生中断,用GPIO_EXTILineConfig(GPIO中断线引脚)

4.EXTI中断配置,EXTI初始化——EXTI_Init函数(结构体)

5.NVIC优先级组配置和初始化,通过对优先级分组来决定优先级,使用NVIC_PriorityGroupConfig,之后进行NVIC初始化——NVIC_Init

4.3具体步骤

1.RCC时钟配置,主要GPIO和AFIO。EXIT和NVIC是一直打开时钟的,不需要配置

924a3378b20f4587894fd451de500278.jpg

2.GPIO配置初始化,上拉输入

dfd2d58ccb134028bf778569fdf7aeac.jpg

3.AFIO配置

第二个是选择中断引脚

第一个是重映射,先不用

715f3c63473f4147bd6361c15ead770c.jpg

 ea5f3b1790c841bdbcaee60bf1938a98.jpg

4.EXTI配置

936e4730583844e7be3d5d4aeae53b34.jpg

 b058539a4d8441cb9eb98b47264dbc45.jpg

 Mode选中断模式,还有个事件模式

Triggle分为上升沿触发(从低电平到高电平),下降沿触发(从高电平到低电平触发,选这个)和上升下降沿触发

5.NVIC配置 49281e4789334430b399c218a952a0a2.jpg

 65d0122a8f9e49eab23041e5633bf716.jpg

 先分组,这里分到组2,也可以选其他组,然后NVIC初始化。

6.中断配置好了,接下来让cpu从主程序跳到中断程序,中断函数的名字固定的

f571d814ade5404681754057050360a7.jpg

先判断中断标志位是不是pin14,如果是,执行中断程序,最后中断标志位清空,否则一直循环中断程序。

挡光片遮挡后,led灯会触发中断,灯灭

五、TIM定时中断

5.1基本步骤

d5df518ee76344ee92dd051881ae2f3f.png

4a719d7fdb68488f82495a79df9d5aae.jpg

1.TIM1和TIM8是高级定时器,TIM2-5是通用定时器,TIM6和TIM7是基本定时器。这个芯片只有TIM1-4,这里用的是TIM2通用定时器。所以RCC打开TIM2对应的APB1(低速外设)时钟。

2.TIM配置内部时钟/ETR外部时钟/ITRX其他定时器/TIx捕获通道,这里使用内部时钟,内部时钟使用TIM_InternalClockConfig。

(RCC掌管外设时钟,TIM定时器是外设)

3.时基单元初始化(结构体),TIM_TimeBaseInit

4.中断输出控制,定时器很多地方都需要申请中断,使用TIM_ITConfig

5.配置NVIC,有中断就有优先级,优先级+初始化

6.运行控制,放最后定时器运行,TIM_Cmd

5.2具体步骤

1.配置GPIO时钟

f9d0f3b9035948f9927babf348a74e25.jpg

 

2.配置RCC内部时钟/ETR外部时钟/ITRX其他定时器/TIx捕获通道

fda315c920b24e7eaeec80b51be1b7cc.jpg

 e720ec6c337b4fbab55690a6ac01d2c1.jpg

 

3.配置内部时钟模式/外部时钟模式2/外部时钟模式1/编码器模式

4.配置时基单元和运行控制(放最后)

e15c5e4ee1f64cd68add91883959409e.jpg

 1bfcf4e397b346e180e9b3545557e365.jpg

 414dba3795a9455fa831bf811be9f4c0.jpg

 

5.配置中断输出控制

44f981bfd9b64434a3be8a12479dbe13.jpg

 fe1440a2305f4289ab62b02191db5263.jpg

 

6.配置NVIC

0fd2000f360f43a7b3d51a065f00311c.jpg

 7.计数

63c8a0fbec3b456cb99ae1101a72b07d.jpg

 六、TIM输出比较

6.1TIM输出比较与PWM

fb726897cfa6445caaf5361c610e1e1d.jpg

 f735897061ac41c59b16788c45bab69d.jpg

 PWM(Pulse Width Modulation),即脉冲宽度调制,是一种模拟电路数字控制技术。它通过改变脉冲信号的占空比(即脉冲宽度与周期的比值)来等效地获得所需的模拟量(电压或电流)输出。

6.2呼吸灯实现的基本步骤

5e55b2d07cca401b8aba52374279148c.png

1.因为要用到GPIO和TIM,所以RCC需要打开APB2和APB1的时钟

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2.GPIO初始化(led灯)

3.开启TIM2内部时钟

4.时基单元初始化

5.输出比较(oc)单元初始化TIM_OC1Init

6.运行控制

7.修改占空比,TIM_SetCompare1函数可以设置CCR的值(1是因为OC1通道1)

 

6.3具体步骤

1.RCC开启GPIO和TIM时钟

2.配置时基单元

5150ae6988314330b20590dabab6f0ed.jpg

3.配置输出比较单元

824c86ae81364b928a1410a024df3c36.jpg

 fa681ce0f05c4523b5c88c6570326481.jpg

 IIM_OCInitTypedef结构体有很多属性,有一些高级定时器用的,我们不用配置,所以需要给这些初始化,用TIM_OCStructInit,然后把需要的配置。

注:这里初始化是TIM_OC1Init,用于初始化定时器的输出比较通道1。每个定时器的输出比较总共有4个通道

4.配置GPIO,复用推挽输出

3c73e3e12d9a4146a6e04fae84812a8a.jpg

 我们在GPIO,PA0引脚,所以输出比较单元用的TIM_OC1Init。这里配置PA0。

43cc1f942dfe471d82b90568e8195307.jpg

5.运行控制(TIM_Cmd)

8c2869f98d974fe59a916c735b8ff46a.jpg

 6.参数计算

43627ca1d1e94fad8ae87b0f9f60ee77.jpg

4cf70a48b6c741ebba256c899fb8d6eb.jpgda2c91b98902417fb88abbb460ffbcaa.jpg 7.呼吸灯

5add23b510674b1180cabbc1654c0aee.jpg 6df5c9cbf2ad4313b26aaaad644e6ba3.jpg

 

当CCR大的时候亮,小的时候暗,所以要实现呼吸灯,需要不断改变CCR的值,用TIM_SetComparel函数可以设置CCR的值,主循环中让它逐渐增大,然后逐渐减少。

8.拓展——重映射

9e8973d3bf2e4d2bb40e096bd75dbf1f.jpg

 

6.4舵机控制

eb411809ef844e209bd2ed07cc2162df.jpg

和呼吸灯步骤一样,只需要修改通道和占空比即可,分别是OC2Init()和TIM_SetCompare2(TIM2, Compare)。呼吸灯是TIM_SetCompare1。

七、输入捕获

7.1测频率基本步骤

765dcc6d17524c73a4c81834cc3c5d93.jpg

1.RCC开启GPIO和TIM的时钟

2.GPIO初始化,配置成输入模式

3.时基单元初始化

4.输入捕获单元初始化

5.配置触发源,这里使用FI1PF1触发源

6.配置从模式Reset

7.运行控制

7.2具体步骤

1.RCC开启GPIO和TIM的时钟

2.GPIO初始化,配置成输入模式

b18e2685593244e4912cf029e1a38c41.jpg

b5c9c2fdcddf4c1ebbfc555cc14aeb3d.jpg

 3.时基单元初始化

bc94d70c3499471eb9410948a689c364.jpg

4.输入捕获单元初始化

23de35b4c457462dacfeeddb3054d45f.jpg

 这是只测频率,所以使用ICInit即可,ICSelection选择直联通道。

 

5.配置触发源,这里使用FI1PF1触发源

3ef4dd0dcef14e6e8d3d1b98f6998f16.jpg

 

6.配置从模式Reset

fa44c2726f19495abe5053e709ff349f.jpg

 

7.运行控制

7c2b07b3a9d849d1b96b7de254b9898b.jpg

 7.3测频率和占空比

1d2b7a592dfe41aea02c79f7deb52e22.jpg

 把TIM_ICInit函数换成TIM_PWMIConfig函数,这个函数能同时初始化两个通道。这里通道1是直联和上升沿,默认配置通道2是交叉和下降沿,与通道1正好相反。

八、USART串口通信协议

8.1常见通信协议

feabe1dc30484abf8672acda63cc3771.jpg

 半双工:A能给B发数据,B也能给A发数据,但是不能同时发。

全双工:A能给B发数据,B也能给A发数据,而且能同时发。

同步:通信双方有一个共同的时钟信号,通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

异步:数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步。

8.2串口通信方式

c1642a4171224e7da4f118d333964a52.jpg

 两个设备之间发送端和接收端交叉连接。

因为两个设备可能要不同的电平,中间可以加电平转化芯片,本芯片采用TTL电平——3.3V

e9bfd01055c34091924e6aab5db72030.jpg

设备1给设备2发送数据:假设设备1每一秒发送一次高电平(3.3V)或低电平(0V),设备2就必须每一秒接受一次,如果时间不一样,可能重复或错过。

这个每秒发送一次数据就叫波特率。如果发送的高电平,则接受到1,如果是低电平,则接受到0。

7e38f75d71f74ef2b6dd47ba9f311253.jpg

8.3串口发送+接收数据基本步骤

54bf551f9d8648c18b4c573851131cd3.jpg

 dbc867c6714f4b069888f733fddcdcd2.png

1.RCC开启USART1和GPIO时钟

2.GPIO初始化,TX配置成复用输出,RX配置成输入

3.USART初始化

4.如果只发送,直接开启USART即可。如果还要接收数据,则需要配置中断。

5.中断输出控制(发送+接收)

6.NVIC(发送+接收)

8.4具体步骤

1.RCC开启USART1和GPIO时钟

b0d307a245774c5e84f895f3a8402785.jpg

 2.GPIO初始化,TX配置成复用输出,RX配置成输入

1857152cb8fd44fda27d000f8c73ec35.jpg

 3.USART初始化

d20f76f92b65476bb41a4f1659f1541b.jpg

 4.运行控制USART

bfbeaaed04404416bf4766d58852b766.jpg

 5.上面已经可以发送了,现在发送数据

发送之后到TDR,需要等待一段时间,等TDR的数据传到移位寄存器后,再发送下一次数据,如果不等待,可能造成数据覆盖。标志状态为reset时一直循环等待

07656c1777f04b08ad39bed0cc89d5c0.jpg

6.如果还要接收数据,需要中断,并且串口初始化时,需要把接收数据的模式加上

5a81af7f371a434cb30e0f2479f9c75c.jpg

 3827e12e65ec4b1b9d1b9f85d2925d5e.jpg

九、I2C

9.1串口通信缺点

如果只有两个设备通信,设置一组串口

设备1  ——  设备2

如果有三个设备需要通信,则每个设备都需要设置两组串口

设备1——设备2

设备1——设备3

设备2——设备3

如果更多设备需要通信,则需要设置更多串口,线路连接更加复杂。为此,设计了一种总线通信方式,包含多种协议,如I2C,SPI,CAN等

9.2 I2C通信方式

I2C(又叫IIC),意思是芯片与芯片之间的通信。采用一主多从的方式,例如把单片机作为主机,其他设备做为从机。

串口通信使用发送线TX和接收线RX进行通信,而IIC使用时钟线SCL和数据线SDA通信。

SCL:————————————

SDA:————————————

设备:主   从   从   从   ....

9.3 I2C发送数据

28e25b03293b4989990a1306b5dc0261.jpg

起始位为0时,代表单片机给从设备写数据

起始位为1时,代表单片机从从设备读数据

空闲状态:SCL和SDA都保持高电平

起始状态:SDA先切换为低电平,SCL后切换为低电平。(起始位为0时,代表单片机给从设备写数据,所以SDA变成低电平)

发送数据:根据要发送的数据,把SDL先切换为高电平1或低电平0,之后SCL切换为高电平。发送一个1或0后,SCL再切换为低电平。

75aa3ffc8b9d439295ad1de5f4da92e9.jpg

通过发送数据,就可以发送设备地址。

设备地址有7位,每个从设备都有自己的设备地址,假设一个从设备的设备地址为1010000

两个线的高低电平如下

f6ee52fb0e1f43cdb773f43abd9691ce.jpg

 发送完设备地址后,需要发送读/写位,写置0,读置1。

之后,从设备发送应答信号,若从机接收到之前的命令,则回复0。

之后发送寄存器地址,寄存器地址有8位,假设主设备要和从设备MPU6080通信,需要在从设备中找一片区域从放之后发送的数据,这片区域的地址就是寄存器地址。如果从设备收到,则再次应答。

找到从设备,找到寄存器地址后,就可以发送数据(8位),从设备接收到应答。

终止状态:先SDA切换为高电平,后把SCL也切换为高电平。

9.4 软件IIC发送数据的代码

1.把IIC的两根线分别接到GPIOB下pin10和pin11引脚,用软件实现,所以使用GPIO即可

RCC开启APB2下的GPIOB时钟,且初始化,注意需要把输出模式配置成开漏输出。

如果是推挽输出,当一个从设备发送0,一个从设备发送1时,有可能短路。所以需要换成开漏输出,这样只能输出0,要想输出1,只能在IIC总线上接一个电源和上拉电阻(防止短路)。

13ef0bae7107469ebdce4e7a01ceb732.jpg

 2.为了方便控制后续的SDA和SCL的高低电平,可以封装几个函数,然后配置初始状态,终止状态和发送数据,发送数据以高位优先。

 

68e9e225949c40328ee9290578d662bb.jpg  4525a6f6b9ef4e37aef51a1d239d2ae6.jpg

6326b9ca39974e77855bdeb725b5b8d6.jpg

 3.主机接收数据

f1ac44b8ab1e4e1790dacedc73935beb.jpg b3c34338f8f440739ebe8248099f47aa.jpg

 4.发送和接收应答

beb38d3856a048b594a36a10f85ff854.jpg

 5.主函数调试

d5ed036203e542d6a8989643a8f5908d.jpg

6.IIC总结

e428cf0086cb4711addf7749ef9e336a.jpg

 f1bb01c9930743869b43a75c4312619d.jpg

 ecbb49083d2047fdb3f42f3fb084d9ec.jpg

到这说明硬件接线和这6个时序是正确的,通过IIC已经把单片机和从设备MPU6050联系起来了。接下来完成指定寄存器地址,写入数据,读取数据。

7.新建MPU6050的.h和.c文件,这个文件基于IIC文件,所以需要先引入头文件,然后对MPU6050完成指定地址写操作如下

 

4ff0ced1793d41fa9126ba7ce4e5b255.jpg

 分别对应下图的起始状态,发送设备地址(0xD0)包含了写位,收到应答,发送寄存器地址,收到应答,发送数据,收到应答,停止位。正好一一对应

7b09e1461012468e850e5df201783a9f.jpg

8.指定地址读操作如下

1d15407880f64101a92a1d4524071ddb.jpg

十、SPI

1.SPI简介

9aa04ae9285542a2a39d45c55c363968.jpg

SPI通信也是一主多从的模式,一个主设备,多个从设备。

为了实现SPI,需要四条线,分别是SCLK,MOSI,MISO,SS。通过共享这四条线,实现全双工的数据传输(同时发送或接收数据)。

这四条线的作用分别如下:

SS:片选信号线,从多个从设备中选出目标设备,确保只有选定的从设备与主设备通信。

SCLK:时钟信号线,用于同步数据传输,时钟信号的频率决定数据传输的速率。

MOSI:发送信号线,将数据从主设备传输到目标从设备

MISO:接收信号线,目标从设备将数据返回给主设备

2.准备数据

假设目标从设备是93C46(EEPROM存储器)

首先,设置片选信号线。根据93C46的数据手册,SS在高电平时有效。(大部分是低电平有效,但是93C46是高电平有效,不同设备需要查看各自的数据手册)

然后,主设备给从设备写数据。假设在从设备的0x01处的地址写入0000 1111这一个字节的数据,根据数据手册

b476cd9050af4ba8a0c1e4969ac0c968.jpg

先发送起始位1,然后发送写操作01,然后再发送要写入的地址(因为要写入0x01处的地址且规定地址是7位,所以发送000 0001),最后发送数据(0000 1111)。

3.发送数据的方法

准备好数据后,我们知道要发送这些数据

1 01 000 0001 0000 1111,但是怎么发送呢?

这需要SS,SCLK和MOSI共同实现。

0e444849ef72465b91e258e02f62e2e0.jpg

首先,把主设备与从设备的SS设置为高电平,代表选中了93C46从设备。

然后,拉高SCLK的电平,也就是时钟信号的上升沿时,看MOSI(发送信号线)是高电平还是低电平,此时若是高电平,则发送1,此时若是低电平,则发送0。

如上图圈一所在剪头,此时SCLK处于上升沿,发送MOSI所在高电平1。最终结果如下

dad7c7f14a1d40cc9db7402c7f40f35b.jpg

4.读取数据方法

首先,主设备需要向目标从设备发送读取指令

fadcb74fba17463484939a75e4737323.jpg

起始位:1

读操作:10

要读取的数据的地址:7位(假设0x01=000 0001)

这样就可以收到数据。

同样,需要用到SS,SCLK和MISO

SS高电平,当SCLK上升沿时,MISO为高电平,则读取1,MISO为低电平,则读取0。

5.代码实现

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…

sqli-labs less-17密码重置报错注入

密码重置报错植入 来到首页面我们看到页面提示【password reset】,说明这是更改密码的注入,也就是说我们知道一个账户名,修改他的密码,所以我们可以在passwd处进行注入。 闭合方式 添加单引号 有报错 可以知道闭合方式为单引号…

Leetcode—76. 最小覆盖子串【困难】

2024每日刷题&#xff08;167&#xff09; Leetcode—76. 最小覆盖子串 C实现代码 class Solution { public:string minWindow(string s, string t) {int bestL -1;int l 0, r 0;vector<int> cnt(128);for(const char c: t) {cnt[c];}int require t.length();int m…

OJ在线评测系统 微服务 用分布式消息队列 RabbitMQ 解耦判题服务和题目服务 手搓交换机和队列 实现项目异步化

消息队列解耦 项目异步化 分布式消息队列 分布式消息队列是一种用于异步通信的系统&#xff0c;它允许不同的应用程序或服务之间传递消息。消息队列的核心理念是将消息存储在一个队列中&#xff0c;发送方可以将消息发送到队列&#xff0c;而接收方则可以在适当的时候从队列中…

安卓如何实现双击触摸唤醒点亮屏幕功能-Android framework实战开发

背景 经常有学员朋友在群里问到一个目前市场上常见的功能&#xff1a; 手机待机时候双击屏幕可以唤醒点亮手机屏幕功能 如何实现这个功能&#xff0c;经常有同学在群里求助&#xff0c;今天就刚好来讨论一下这个待机时候双击触摸唤醒点亮屏幕的功能的实现方案。 功能核心方案设…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

dwceqos网络驱动性能优化

文章介绍 本文会分享一些在QNX系统下对io-pkt-v6-hc驱动模块cpu loading过高问题优化的经验&#xff0c;以及一些调优debug的方法。这些优化措施实施之后可以降低io-pkt-v6-hc在高负载的情况下的cpu loading。本文的调优是基于synopsys公司的dwceqos模块&#xff0c;理论上方法…

【Android 源码分析】Activity生命周期之onPause

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理 本文参考移植步骤文件配置代码修改inv_mpu.cinv_mpu.hinv_mpu_dmp_motion_driver.c 使用 自检失败怎么处理ret -1改正DEBUG过程 ret -9改正DEBUG过程 本文参考 B站 CSDN 移植步骤 文件配置 新建一个 dmp 文件夹 并将…

【Linux】进程地址空间、环境变量:从理论到实践(三)

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 &#x1f680; 前言一&#xff1a;&#x1f525; 环境变量 &#x1f95d; 基本概念&#x1f95d; 常见环境变量&#x1f95d; 查看环境变量方法 二&#xff1a;&#x1f525; 测试 &…

Nat. Commun.:飞秒激光书写受蚂蚁启发的可重构微型机器人集体

背景介绍生物在各种环境中的集体行为十分普遍&#xff0c;它们能够自发有序地完成单个个体难以完成的任务。目前&#xff0c;生物集体的形成主要分为两大类。第一类生物个体之间没有直接接触&#xff0c;如蜜蜂、鱼和鸟类&#xff0c;这导致这些集体不稳定&#xff0c;容易受到…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念&#xff0c;不涉及具体的操作原理&#xff0c;旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期&#xff0c;计算机主机非常昂贵&#xff0c;而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES&#xff1b;展示所有的数据库CREATE DATABASE 数据库名称; 创…

基于STM32的数字温度传感器设计与实现

引言 STM32 是由意法半导体&#xff08;STMicroelectronics&#xff09;开发的基于 ARM Cortex-M 内核的微控制器系列&#xff0c;以其强大的处理能力、丰富的外设接口和低功耗著称&#xff0c;广泛应用于嵌入式系统设计中。在这篇文章中&#xff0c;我们将介绍如何基于 STM32…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络架构&#xff0c;由微软研究院的Kaiming He等人在2015年提出&#xff0c;并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题&#xff0c;即当网络…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时&#xff0c;npm 发现了项目…

数据结构(栈和队列的实现)

1. 栈&#xff08;Stack&#xff09; 1.1 栈的概念与结构 栈是一种特殊的线性表&#xff0c;其只允许固定的一段插入和删除操作&#xff1b;进行数据插入和删除的一段叫做栈顶&#xff0c;另一端叫栈底&#xff1b;栈中的元素符合后进先出LIFO&#xff08;Last In First Out&…

C++——模拟实现vector

1.查看vector的源代码 2.模拟实现迭代器 #pragma oncenamespace jxy {//模板尽量不要分离编译template <class T>class vector{public:typedef T* iterator;//typedef会受到访问限定符的限制typedef const T* const_iterator;//const迭代器是指向的对象不能修改&#xf…