当前位置: 首页 > news >正文

STM32基础回顾

文章目录

  • 单片机编程的原理
  • GPIO
  • 中断
    • EXTI外部中断
    • 定时器中断、串口中断
  • 定时器
    • 定时器中断配置过程
    • 通用定时器输出比较功能:PWM波的生成
    • 定时器的输入捕获功能
      • 主从触发模式
      • PWMI模式
    • 定时器的编码器接口
  • DMA简介
  • 通信接口
  • USART
    • 软件配置流程:
      • 1、仅发数据的配置
      • 2、收发数据的配置
  • I2C
    • I2C时序基本单元
    • 具体应用
      • 指定地址写(主机发送)
      • 指定地址读
      • 总结
    • MPU6050通信流程
  • SPI
    • 起始终止时序
    • 交换一个字节
  • 通信协议比较
    • USART
    • I2C
    • SPI


单片机编程的原理

在这里插入图片描述

编程的目的是,通过配置stm32的外设,来实现相应的功能。
注意在操作外设之前必须使能时钟。
在这里插入图片描述

GPIO

在STM32中,所有的GPIO都是挂载在APB2外设总线上的。
在这里插入图片描述
其中

  • 寄存器是一个特殊的存储器,内核可以通过APB2总线对寄存器进行读写。
  • 驱动器负责增大驱动能力。

GPIO电路图
在这里插入图片描述
可配置为8种输入输出模式。
在这里插入图片描述
在输出模式下,输入模式也是有效的;
在输入模式下,输出模式无效。

中断

NVIC是一个内核外设,用来分配优先级和管理中断
在这里插入图片描述
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队;
抢占优先级和响应优先级均相同的按中断号排队。

EXTI外部中断

大致来说,就是监控电平跳变的信号触发GPIO口的中断。
具体来说
1、EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
2、支持的触发方式:上升沿/下降沿/双边沿/软件触发
3、支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
4、通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
5、触发响应方式:中断响应/事件响应
在这里插入图片描述

打开RCC时钟(GPIO和AFIO);
配置GPIO为输入模式;
配置AFIO(接线);
配置EXTI,设置线路,选择边沿触发方式,选择触发响应方式(中断响应);
配置NVIC(内核的外设无需时钟),设置优先级分组,初始化NVIC。

void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 优先级分组NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  // 指定中断通道开启或关闭NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);
}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}// 指定中断通道的中断函数
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;}EXTI_ClearITPendingBit(EXTI_Line14);  // 清除中断标志位}
}

定时器中断、串口中断

下面介绍

定时器

定时器可以对输入的时钟进行计数,在计数值达到设定值时触发中断。
基本定时器 = 16为计数器 + 预分频器 + 自动重装寄存器(时基单元)
在这里插入图片描述
通用定时器
在这里插入图片描述
无论是什么定时器,内部的基准时钟都是72MHz

定时器中断配置过程

打开RCC时钟;
配置时基单元; // 如果只需要定时器配置到这里就结束
配置输出中断控制,允许更新中断输出到NVIC;
配置NVIC,在NVIC种打开定时器中断的通道,并分配优先级;
最后使能时基单元中的定时器。

决定定时时间的参数为结构体TIM_Period和结构体TIM_Prescaler
计数器溢出频率(定时频率)= 72M/(PSC+1)/(ARR+1)
如果需要1hz,则代码如下

在这里插入图片描述

上述代码红色框部分为 分频系数ARR=10000-1; PSC=7200-1,在72M/7200 = 10k的频率下,计10000个数,就是1s。

定时器中断也可以产生pwm波:设置定时器中断,在中断里手动计数,手动翻转电平。
定时器中断也可以完成输入捕获:来个外部中断,在中断里手动把CNT取出来,放在变量里面。
定时器中断也可以完成编码器接口的硬件功能:在中断中,手动自增或自减计数。
以上都是消耗软件资源

通用定时器输出比较功能:PWM波的生成

输出比较可以通过比较CNT和CCR(捕获比较寄存器)值的关系,来对输出电平进行置1、置0或翻转的操作,从而输出。
使用硬件资源(CCR)来输出PWM波不需要中断,只需要比较计数器和寄存器的值就行了
在这里插入图片描述

同一个定时器可以通过不同的通道来输出PWM,具体哪个通道通过函数配置来实现。
在这里插入图片描述

