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

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);}}}

二、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通讯的双方必须事先约定好波特率,即单位事件内传输码元的个数。

三、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…...

OpenStack Yoga版安装笔记(十八)Self-service networks配置笔记

1、官方文档 在OpenStack官方安装文档中&#xff0c;提供了两个网络配置选项&#xff1a; Option1&#xff1a;Provider networksOption2&#xff1a;Self-service networks 这两个选项并不冲突&#xff0c;可以在OpenStack环境中同时配置。 在《OpenStack Yoga版安装笔记&…...

2025年黑龙江建筑安全员 C3 证考试题库练习题

黑龙江建筑安全员 C3 证考试题库练习题 1、消防控制室是设有火灾自动报警设备和消防设施控制设备&#xff0c;用于接收、显示、处理&#xff08; &#xff09;&#xff0c;控制相关消防设施的专门处所2。 A. 安全信息 B. 设备信息 C. 通讯信号 D. 火灾报警信号 答案&…...

JavaScript数据结构-Map的使用

在 JavaScript 中&#xff0c;Map 是 ES6 引入的一种新的数据结构&#xff0c;它类似于对象&#xff0c;也是键值对的集合&#xff0c;但 Map 的键可以是任意类型的值&#xff08;对象、函数、基本类型等&#xff09;&#xff0c;而传统对象的键只能是字符串或 Symbol&#xff…...

LeetCode面试经典150题

目录 力扣80. 删除有序数组中的重复项 II 代码解析 力扣274. H 指数 代码解析 力扣151. 反转字符串中的单词 解析代码 力扣12. 整数转罗马数字 解析代码 力扣28. 找出字符串中第一个匹配项的下标 解析代码1&#xff08;暴力模拟&#xff09; 解析代码2&#xff08;K…...

mysql之等值连接8个实例

以下实例以常见的业务场景为例&#xff0c;使用 MySQL 语法&#xff0c;假设存在员工表&#xff08;employees&#xff09;、部门表&#xff08;departments&#xff09;、订单表&#xff08;orders&#xff09;、客户表&#xff08;customers&#xff09;等&#xff0c;来展示…...

C基础笔记_指针专题

一:C 和 C 偏爱使用指针的原因 1. 通过指针可以直接操作内存 C 和 C 是系统级编程语言&#xff0c;它们的设计目标之一是允许开发者直接与硬件交互并高效地管理资源。 指针的本质&#xff1a;指针本质上是一个存储内存地址的变量&#xff0c;它让程序员可以直接访问和操作内…...

GPT-SoVITS Windows 配置与推理笔记(自用)

GPT-SoVITS Windows 配置与推理笔记&#xff08;自用&#xff09; 这是给自己留的备份&#xff0c;方便下次查。Windows 端配置和推理为主&#xff0c;代码为核心&#xff0c;直接干货。 环境准备 系统&#xff1a;Windows 10/11Python&#xff1a;3.9&#xff08;别用别的版…...

【设计模式】面向对象开发学习OOPC

PLOOC-裸机思维 PLOOC OOPC精要——撩开“对象”的神秘面纱 C/C面向对象编程之封装-KK 面向过程&#xff0c;本质是“顺序&#xff0c;循环&#xff0c;分支”面向对象&#xff0c;本质是“继承&#xff0c;封装&#xff0c;多态”参考的书籍&#xff1a;《UMLOOPC嵌入式C语言…...

LVGL开发指南

一、主流ARM开发UI界面库 主流ARM开发UI界面库的详细对比分析,从多个维度评估各库的适用场景: 1. 基础对比表 特性LVGLQt for MCUEmbedded WizardTouchGFXemWin许可证MIT开源商业商业商业(STM32免费)商业RAM最小需求16KB512KB64KB256KB50KBFlash占用64KB+1MB+200KB+500KB+1…...

linux shell looop循环写法

在 Linux Shell 中编写loop循环的常见方法有以下几种&#xff0c;适用于持续执行任务或监控场景&#xff1a; 1. while true 循环&#xff08;最常用&#xff09; while true; do# 循环体内的命令echo "Running..."sleep 1 # 避免 CPU 占用过高 done 终止方式&…...

【力扣hot100题】(075)数据流的中位数

一开始只建立了一个优先队列&#xff0c;每次查询中位数时都要遍历一遍于是喜提时间超限&#xff0c;看了答案才恍然大悟原来还有这么聪明的办法。 方法是建立两个优先队列&#xff0c;一个大根堆一个小根堆&#xff0c;大根堆记录较小的数&#xff0c;小根堆记录较大的数。 …...

蓝桥杯刷题总结 + 应赛技巧

