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

STM32(基于标准库)

参考博客:江科大STM32笔记

Stm32外设 

一、GPIO

基础 

GPIO位结构

 

I/O引脚的保护二极管是对输入电压进行限幅的上面的二极管接VDD, 3.3V,下面接VSS, 0V,当输入电压

  • >3.3V
    那上方这个二极管就会导通,输入电压产生的电流就会大部分充入VDD而不会流入内部电路;
     
  • <0V(这个电压是相对于VSS的电压,所以是可以有负电压的)
    小于0的情况大概率是电源反接,此时,那这时下方这个二极管就会导通,电流会从I/O直接流出去,然后再流到地,而不会从内部电路汲取电流,也是可以保护内部电路的;
     
  • 在0~3.3v之间
    那两个二极管均不会导通,这时二极管对电路没有影响,这就是保护二极管的用途。

开关:如果上面导通、下面断开,就是上拉输入模式;如果下面导通、上面断开,就是下拉输入模式;如果两个都断开,就是浮空输入模式

上拉和下拉的作用——>为了给输入提供一个默认的输入电平
因为对应一个数字的端口,输入不是高电平就是低电平,那如果输入引脚什么都不接,那就不确定算高电平还是低电平。而实际情况是,如果啥也不接,这时输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变。为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上拉或者下拉电阻了,如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入又可以称作是默认为高电平的输入模式。下拉也是同理,就是默认为低电平的输入方式。

注:

1、这个上拉电阻和下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作,所以当IO引脚有电流时,不会经过上下拉电阻。

2、只有输入才有上下拉输入,因为只有输入才要确定一个高电平或者低电平


 英文原文档是施密特触发器,(模电里这叫迟滞/滞回比较器,也就是施密特触发器的电路)

施密特触发器的作用就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平。 


接下来经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,我们再用程序读取数据输存器对应某一位的数据,就可以知道端口的输入电平了。最后上面这还有两路线路,这些就是连接到片上外设的一些端口,其中有模拟输入,这个是连接到ADC上的,因为ADC需要接收模拟量,所以这根线是接到施密特触发器前面的;另一个是复用功能输入,这个是连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接收的是数字量,所以在施密特触发器后面


输出部分可以由 输出数据寄存器片上外设 控制,两种控制方式通过这个数据选择器接到了输出控制部分。
如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了。
位设置/清除寄存器:这个可以用来单独操作输出数据寄存器的某一位,而不影响其它位。因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某一个端口而不影响其他端口的话,就需要一些特殊的操作方式。 

  • 第一种方式是先读出这个寄存器,然后用 按位与 和 按位或 的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=和 |=的操作,这种方法比较麻烦,效率不高,对于IO口的操作而言不太合适;
  • 第二种方式是通过设置这个位设置和位清除寄存器,如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1便可,剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位置为1,而剩下写0的位则保持不变,这样就保证了只操作其中某一位而不影响其它位,并且这是一步到位的操作。如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了,这就是第二种方式也就是这个位设置和位清除寄存器的作用。【作用:将设置/清除寄存器的某一位写1/0就能达到单独影响输出寄存器的某一位,从而单独影响某个端口】

  • 第三种操作方式【了解即可】 ,就是读写STM32中的“位带”区域,这个位带的作用就跟51单片机的位寻址作用差不多,在STM32中,专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位,这就是位带的操作方式,这个方式我们本课程暂时不会用到。我们的教程主要使用的是库函数来操作的,库函数使用的是读写位设置和位清除寄存器的方法


上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,
在这里可以选择推挽开漏关闭三种输出方式。 

  • 推挽输出模式
    在推挽输出模式下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平,数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平,这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式。在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算。

  • 开漏输出模式
    在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平;这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。那这个模式有什么用呢,这个开漏模式可以作为通信协议的驱动方式,比如I2C通信的引脚,就是使用的开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰,另外开漏模式还可以用于输出5V的电平信号。

比如在I0口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备,这就是开漏输出的主要用途。 

开漏模式下,输出1时,两个mos管都相当于关断,左侧相当于断路。外接5V的电能只能流向右侧,故输出5V。反之,输出0时,左下方mos管导通,外接5V的电能流到左下方Vss,且两者之间几乎没有电压降,可看做5V电压降在了上拉电阻上,故引脚输出0V 

  • 关闭
    剩下的一种状态就是关闭,这个是当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制。

GPIO八种工作模式 