通过ARR、PSC、CCR的设置来调整PWM的参数。
在这里插入图片描述

所以ARR=100-1; PSC = 720-1; CCR = 50// 50%的占空比

void PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		    //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;		//CCRTIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_Cmd(TIM2, ENABLE);
}

一般只调节PSC,不会影响CCR和ARR的占空比。一般先根据分辨率确定ARR,再根据pwm频率条件PSC分频。
示波器输出
在这里插入图片描述

项目使用TB6612:双路H桥型的直流电机驱动芯片,可以驱动两个直流电机。双路H桥型电路由两个推挽电路组成。H桥可以变换电流的方向。
在这里插入图片描述

定时器的输入捕获功能

测输入PWM波的频率和占空比
输入捕获(4个通道)和输出比较(4个通道)只能使用其中一个。
输入捕获,当通道输入引脚出现上升沿或下降沿时,将当前CNT的值锁存到CCR中,可测量PWM波的频率、占空比等等参数。
在这里插入图片描述

主从触发模式

可配合主从触发模式,实现硬件全自动测量。不用再使用中断去清空CNT
在这里插入图片描述
注意CNT计数可能会溢出(0-65535)

PWMI模式

可配置为PWMI模式,同时测量hz和占空比;
在这里插入图片描述

频率测量的方法:
测频法:在一个闸门时间T内,记录上升沿出现的次数N,然后计算
测周法:在两个上升沿内,用单片机的标注频率fc计次,记录次数N(到CCR),然后计算。(一般使用这个,随时都能取CCR的值)
在这里插入图片描述

定时器的编码器接口

电机驱动项目:使用pwm驱动电机,再使用编码器测量电机的速度,然后再用PID进行控制。
通用定时器拥有一个编码器接口。
在这里插入图片描述
正交编码器能够抗噪声,通过双相查表来对抗噪声。

所以,问:TIMER你一般用来做什么?

DMA简介

直接存储器读取,协助CPU完成数据转运的工作,提供外设<=>存储器、存储器<=>存储器的高速数据传输
在这里插入图片描述

一般情况下,程序都是在flash程序存储器下运行
DMA外设可以直接访问32内部的寄存器,包括运行内存SRAM,程序存储器flash,寄存器等等
寄存器是一种特殊的存储器:一、cpu可以对寄存器进行读写,类型读取运行内存;二、寄存器都连接了一根导线,可以控制电路状态,如高低电平的切换,导通和断开开关。所以寄存器是连接软件和硬件的桥梁软件读取寄存器就相当于在控制硬件的执行
寄存器与存储器不同的是,寄存器的每一位都对应着外设电路的状态

通信接口

需要制定通信协议,通信双方按照协议规则进行数据收发。
在这里插入图片描述

USART

USART外设:按照串口协议来产生和接收高低电平信号。点对点通信。

串口参数:
波特率:串口通信的速率。因为串口是异步通信,如果速率不同,会导致读取数据的错位。
起始位:标志一个数据帧的开始,固定为低电平(串口空闲时为高电平)
数据位:数据帧的载荷。如发送0x0F,低位先发,于是电平为11110000的波形。注意,串口一次只能发送一个 8 位(1 个字节)的数据
停止位:数据帧的间隔,固定为高电平。
在这里插入图片描述
在这里插入图片描述

翻转电平是由usart外设完成的,无需编程。软件只需要读写DR寄存器。
在这里插入图片描述

重点在发送数据寄存器TDR和接收数据寄存器RDR。
在这里插入图片描述

在数据转运到接收数据寄存器RDR时,会置一个RXNE标志位,RXNE就可以去申请中断,从而在收到数据时便快速的进行数据的处理。
上图看似有四个寄存器,但是软件层面只有一个DR寄存器供我们读写。

软件配置流程:

1、仅发数据的配置

  • 开启USART的时钟,开启GPIOA的时钟;
  • 初始化GPIO引脚:TX引脚位复用推挽输出,RX位输入脚,选择上拉输入模式
  • 初始化串口配置:

在这里插入图片描述

  • USART_Cmd开启串口
  • 之后就可以使用函数接口发送数据:
USART_SendData(USART1, uint8_t)  // uint8_t就是char,8位

封装之后

void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