当各位小伙伴们看到这篇文章的时候想必蓝桥杯也快开赛了&#xff0c;那么本篇文章博主就来总结一下一些蓝桥杯的应赛技巧&#xff0c;那么依旧先来走个流程 那么接下来我们分成几个板块进行总结 首先是一些基本语法 编程语言的基本语法 首先是数组&#xff0c;在存数据的时候…...

JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端

不到一年的时间&#xff0c;JetBrains 又要对 Terminal 「大刀阔斧」&#xff0c;本次发布的新终端是重构后的全新的架构&#xff0c;而上一次终端大调整还是去年 8 月的 v2024.2 版本&#xff0c;并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…...

怎么构造思维链数据?思维链提示工程的五大原则

我来为您翻译这篇关于思维链提示工程的文章&#xff0c;采用通俗易懂的中文表达&#xff1a; 思维链(CoT)提示工程是生成式AI(GenAI)中一种强大的方法&#xff0c;它能让模型通过逐步推理来解决复杂任务。通过构建引导模型思考过程的提示&#xff0c;思维链能提高输出的准确性…...

mongodb--用户管理

文章目录 MongoDB 用户管理1. 连接到 MongoDB2. 用户创建2.1 创建管理员用户2.2 创建特定数据库用户2.3 常用内置角色 3. 用户管理操作3.1 查看所有用户3.2 查看特定用户信息3.3 更新用户密码3.4 添加用户角色3.5 移除用户角色3.6 删除用户 4. 权限修改4.1 创建自定义角色4.2 将…...

2025年考OCP认证有用吗?

在数字化转型的浪潮中&#xff0c;数据库管理技术成为企业核心竞争力的基石。Oracle作为全球领先的数据库解决方案提供商&#xff0c;其OCP&#xff08;Oracle Certified Professional&#xff09;认证不仅是技术能力的权威背书&#xff0c;更是职业发展的强力引擎。以下从多个…...

川翔云电脑:D5 渲染摆脱硬件限制,云端高效创作

在设计领域&#xff0c;D5 渲染器凭借实时光追技术、高效工作流程及优质输出效果&#xff0c;成为设计师的得力工具。然而&#xff0c;其对高端 RTX 显卡的依赖&#xff0c;导致硬件成本高、本地性能受限及办公地点固定等问题&#xff0c;让不少创作者望而却步。 D5 渲染器的优…...

设计模式(23种设计模式简介)

设计模式 简介 设计模式是解决软件设计中常见问题的可重用解决方案模板&#xff0c;通过总结反复验证的代码设计经验&#xff0c;提升代码的可重用性、可维护性和扩展性。其核心是通过标准化的设计思想&#xff0c;让代码更易理解、协作更高效&#xff0c;并在面向对象编程中…...

Python设计模式:工厂模式

1. 什么是工厂模式&#xff1f; 工厂模式是一种创建对象的设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但不暴露对象创建的具体逻辑。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;从而提高代码的灵活性和可维护性。 1.1 工厂模式的类型 1.1.1 简…...

UE5 给函数分类

如果函数太多不方便找&#xff0c;我们可以给函数设置一个分组 选中一个函数&#xff0c;修改它的类别 然后在函数列表里可以看到分好的类 其他函数可以直接拖进类别里&#xff0c;不用每个函数都手动设置类别 一次只能拖动一个函数...

5️⃣ Coze+AI应用基础教学(2025年全新版本)

目录 一、了解应用开发 1.1 扣子应用能做什么 1.2 开发流程 1.3 开发环境 二、快速搭建一个AI应用 2.1 AI翻译应用介绍 2.2 设计你的应用功能 2.3 创建 AI 应用项目 2.4 编写业务逻辑&#xff08;新建工作流&#xff09; 2.5 搭建用户界面 2.6 效果测试 2.7 发布应…...

高级前端题库

前端题库 JS篇 如何理解作用域和作用域链 作用域 作用域就是变量或函数在其内能够被访问的“可见区域” 全局作用域局部作用域 作用域链 当在某个作用域中尝试访问一个变量时&#xff0c;JS引擎会从当前作用域开始&#xff0c;沿着作用域链向上逐级开始查找&#xff0c;直到…...

博途 TIA Portal之1200做主站与汇川EASY的TCP通讯

前言,虽然已经做了几篇关于TCP通讯的文章,但是不同的PLC之间的配合可能不同,下面将演示这种差异。 关于汇川EASY做从站的配置请参见下方链接文章:汇川EASY系列之以太网通讯(套接字socket做从站)_汇川以太网tcp套接字fb块-CSDN博客 1、硬件准备: 1200PLC,汇川EASY320…...

在conda虚拟环境安装GIT并且克隆github上项目指南(解决443问题)