模式Mode
模拟输入模式GPIO_Mode_AIN
浮空输入模式GPIO_Mode_IN_FLOATING
下拉输入模式GPIO_Mode_IPD
上拉输入模式GPIO_Mode_IPU
通用开漏输出模式GPIO_Mode_Out_OD
通用推挽输出模式GPIO_Mode_Out_PP
复用开漏输出模式GPIO_Mode_AF_OD
复用推挽输出模式GPIO_Mode_AF_PP

 输入模式

当I/O端口配置为输入时:

  • 输出缓冲器被禁止 
  • 施密特触发输入被激活
  • 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
  • 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
  • 对输入数据寄存器的读访问可得到I/O状态 

 输出模式

当I/O端口配置为输出时:

  • 输出缓冲器被激活
    开漏模式:输出寄存器上的 0 激活 N-MOS ,而输出寄存器上的 1 将端口置于高阻状态 (P-
    MOS 从不被激活 )
    推挽模式:输出寄存器上的 0 激活 N-MOS ,而输出寄存器上的 1 将激活 P-MOS
  • 施密特触发输入被激活
  • 弱上拉和下拉电阻被禁止
  • 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
  • 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
  • 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。

 复用功能模式

当I/O端口配置为复用功能时: 

  • 在开漏或推挽式配置中,输出缓冲器被打开
  • 内置外设的信号驱动输出缓冲器 ( 复用功能输出 )
  • 施密特触发输入被激活
  • 弱上拉和下拉电阻被禁止
  • 在每个 APB2 时钟周期,出现在 I/O 脚上的数据被采样到输入数据寄存器
  • 开漏模式时,读输入数据寄存器时可得到 I/O 口状态
  • 在推挽模式时,读输出数据寄存器时可得到最后一次写的值

 模拟输入模式

当I/O端口配置为模拟输入时:  

  • 输出缓冲器被禁止;
  • 禁止施密特触发输入,实现了每个模拟 I/O 引脚上的零消耗。施密特触发输出值被强置
    ’0’
  • 弱上拉和下拉电阻被禁止;
  • 读取输入数据寄存器时数值为 ’0’

AFIO 

作用:

1、复用与重映射

2、引脚选择(EXIT外部中断) 

 通用模式下,CPU直接去控制IO引脚


 复用模式下,CPU将控制权交给了其它片上外设

项目:按键控制LED 

LED.C