调用这个库函数,Byte变量就写入TDR中了,再等待一下TDR的数据转移到移位寄存器中才能放心,不然数据就覆盖了。所以还需要检查标识位TXE(TDR是否为空):
while(USART_GETFlagStatus(USART1, USART_FLAG_TXE) == RESET);
注:读数据寄存器非空的标志为RXNE,下面会用到。

2、收发数据的配置

USART_InitStruture.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
一般使用中断触发处理数据,所以下一步:
配置NVIC:
开启RXNE标志位到NVIC的输出,RXNE一旦置1,就会向NVIC申请中断;
在这里插入图片描述

编写中断处理函数

void USART1_IRQHandler(void)
{if(USART_GETITStatus(USART1, USART_IT_RXNE) == SET){// 有数据来了,接收uint8_t Serial_RXData = USART_ReceiveData(USART1);USART_ClearITPendingBit(USART1, USART_IT_RXNE);  // 清除标识位}
}

以上是单字节的数据收发,数据包的收发类似。

I2C

目的:读取外挂寄存器数据(CPU要读取MPU6050的寄存器),而串口的工作是传输数据。

##I2C的功能:
发送数据后,另一端能够应答;
同步时序,半双工(串口是异步时序,有USART硬件的支持),对硬件要求不是很严格;
支持总线挂载多设备,一般为一主多从。
在这里插入图片描述
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式,且SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右(弱上拉电阻+开漏输出模式
MPU6050已经在硬件上接入上拉电阻了。
在这里插入图片描述
复习:
开漏输出:只能输出低电平(只能下拉)

I2C时序基本单元

起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
注意:只用主机才能产生起始和终止。只有主机才能控制SCL
在这里插入图片描述
一个字节主机发送=>从机接收:
主机拉下SCL,主机把数据放在SDA(高位先行);主机松开SCL,从机读取SDA的数据(SCL高电平期间,SDA不允许变换,因为从机正在读)。如此循环八次,就发送了一个字节的数据。
低电平主机放数据,高电平从机读数据。
一个字节主机接收<=从机发送:
SCL低电平期间,从机把数据放在SDA上,然后释放SCL;主机在SCL高电平期间读取SDA数据(SCL高电平期间,SDA不允许变换)。如此循环八次,就发送了一个字节的数据。
低电平从机放数据,高电平主机读数据。
总结:所有设备包括主机都处于输入模式,当主机需要发送时,主动去拉下SDA。而在主机被动接收的时,必须先释放SDA(释放总线,不然永远是低电平,别人没法写,总线是“或”逻辑)。

应答机制
从机应答:操作的是SDA这根线,当主机松手SDA时,从机需要拉住SDA,告诉主机自己收到了。
主机应答:

具体应用

指定地址写(主机发送)

对于指定从机设备地址(MPU6050地址:0xD0),在指定从机设备的指定寄存器地址下(0x19)写入指定数据(0xAA)
从机设备地址站前7位,第8位为主机想写就是0,想读就是1。
在这里插入图片描述

指定地址读

对于指定从机设备地址(MPU6050地址:0xD0),指定从机设备的指定寄存器地址(0x19);对于指定从机设备地址(MPU6050地址:0xD0,但是第8位为1,表述主机想读),之后直接收数据。
在这里插入图片描述
实现了指定地址读和写,就可以实现STM32读取外挂芯片寄存器的操作。

总结

只有主机SCL下拉期间,SDA的数据才能动(要么主机放数据、要么从机放)。主机松手SCL(高电平),一律不准动SDA(因为要读,要么主机要么从机)。

MPU6050通信流程

初始化I2C;
指定MPU6050地址,指定要写的寄存器地址;
初始化MPU6050的寄存器,其实就是主机往指定的寄存器中写数据(电源管理寄存器解除睡眠、选择陀螺仪时钟、6个轴不待机。。。);
再发一次MPU6050地址指定读,然后读取指定寄存器的数据1632(Acc,Gypo);

SPI

SPI与I2C的目的相同,为了读取外部寄存器。
SCK、MOSI(主机输出,从机输入)、MISO(主机输入,从机输出)、SS(从机选择线)
同步时序、全双工(数据发送和接收各占一条线)
在这里插入图片描述
SCK时钟线由主机掌握
主机另外引出多条SS控制线,拉低为呼叫。
输出引脚配置为推挽输出,输入引脚为浮空或上拉输入
推挽输出:高低电平均有很强的驱动能力(下降沿上升沿非常迅速)
在这里插入图片描述
SPI的数据收发,都是基于字节交换单元来实现的

起始终止时序

起始条件: SS从高电平切换到低电平
终止条件: SS从低电平切换到高电平
SS低电平为数据传输的过程

交换一个字节

模式1:SCK第一个边沿移出数据到线,第二个边沿移入数据到寄存器。
在这里插入图片描述
一般用的是模式0,在SCK第一个边沿之前就要移出数据第一个边沿移入数据。
模式2:

通信协议比较

在这里插入图片描述

USART

定义好波特率等等参数之后,调用接口发送数据

发送:

USART_SendData(USART1, uint8_t)  // uint8_t就是char,8位

封装之后

void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

接收:
中断处理函数

void USART1_IRQHandler(void)
{if(USART_GETITStatus(USART1, USART_IT_RXNE) == SET){// 有数据来了,接收uint8_t Serial_RXData = USART_ReceiveData(USART1);USART_ClearITPendingBit(USART1, USART_IT_RXNE);  // 清除标识位}
}

I2C

优点:一根通信线兼顾收发(无论挂载多少设备)、寻址机制,应答机制。
缺点:因为I2C要实现半双工(要经常切换输入输出),所以采用开漏+上拉电阻的设计,这种设计使得通信线高电平驱动能力较弱(导致SDA从低到高,上升沿的耗时较长,限制传输速度)。

SPI

优点:传输更快(推挽输出),无需寻址(SS线负责)。
缺点:硬件要求高,资源浪费(全双工)。
四根通信线:SCK,MOSI、MISO、SS。

相关文章:

STM32基础回顾

文章目录 单片机编程的原理GPIO中断EXTI外部中断定时器中断、串口中断 定时器定时器中断配置过程通用定时器输出比较功能&#xff1a;PWM波的生成定时器的输入捕获功能主从触发模式PWMI模式 定时器的编码器接口 DMA简介通信接口USART软件配置流程&#xff1a;1、仅发数据的配置…...

如何解决电脑无声问题:排除故障的几种常见方法

大家好&#xff0c;今天我们来讨论一下处理电脑没有声音的故障。当你突然发现电脑静音无声时&#xff0c;需要逐步排除可能的问题&#xff0c;但总体而言&#xff0c;声音故障是相对容易解决的。接下来&#xff0c;我们将介绍一些排除电脑无声问题的方法。 第一步&#xff1a;…...

Apache RocketMQ 命令注入

漏洞简介 RocketMQ 5.1.0及以下版本&#xff0c;在一定条件下&#xff0c;存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露&#xff0c;缺乏权限验证&#xff0c;攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令…...

二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

文章目录 算法模板Dijkstra题目代码模板朴素dijkstra算法堆优化版dijkstra 树与图的存储(1) 邻接矩阵&#xff1a;(2) 邻接表&#xff1a;关于e[],ne[],h[]的理解 关于堆的原理与操作 模板题Dijkstra求最短路 I原题链接题目思路题解 Dijkstra求最短路 II原题链接题目思路题解 1…...

ROS2学习(四)进程,线程与节点的关系

节点与节点执行器 节点&#xff0c;英文是node,在ROS2中&#xff0c;节点是一个抽象的实体&#xff0c;它可以代表某种或某类特定功能的抽象集合体&#xff0c;它可以存在于进程中&#xff0c;也可以存在于线程中。所有ROS2的基础功能最基础的载体是节点&#xff0c;所有的通信…...

【物联网】DMA传输原理与实现详解(超详细)

DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种计算机数据传输方式&#xff0c;允许外围设备直接访问系统内存&#xff0c;而无需CPU的干预。 文章目录 Part 1: DMA的工作原理配置阶段&#xff1a;数据传输阶段&#xff1a; Part 2: DMA数据…...

Java类集框架(二)

目录 1.Map&#xff08;常用子类 HashMap&#xff0c;LinkedHashMap&#xff0c;HashTable&#xff0c;TreeMap&#xff09; 2.Map的输出&#xff08;Map.Entry,iterator,foreach&#xff09; 3.数据结构 - 栈&#xff08;Stack&#xff09; 4.数据结构 - 队列&#xff08;Q…...

爬虫008_流程控制语句_if_if else_elif_for---python工作笔记026

然后我们再来看一下这里的,判断,可以看到 再看一个判断,这里的布尔类型 第二行有4个空格,python的格式 注意这里,输入的age是字符串,需要转一下才行 int可以写到int(intput("阿斯顿法师打发地方")) 这样也可以...

【随笔】五周年创作纪念日

今天收到了 CSDN 的创作五周年提示&#xff0c;正好前几天&#xff08;7.31&#xff09;我也成功申请了 CSDN 博客专家&#xff0c;趁这个机会分享一下这几年写博客的感受吧 机缘 关注我比较久的读者应该知道我是从学传统工科半路出家搞计算机的&#xff0c;这里的经历还是比…...

7_分类算法—逻辑回归

文章目录 逻辑回归&#xff1a;1 Logistic回归&#xff08;二分类问题&#xff09;1.1 sigmoid函数1.2 Logistic回归及似然函数&#xff08;求解&#xff09;1.3 θ参数求解1.4 Logistic回归损失函数1.5 LogisticRegression总结 2 Softmax回归&#xff08;多分类问题&#xff0…...

【计算机网络】应用层协议 -- DNS协议

文章目录 1. DNS背景2. 域名简介3. 域名解析过程4. 使用dig查看DNS过程 1. DNS背景 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 TCP/IP当中通过IP地址和端口号的方式&#xff0c;来确定…...

ES6 - 数组新增的一些常用方法

文章目录 1&#xff0c;Array.from()2&#xff0c;Array.of()3&#xff0c;find()&#xff0c;findIndex()&#xff0c;findLast()和findLastIndex()4&#xff0c;Array.fill()5&#xff0c;keys()&#xff0c;values() 和 entries()6&#xff0c;Array.includes()7&#xff0c…...

【BEV感知】3-BEV开源数据集

3-BEV开源数据集 1 KITTI1.1 KITTI数据怎么采集?1.2 KITTI数据规模有多大?1.3 KITTI标注了哪些目标?1.4 转换矩阵1.5 标签文件 2 nuScenes2.1 nuScenes Vs KITTI2.2 标注文件 1 KITTI KITTI 1.1 KITTI数据怎么采集? 通过车载相机、激光雷达等传感器采集。 只提供了相机正…...

Kafka-Broker工作流程

kafka集群在启动时&#xff0c;会将每个broker节点注册到zookeeper中&#xff0c;每个broker节点都有一个controller&#xff0c;哪个controller先在zookeeper中注册&#xff0c;哪个controller就负责监听brokers节点变化&#xff0c;当有分区的leader挂掉时&#xff0c;contro…...

第八篇-Tesla P40+ChatGLM2+LoRA

部署环境 系统&#xff1a;CentOS-7CPU: 14C28T显卡&#xff1a;Tesla P40 24G驱动: 515CUDA: 11.7cuDNN: 8.9.2.26目的 验证P40部署可行性,只做验证学习lora方式微调创建环境 conda create --name glm-tuning python3.10 conda activate glm-tuning克隆项目 git clone http…...

调用feign返回错误的数据

bug描述&#xff1a; 在一个请求方法中会调用到feign去获取其他的数据。 List<Demo> list aaaFeignApi.getData(personSelectGetParam);在调用的时候&#xff0c;打断点到feign的地方&#xff0c;数据是存在的&#xff0c;并且有15条。但是返回到上面代码的时候数据就…...

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…...

redis五种数据类型介绍

、string&#xff08;字符串&#xff09; 它师最基本的类型&#xff0c;可以理解为Memcached一模一样的类型&#xff0c;一个key对应一个value。 注意&#xff1a;一个键最大能存储 512MB。 特性&#xff1a;可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…...

【JavaEE】Spring Boot - 项目的创建和使用

【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09;1. Spring Boot 的优点2. Spring Boot 项目创建2.1 下载安装插件2.2 创建项目过程2.3 加载项目2.4 启动项目2.5 删除一些没用的文件 3. Sp…...

Git reset、revert用法

reset reset是删除之前的提交记录&#xff0c;所有的提交点都会被清除&#xff0c;我们看下执行前后的git log区别 D:\workspace\android>git log commit 87c1277a57544c53c603b04110e3dde100da8f57 (HEAD -> develop_main) Author: test <test.com> Date: Wed…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...