此次笔记记录自己在conda虚拟环境安装git&#xff0c;同时克隆github项目&#xff0c;并且解决了git的443问题。 如有不妥欢迎各位大佬批评指正。 首先默认你已经安装了anaconda。 代开命令提示行 配置环境 #首先创建虚拟环境 conda create -n git_env python3.8 #激活虚拟环…...

JavaWeb遇到的问题汇总

问题一&#xff1a;&#xff08;键值对最后一项没有逗号&#xff09; 在JSON字符串转自定义对象和自定义对象转JSON字符串时&#xff1a; 如图所示&#xff1a;若忘记删除键值对的最后一项没有逗号时&#xff0c;则下一句转换不会生效&#xff0c;应该删除最后一项的逗号。 解…...

Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)——项目学习记录

目录 前言 一、数据集&#xff1a;图像文本&#xff0c;部分选取于DeepFashion 二、优化一&#xff0c;img2img 三、优化二&#xff0c;微调sd参数 四、优化三&#xff0c;dreamshaper优化 五、优化四&#xff0c;sdv1.5contronet 六、问题探索历程 1. 从 SDXL 到轻量化模…...

【“星睿O6”AI PC开发套件评测】在O6开发板使用gemma-2b测试CPU性能

前提条件&#xff1a; x64 Linux 主机&#xff1a;安装CMake 和 arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu radxa O6主机 1.从 Kaggle 获取模型权重和分词器 Gemma 3 2B 模型文件&#xff1a;访问 Kaggle 上的 Gemma 模型页面 https://www.kaggle.com/mode…...

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题 对于一个递推问题&#xff0c;如递推式的每一项系数都为常数&#xff0c;我们可以使用矩阵快速幂来对算法进行优化。 一般形式为&#xff1a; F n F 1 A n − 1 F_nF_1A^{n-1} Fn​F1​An−1 由于递推式的每一项系数都为常数&#xff0c;因此对…...

3DMax中模型解组

1、从网上下载下来的模型是一个整体&#xff0c;需要解开查看每个样式 2、解开组...

链路聚合+vrrp

1.链路聚合 作用注意事项将多个物理接口&#xff08;线路&#xff09;逻辑上绑定在一起形成一条逻辑链路&#xff0c;起到叠加带宽的作用1.聚合接口必须转发速率一致。2.聚合设备两端必须一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先创建聚合接口&#xff0c;…...

0 std::process::Command 介绍

std::process::Command 是 Rust 标准库中用于创建和配置子进程的主要类型。它允许你启动新的进程、设置其参数和环境变量、重定向输入/输出等。 基本用法 use std::process::Command;let output Command::new("echo").arg("Hello, world!").output().ex…...

Android 中Intent 相关问题

在回答 Intent 问题时&#xff0c;清晰区分其 定义、类型 和 应用场景。以下是的回答策略&#xff1a; 一、Intent 的核心定义 Intent 是 Android 系统中的 消息传递对象&#xff0c;主要用于三大场景&#xff1a; 2. 隐式 Intent&#xff08;Implicit Intent&#xff09; 三、…...

【Docker】Docker Desktop镜像存储路径设置方法

在 Docker Desktop 中设置镜像存储路径&#xff08;即下载的镜像文件存放位置&#xff09;取决于你的操作系统。以下是不同系统下的设置方法&#xff1a; Windows 系统 完全卸载后重新安装指定路径&#xff08;Docker Desktop for Windows 默认使用 C:\ProgramData\Docker&…...

Spring Boot 3.x 中 WebClient 全面详解及示例

Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义&#xff1a;Spring 5 引入的响应式 HTTP 客户端&#xff0c;用于替代 RestTemplate&#xff08;已弃用&#xff09;&#xff0c;支持异步非阻塞的 HTTP 请求。核心特性&#xff1a; 支持所有 HTTP 方法&a…...

将图片按照指定大小批量进行裁剪(可设置步长_python)

将图片按照指定大小批量进行裁剪(可设置步长_python) import os from PIL import Image# 设置更高的图像大小限制&#xff0c;禁用解压炸弹检查 Image.MAX_IMAGE_PIXELS None # 禁用解压炸弹检查def crop_image(image_path, block_size(640, 640), step_size(340, 340)):# 打…...

设计模式 --- 原型模式

原型模式是创建型模式的一种&#xff0c;是在一个原型的基础上&#xff0c;建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销&#xff0c;我们可以使用原型模式来建立一个非常类似于复印机的…...

工作经验记录

坑 部门例会上:跨级暴露问题.部门例会上:说话没有条理,周报写得好,但是表达效果不同.领导直接要求的任务没有当时推进:需考虑GTD清单.不要马后炮领导签字要按顺序 会议上 发言有条理问题不要越级暴露不要强调过程 对同事 对领导 领导同意的文件最好当日通过. 对供应商 不…...