#include "stm32f10x.h"                  // Device headervoid LED_Init_A(uint16_t GPIO_Pin)
{//开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOAGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);
}void LED_ON_A(uint16_t GPIO_Pin)
{GPIO_SetBits(GPIOA,GPIO_Pin);
}void LED_OFF_A(uint16_t GPIO_Pin)
{GPIO_ResetBits(GPIOA,GPIO_Pin);
}void LED_Turn_A(uint16_t GPIO_Pin)
{if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin) == 0)//引脚为低电平转变为高电平{GPIO_SetBits(GPIOA,GPIO_Pin);}else//引脚为和高电平转变为低电平{GPIO_ResetBits(GPIOA,GPIO_Pin);}
}

 Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"void Key_Init_B(uint16_t GPIO_Pin)
{//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//初始化GPIOBGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}uint8_t Key_GetNum(uint16_t GPIO_Pin)
{uint8_t KeyNum = 0;	switch(GPIO_Pin){case GPIO_Pin_1:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 1;												//置键码为1}break;case GPIO_Pin_2:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 2;												//置键码为1}break;case GPIO_Pin_3:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 3;												//置键码为1}break;case GPIO_Pin_4:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 4;												//置键码为1}break;case GPIO_Pin_5:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 5;												//置键码为1}break;case GPIO_Pin_6:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 6;												//置键码为1}break;case GPIO_Pin_10:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 10;												//置键码为1}break;case GPIO_Pin_11:if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 11;												//置键码为1}break;}return KeyNum;
}

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"int main(void)
{LED_Init_A(GPIO_Pin_1 | GPIO_Pin_2);Key_Init_B(GPIO_Pin_10 | GPIO_Pin_11);while(1){uint8_t keyNum = Key_GetNum(GPIO_Pin_10 | GPIO_Pin_11);if(keyNum  == 10){LED_Turn_A(GPIO_Pin_10);}else if(keyNum  == 11){LED_Turn_A(GPIO_Pin_11);}}}

二、EXTI外部中断 

基础

 

三、USART

基础

通信接口 

 USART和UART的区别

USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器

        USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。

UART(universal asynchronous receiver and transmitter): 通用异步收发器

        异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。       

  • 异步通信:没有共享时钟信号,每个字符前后有起始位和停止位,适用于较低速的数据传输。
  • 同步通信:共享时钟信号,数据传输速率较高,但需要额外的时钟信号支持。                    

注:是不是同步就看是不是共用了一根时钟线,共用就是同步,反之则是异步 

区别:

        USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,而UART只能是异步模式。所以说UART姑且可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。

        相比于同步通讯,UART不需要统一的时钟线,接线更加方便。但是,为了正常的对信号进行解码,使用UART通讯的双方必须事先约定好波特率,即单位事件内传输码元的个数。


UART的连接方式 

1、芯片与芯片的连接方式 

 

2、 芯片与PC机的连接方式

 

交叉连接,己方Tx连接对方的Rx,己方Rx连接对方Tx


 数据帧 

 注:发送数据要倒着发 也就是 小端的方式

空闲状态:高电平

起始位:发送方将线路拉低表示一帧到来(低电平),长度为1

数据位:低电平0,高电平1,总长度是8位或9位

校验位:奇偶校验,可以没有,也可以是数据位最后一位

停止位:发送方将线路拉高表示一帧结束(高电平),长度可以是0.5,1,2

校验位和数据位

奇偶校验规则 

采用9位奇校验的方式,也就是8位数据位 1位校验位

发送方发送1010 1010时 发现‘1’的个数是偶数 所以校验位要补个‘1’

假如接收方有一个‘1’变成‘0’ 然后 ‘1’的总个数为4 是偶数 所以数据传输出错

波特率 

波特率:单位时间内发送的码元个数,这里一个码元就是1位,所以看成比特率应该也没问题 

 波特率9600:一秒发送9600个码元,也就是一秒发送9600个比特,每个比特的发送需要消耗0.104ms

硬件流控 

发送方发送数据后,并不知道接收方是否已经接收并保存数据了,如果还没有接收并保存,发送方发送数据过快(比如发送方发送了10个帧,接收方只来得及保存了1个),可能会使旧数据因新数据覆盖而丢失数据,可以让接收方收到数据后返回一个应答表示数据已收到了,发送到收到答复才继续发。 

 带硬件流控的连线图:

接收方接收数据寄存器为空时,rts为低电平,发送方cts收到低电平,us发送方把数据发给接收方,接收方完全接收这一帧后,把rts置高电平表示暂时无法接收数据,发送方cts收到高电平,于是暂停发送数据,等到接收方将输入数据寄存器的值读走后,接收方rts为低电平,发送方cts收到低电平,便可以进行下一个数据帧的发送

四、I2C

基础

五、SPI

基础

六、DMA

基础

七、时钟

基础

八、PWM

基础

九、ADC / DAC

十、WDG看门狗 

相关文章:

STM32(基于标准库)

参考博客&#xff1a;江科大STM32笔记 Stm32外设 一、GPIO 基础 GPIO位结构 I/O引脚的保护二极管是对输入电压进行限幅的上面的二极管接VDD, 3.3V,下面接VSS, 0V&#xff0c;当输入电压 >3.3V 那上方这个二极管就会导通&#xff0c;输入电压产生的电流就会大部分充入VD…...

国家优青ppt美化_青年科学基金项目B类ppt案例模板

国家优青 国家优青&#xff0c;全称“国家优秀青年基金获得者”。2025改名青年科学基金B类。 作为自然基金人才资助类型&#xff0c;支持青年学者在基础研究方面自主选择研究方向开展创新研究。它是通往更高层次科研荣誉的重要阶梯&#xff0c;是准杰青梯队。 / WordinPPT /…...

解决 ECharts 图表无数据显示问题

问题&#xff1a; 在开发项目时&#xff0c;后端明明已经成功返回了数据&#xff0c;但在展示手账发布数量趋势和树洞帖子发布数量趋势的 ECharts 图表中&#xff0c;却只有坐标轴&#xff0c;没有任何数据显示。 以我的VUE项目开发可视化面板为例&#xff0c;下面将详细分析可…...

spacy安装失败报错

报错 使用命令pip install spacy安装spacy时总是报错&#xff08;python -m pip install spacy方式安装同样报错&#xff09; 解决办法 使用conda安装&#xff0c;conda能够避免很多不必要的依赖包。 命令&#xff1a;conda install spacy 安装成功列表展示...

C++在Linux上生成动态库并调用接口测试

加减乘除demo代码 项目结构 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 头文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…...

第三篇:Python数据结构深度解析与工程实践

第一章:列表与字典 1.1 列表的工程级应用 1.1.1 动态数组实现机制 Python列表底层采用动态数组结构,初始分配8个元素空间,当空间不足时按0,4,8,16,25,35...的公式扩容,每次扩容增加约12.5%的容量 通过sys模块可验证扩容过程: import sys lst = [] prev_size = 0 for …...

前端性能测试工具 —— WebPageTest

测试工具介绍 WebPageTest 是一个用于测量和分析网页性能的工具。它提供了详细的诊断信息&#xff0c;帮助用户了解网页在不同条件下的表现。用户可以选择全球不同的测试地点&#xff0c;使用真实的浏览器&#xff0c;并自定义网络条件进行测试。WebPageTest 还支持核心网络指…...

北邮LLMs在导航中的应用与挑战!大模型在具身导航中的应用进展综述

作者&#xff1a;Jinzhou Lin, Han Gao, Xuxiang Feng, Rongtao Xu, Changwei Wang, Man Zhang, Li Guo, Shibiao Xu 单位&#xff1a;北京邮电大学人工智能学院&#xff0c;中国科学院自动化研究所多模态人工智能系统国家重点实验室&#xff0c;中科院空间信息研究所&#xf…...

Windows下ElasticSearch8.x的安装步骤

下载ElasticSearch&#xff1a;https://www.elastic.co/downloads/elasticsearch &#xff08;我下载的是目前最新版8.17.4&#xff09;解压ElasticSearch 进入到ElasticSearch的bin目录下双击elasticsearch.bat 弹出控制台并开始执行&#xff0c;在这一步会输出初始账号和密码…...

【高性能缓存Redis_中间件】一、快速上手redis缓存中间件

一、铺垫 在当今的软件开发领域&#xff0c;消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能&#xff0c;从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库&#xff0c;不仅提供了丰富的数据结构&#xff0c;…...

AI Agent入门指南

图片来源网络 ‌一、开箱暴击&#xff1a;你以为的"智障音箱"&#xff0c;其实是赛博世界的007‌ ‌1.1 从人工智障到智能叛逃&#xff1a;Agent进化史堪比《甄嬛传》‌ ‌青铜时代&#xff08;2006-2015&#xff09;‌ “小娜同学&#xff0c;关灯” “抱歉&…...

React 第三十节 使用 useState 和 useEffect Hook实现购物车

不使用 redux 实现 购物车案例 使用 React 自带的 useState 和 useEffect Hook 即可实现购物车 export default function ShoppingCar() {// 要结算的商品 总数 以及总价const [totalNum, setTotalNum] useState(0)const [totalPerice, setTotalPerice] useState(0)// 商品…...

Git的简介和简单的命令使用介绍

Git 是一种分布式版本控制系统&#xff0c;常用于跟踪文件的变化&#xff0c;协作开发和管理代码版本。以下是 Git 的基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git 仓库是用来存储项目文件和版本历史的地方。可以通过在本地或远程创…...

概念辨析:Redis 多路 I/O 复用和多线程

Redis 多路 I/O 复用是在 Redis 2.0 引入的&#xff0c;而 Redis 多线程是在 Redis 6.0 引入的&#xff0c;两者不是同一个概念。 多路复用的本质还是同步 I/O&#xff0c;因为最终都需要主线程调用 read() 方法把数据拷贝到用户态。 在并发量非常大的情况下&#xff0c;Redi…...

海洋大地测量基准与水下导航系列之八我国海洋水下定位装备发展现状

中国国家综合PNT体系建设重点可概括为“51N”&#xff0c;“5”指5大基础设施&#xff0c;包括重点推进下一代北斗卫星导航系统、积极发展低轨导航增强系统、按需发展水下导航系统、大力发展惯性导航系统、积极探索脉冲星导航系统&#xff1b;“1”是实现1个融合发展&#xff0…...

计算机系统设计中的一些常用方法

面试中经常被问到&#xff1a; 有一个亿qq号&#xff0c;找出重复的 给你512m内存&#xff0c;找出5g文件中最大的数字 订单超时实现精准关单 … 当然&#xff0c;还有经常遇到的问题&#xff1a; 接口业务逻辑复杂或查数据库慢&#xff0c;相应耗时高 网络因为丢包导致服…...

【征程 6】工具链 VP 示例中 Cmakelists 解读

1. 引言 在文章【征程 6】VP 简介与单算子实操中&#xff0c;介绍了 VP 是什么&#xff0c;并以单算子 rotate 为例&#xff0c;介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一…...

深入解析 Jenkins Agent 的 .jnlp 启动文件

&#x1f9e9; 深入解析 Jenkins Agent 的 .jnlp 启动文件 在 Jenkins 中&#xff0c;通过 JNLP&#xff08;Java Network Launch Protocol&#xff09;方式连接 Agent 是一种常见且灵活的方式。你可能曾见过类似这样的命令&#xff1a; java -jar agent.jar -jnlpUrl file:/…...

谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

0x01、Redis 主从复制的实现原理是什么?

Redis 主从复制概述 Redis 的主从复制是一种机制&#xff0c;允许一个主节点&#xff08;主实例&#xff09;将数据复制到一个或多个从节点&#xff08;从实例&#xff09;。通过这一机制&#xff0c;从节点可以获取主节点的数据并与之保持同步。 复制流程 开始同步&#xf…...

noscript 标签是干什么的

vue public目录下的 index.html 会有 <noscript> 标签不知道是干吗的。 其实 noscript 标签在不支持或是禁用JavaScript 的浏览器中显示替代的内容。这个元素可以包含任何 HTML 元素。这个标签的用法也非常简单&#xff1a; <noscript><strong>Were sorry …...

[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略

目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意&#xff0c;为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结&#xff1a;VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…...

MOP数据库中的EXPLAIN用法

EXPLAIN 是 SQL 中的一个非常有用的工具&#xff0c;主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤&#xff0c;像表的读取顺序、使用的索引情况、数据的访问方式等&#xff0c;这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…...

Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。

一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要&#xff0c;本地优先且可扩展 。使用开源模型 &#xff08;Whisper & Llama&#xff09; 离线工作&#xff0c;高度可扩展 &#xff0c;由插…...

MSCKF及可观性总结

可观性 参考链接 真实VIO系统不能观的维度是4&#xff08;位置和yaw角&#xff09;&#xff0c;由于EKF的转移和观测Jacobian矩阵的线性化点不同、不可观方向噪声的存在&#xff0c;实际MSCKF不能观的维度变成了3&#xff0c;绕重力轴的旋转&#xff08;yaw角&#xff09;被错…...

上篇:新能源轻卡城配物流经济/动力模式量化定义(理论篇)——数学暴力破解工程困局

副标题&#xff1a;用微分方程撕开模式切换本质&#xff0c;用传感器数据重构载重真相 引言&#xff1a;为什么轻卡模式定义比乘用车难10倍&#xff1f; 行业现状痛点&#xff1a; 中国新能源轻卡日均载重波动高达300%&#xff08;空载0kg→满载4.5吨&#xff09;某头部车企实…...

Ubuntu22环境下,Docker部署阿里FunASR的gpu版本

番外: 随着deepseek的爆火,人工智能相关的开发变得异常火爆,相关的大模型开发很常见的agent智能体需要ASR语音识别的功能,阿里开源的FunASR几乎是把一个商业的项目放给我们使用了。那么我们项目中的生产环境怎么部署gpu版本的语音识别服务呢?经过跟deepseek的一上午的极限…...

Python 实现最小插件框架

文章目录 Python 实现最小插件框架1. 基础实现项目结构plugin_base.py - 插件基类plugins/hello.py - 示例插件1plugins/goodbye.py - 示例插件2main.py - 主程序 2. 更高级的特性扩展2.1 插件配置支持2.2 插件依赖管理2.3 插件热加载 3. 使用 setuptools 的入口点发现插件3.1 …...

内网邮箱服务器搭建-详解

目录 一、背景 二、搭建邮箱需要具备的基础知识 1、smtp&#xff08;Simple Mail Transfer Protocol&#xff09; SMTP工作原理 SMTP 命令 SMTP 协议端口 2、pop3&#xff08;Post Office Protocol&#xff09; POP3特点 POP3工作原理 3、imap4&#xff08;Internet M…...

21 天 Python 计划:使用SQLAlchemy 中的ORM查询

文章目录 准备工作图书表 books分类表 categoriesORM 对象定义 一、根据主键获取记录二、AND 查询三、 常用方法四、OR 查询五、 5. AND 和 OR 并存的查询六、巧用列表或者字典的解包给查询方法传参七、其它常用运算符八、查询指定列九、内连接、外连接9.1 内连接9.2 外连接9.3…...