Unity中基于2.5D的碰撞系统

在2.5D游戏中实现精确的碰撞检测是一个关键挑战&#xff0c;因为我们需要在视觉上有深度感的同时保持游戏逻辑的准确性。下面我将详细解析2.5D碰撞系统的实现方法。 1. 2.5D碰撞的核心问题 1.1 Z轴深度与碰撞的关系 视觉表现&#xff1a;物体通过Y轴位置影响Z轴排序&#xff…...

设计模式-命令模式详解

命令模式详解及真实场景解决方案 模式定义 命令模式是一种行为设计模式&#xff0c;将请求封装为独立对象&#xff0c;包含执行操作所需的所有信息。通过这种方式&#xff0c;可以实现请求的参数化、队列管理、撤销/重做等高级功能&#xff0c;同时解耦请求发送者与接收者。 …...

基于Python(Django)+SQLite 实现(Web) 点菜管理系统

点菜管理系统 课程设计任务与要求 1、任务 题目&#xff1a;点菜管理信息系统 问题描述&#xff1a; 随着网络的迅速发展&#xff0c;越来越多的人开始接受甚至时依赖了网络营业的这种交易形式&#xff0c;传统的点菜模式不仅浪费时间&#xff0c;效率低下&#xff0c;而且…...

泰鸿万立上市:加强产品规划和前瞻性研发 打造优质汽车零部件制造商

4月9日&#xff0c;浙江泰鸿万立科技股份有限公司&#xff08;股票简称“泰鸿万立”&#xff0c;股票代码“603210”&#xff09;正式登陆上交所主板。 招股书显示&#xff0c;泰鸿万立主营业务为汽车结构件、功能件的研发、生产与销售。经过十余年发展&#xff0c;公司拥有了…...

Charles的安装和使用教程

Charles抓包工具与Sniff Master在Windows上的安装与使用指南 1. Charles抓包工具安装 1.1 下载Charles 进入Charles官网(https://www.charlesproxy.com/download/)下载最新版本的安装包 1.2 安装与激活 正常安装后&#xff0c;打开会提示试用版30天限制进入授权码生成页面…...

论文阅读笔记:Adaptive Multi-Modal Cross-Entropy Loss for Stereo Matching

论文阅读笔记&#xff1a;Adaptive Multi-Modal Cross-Entropy Loss for Stereo Matching 1 背景2 创新点3 方法4 模块4.1 基础和问题描述4.2 自适应多模态概率模型4.3 主模态视差估计器 5 效果6 结论 1 背景 尽管深度学习在立体匹配方面取得了巨大成功&#xff0c;但恢复准确…...

JavaScript学习教程,从入门到精通,JavaScript 运算符及语法知识点详解(8)

JavaScript 运算符及语法知识点详解 一、JavaScript 运算符 1. 算术运算符 用于执行数学运算&#xff1a; 加法- 减法* 乘法/ 除法% 取模&#xff08;余数&#xff09; 递增-- 递减** 幂运算&#xff08;ES6&#xff09; let a 10, b 3; console.log(a b); // 13 conso…...

聊聊Spring AI的ETL Pipeline

序 本文主要研究一下Spring AI的ETL Pipeline DocumentReader org/springframework/ai/document/DocumentReader.java public interface DocumentReader extends Supplier<List<Document>> {default List<Document> read() {return get();}}有TextReader…...

spark架构和RDD相关概念

运行架构&#xff1a; Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件 Driver&#xff1a;执行Spark任务的main方法&#xff0c;将用户程序转化为作业&#xff0c;在Executor间调度任务&…...

Cloud Kernel SIG 季度动态:发布ANCK 6.6-003版本,支持一测多证

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 发布 ANCK 6.6-003 版本。 一测多证流程建立。 OOT 驱动基线更新。 海光平台适配进展更新…...

【11】数据结构之基于线性表的查找算法

目录标题 平均查找长度ASL(Average Search Length)顺序表查找法折半查找法索引顺序查找法 平均查找长度ASL(Average Search Length) 定义&#xff1a;为确定元素在列表中的位置&#xff0c;需要和给定值进行比较的关键字个数的期望值&#xff0c;称之为查找算法成功时的平均查…...

铼赛智能Edge mini斩获2025法国设计大奖 | 重新定义数字化齿科美学

铼赛智能&#xff08;RAYSHAPE&#xff09;革命性新品——椅旁3D打印机Edge mini荣获2025年法国设计奖&#xff08;FRENCH DESIGN AWARDS&#xff0c;简称FDA&#xff09;产品设计类大奖。作为全球工业设计领域最具影响力的奖项之一&#xff0c;这一殊荣不仅是对产品极简美学的…...