STM32(二):STM32工作原理
- 0、参考
- 1、寄存器和存储器基本概念
- (1)基本概念
- (2)主要区别
- (3)联系
- (4)实际应用中的案例
- (5)总结
- (6)一些名词解释
- 2、STM32指南者板子-存储器区域
- 总划分
- Block0
- Block1
- Block2
- 3、STM32指南者板子-寄存器区域(片子上是存储器的BLOCK2这块区域)
- (1)片上外设基地址
- (2)总线基地址
- (3)GPIO外设基地址
- (4)GPIO外设寄存器地址
- 总结
- 4、C语言使用封装寄存器
- (1)定义结构体GPIO_TypeDef
- (2)定义外设基地址
- (3)使用GPIO_TypeDef把地址强制转换成指针
- (4)则访问任意端口的某个寄存器
- 5、C语言常用位操作
- 对某一位清零a &= ~(1<<2)
- 对某一位取反a ^=(1<<6)
- 对某几位清零a &= ~(3<<2*1)
- 对某几位进行赋值a |= (1<<2*2)
- 6、GPIO-寄存器版
- (1)GPIO七个寄存器
- (2)GPIO八个工作模式
- (3)如何查找GPIO对应的功能
- (4)如何查找GPIO对应的工作模式
0、参考
- https://doc.embedfire.com/mcu/stm32/f103zhinanzhe/std/zh/latest/book/register.html
- https://blog.csdn.net/m0_74091159/article/details/139794521
1、寄存器和存储器基本概念
在计算机系统中,寄存器和存储器是两个重要的概念,它们在数据存储和处理过程中扮演着不同但互补的角色。本文将详细讨论寄存器和存储器的区别与联系。
(1)基本概念
寄存器(Register)是一种速度极快的小容量存储单元,通常集成在CPU内部,用于暂存数据和指令。寄存器可以在一个CPU时钟周期内被读取或写入。
存储器(Memory)通常指随机存取存储器(RAM),是一种速度较慢但容量较大的存储设备,用于存储正在执行的程序和数据。存储器分为主存储器(如DRAM)和辅助存储器(如硬盘、SSD)。
(2)主要区别
速度
寄存器:速度最快,通常是计算机中最快的存储设备,因为它们直接集成在CPU内部,能够在一个时钟周期内进行读写操作。
存储器:速度相对较慢,即使是快速的DRAM,其访问速度也比寄存器慢一个数量级以上。
容量
寄存器:容量非常小,通常在几个字节到几百字节之间。这是因为寄存器的制造成本高,且CPU内部空间有限。
存储器:容量较大,现代计算机的RAM通常在几GB到几十GB之间,而辅助存储器则可达到TB级别。
位置和功能
寄存器:位于CPU内部,主要用于临时存储指令和数据,参与运算操作。例如,累加器(Accumulator)、程序计数器(Program Counter)和状态寄存器(Status Register)。
存储器:位于CPU外部,通过系统总线与CPU连接。用于存储当前运行的程序和数据,是操作系统和应用程序的运行空间。
功能与用途
寄存器:用于快速存取需要立即处理的数据,是CPU执行指令的关键组成部分。例如,寄存器用于存储操作数、结果、地址和控制信息。
存储器:用于存储大量数据和程序,是计算机系统的主要数据存储设备。例如,操作系统、应用程序以及用户数据都存储在存储器中。
(3)联系
虽然寄存器和存储器在性能和用途上有显著区别,但它们之间存在密切的联系:
数据交换
寄存器和存储器之间需要频繁的数据交换。CPU从存储器中读取指令和数据到寄存器,进行处理后,再将结果存回存储器。这种数据交换是通过系统总线和高速缓存(Cache)实现的。
层次结构
寄存器、缓存、主存储器(RAM)和辅助存储器(如硬盘、SSD)构成了计算机的存储层次结构。寄存器在最上层,速度最快但容量最小;辅助存储器在最底层,速度最慢但容量最大。这种层次结构保证了在成本和性能之间的平衡。
性能优化
现代计算机系统通过多级缓存(L1、L2、L3)来优化寄存器和存储器之间的数据交换,从而提升整体性能。缓存存储器介于寄存器和主存储器之间,存储经常使用的数据和指令,减少对较慢存储器的访问次数。
(4)实际应用中的案例
CPU指令执行过程
在执行一条指令时,CPU首先从存储器中取出指令(Fetch),将其存入指令寄存器(Instruction Register)。然后,指令译码器(Decoder)将指令译码,并根据指令类型从存储器或其他寄存器中获取操作数。接下来,执行单元(如算术逻辑单元ALU)对操作数进行运算,并将结果存入目标寄存器或存储器中。
高性能计算
在高性能计算(HPC)中,寄存器和存储器的有效利用对于提高计算效率至关重要。通过优化寄存器分配和存储器访问模式,可以显著提升计算速度。例如,使用寄存器重命名技术可以避免寄存器资源冲突,从而提高指令级并行性。
(5)总结
寄存器和存储器在计算机系统中扮演着不同但互补的角色。寄存器负责快速数据存取和处理,而存储器则提供大量数据和程序的存储空间。通过高效的数据交换和存储层次结构,计算机系统在性能和成本之间找到了平衡。这种分工和协作是现代计算机系统高效运行的基础。
(6)一些名词解释
存储器:
- FLASH:闪存存储器,我们编写好的程序就放在这个地方;
- SRAM:即我们通常说的RAM,程序的变量,堆栈等的开销都是基于内部的SRAM;
- ROM:只读存储器;
2、STM32指南者板子-存储器区域
总划分

Block0

Block1

Block2

3、STM32指南者板子-寄存器区域(片子上是存储器的BLOCK2这块区域)
在存储器Block2这块区域,设计的是片子的外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能, 当我们控制这些单元时就可以驱动外设工作。(使用板子的时候就是用这一块来控制外设)
我们可以找到每个单元的起始地址,然后通过C语言指针的操作方式来访问这些单元, 如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名, 这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

(1)片上外设基地址
即存储器Block2的首地址
0x40000000
(2)总线基地址
片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。 相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中APB1总线的地址最低,片上外设从这里开始,也叫外设基地址。

(3)GPIO外设基地址
总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为“XX外设基地址”,也叫XX外设的边界地址。
以GPIO这个外设来讲解外设的基地址,GPIO属于高速的外设 ,挂载到APB2总线上

(4)GPIO外设寄存器地址
GPIO有很多个寄存器,每一个都有特定的功能。每个寄存器为32bit,占四个字节,在该外设的基地址上按照顺序排列, 寄存器的位置都以相对该外设基地址的偏移地址来描述。
以GPIOB端口为例,说明GPIO都有哪些寄存器
有关外设的寄存器说明可参考《STM32F10xx参考手册》中具体章节的寄存器描述部分,在编程的时候我们需要反复的查阅外设的寄存器说明。
总结
/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)/* GPIO外设基地址 */
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)/* 寄存器基地址,以GPIOB为例 */
#define GPIOB_CRL (GPIOB_BASE+0x00)
#define GPIOB_CRH (GPIOB_BASE+0x04)
#define GPIOB_IDR (GPIOB_BASE+0x08)
#define GPIOB_ODR (GPIOB_BASE+0x0C)
#define GPIOB_BSRR (GPIOB_BASE+0x10)
#define GPIOB_BRR (GPIOB_BASE+0x14)
#define GPIOB_LCKR (GPIOB_BASE+0x18)
4、C语言使用封装寄存器
因为GPIOA ~ GPIOG每一个都有GPIOXXX_CRL ~ GPIOXXX_LCKR,因此在C语言使用定义的时候可以用结构体封装好:
(1)定义结构体GPIO_TypeDef
//寄存器的值常常是芯片外设自动更改的,即使CPU没有执行程序,也有可能发生变化
//编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量,防止编译器优化,
#define __IO volatile
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;// GPIO 寄存器结构体定义
typedef struct
{__IO uint32_t CRL; // 端口配置低寄存器, 地址偏移0X00__IO uint32_t CRH; // 端口配置高寄存器, 地址偏移0X04__IO uint32_t IDR; // 端口数据输入寄存器, 地址偏移0X08__IO uint32_t ODR; // 端口数据输出寄存器, 地址偏移0X0C__IO uint32_t BSRR; // 端口位设置/清除寄存器,地址偏移0X10__IO uint32_t BRR; // 端口位清除寄存器, 地址偏移0X14__IO uint32_t LCKR; // 端口配置锁定寄存器, 地址偏移0X18
} GPIO_TypeDef;;

(2)定义外设基地址
/* 外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)/* 总线基地址 */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)/* GPIO外设基地址 */
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)/*RCC外设基地址:时钟用*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
(3)使用GPIO_TypeDef把地址强制转换成指针
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)// RCC 外设声明
#define RCC ((RCC_TypeDef *) RCC_BASE)/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
(4)则访问任意端口的某个寄存器
/*使用定义好的宏直接访问*/
/*访问GPIOB端口的寄存器*/
GPIOB->BSRR = 0xFFFF; //通过指针访问并修改GPIOB_BSRR寄存器
GPIOB->CRL = 0xFFFF; //修改GPIOB_CRL寄存器
GPIOB->ODR =0xFFFF; //修改GPIOB_ODR寄存器uint32_t temp;
temp = GPIOB->IDR; //读取GPIOB_IDR寄存器的值到变量temp中/*访问GPIOA端口的寄存器*/
GPIOA->BSRR = 0xFFFF;
GPIOA->CRL = 0xFFFF;
GPIOA->ODR =0xFFFF;uint32_t temp;
temp = GPIOA->IDR; //读取GPIOA_IDR寄存器的值到变量temp中
5、C语言常用位操作
对某一位清零a &= ~(1<<2)
以变量a代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量a的某一位清零,且其它位不变
//定义一个变量a = 1001 1111 b (二进制数)
unsigned char a = 0x9f;//对bit2 清零a &= ~(1<<2);//括号中的1左移两位,(1<<2)得二进制数:0000 0100 b
//按位取反,~(1<<2)得1111 1011 b
//假如a中原来的值为二进制数: a = 1001 1111 b
//所得的数与a作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),
//经过运算后,a的值 a=1001 1011 b
// a的bit2 位被清零,而其它位不变。
对某一位取反a ^=(1<<6)
对寄存器的某个位进行取反操作,即 1变0 ,0变1,这可以直接用如下操作,其它位不变
//a = 1001 0011 b
//把bit6取反,其它位不变a ^=(1<<6);
//a = 1101 0011 b
对某几位清零a &= ~(3<<2*1)
//定义一个变量a = 1001 1111 b (二进制数)
unsigned char a = 0x9f;
//1、分组
//若把a中的二进制位分成2个一组
//即bit0、bit1为第0组,bit2、bit3为第1组,
// bit4、bit5为第2组,bit6、bit7为第3组
// 同理,第4~15的高位由于a=0x009f,所以都为0,也是按此方法排列
//2、对第1组的bit2、bit3清零
a &= ~(3<<2*1);//!!!2:以2个为一组,1:第1组,3:清零工具11(二进制)!!!
//括号中的3左移两位,(3<<2*1)得二进制数:0000 1100 b
//按位取反,~(3<<2*1)得1111 0011 b
//假如a中原来的值为二进制数: a = 1001 1111 b
//所得的数与a作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),
//经过运算后,a的值 a=1001 0011 b
// a的第1组的bit2、bit3被清零,而其它位不变。//上述(~(3<<2*1))中的(1)即为组编号;如清零第3组bit6、bit7此处应为3
//括号中的(2)为每组的位数,每组有2个二进制位;若分成4个一组,此处即为4
//括号中的(3)是组内所有位都为1时的值;若分成4个一组,此处即为二进制数“1111 b”//例如对第2组bit4、bit5清零
a &= ~(3<<2*2);
对某几位进行赋值a |= (1<<2*2)
寄存器位先经过上面的清零操作后,再对某几位写入所需要的数值,且其它位不变
//先清零
//a = 1000 0011 b
//此时对清零后的第2组bit4、bit5设置成二进制数“01 b ”a |= (1<<2*2);//1:赋值工具“01 b ”,2:以2个为一组,1:第1组
//a = 1001 0011 b,成功设置了第2组的值,其它组不变
6、GPIO-寄存器版
(1)GPIO七个寄存器
uint32_t CRL; /*GPIO端口配置低寄存器 地址偏移: 0x00 */uint32_t CRH; /*GPIO端口配置高寄存器 地址偏移: 0x04 */uint32_t IDR; /*GPIO数据输入寄存器 地址偏移: 0x08 */uint32_t ODR; /*GPIO数据输出寄存器 地址偏移: 0x0C */uint32_t BSRR; /*GPIO位设置/清除寄存器 地址偏移: 0x10 */uint32_t BRR; /*GPIO端口位清除寄存器 地址偏移: 0x14 */uint16_t LCKR; /*GPIO端口配置锁定寄存器 地址偏移: 0x18 */
(2)GPIO八个工作模式
GPIO_Mode_AIN = 0x0, // 模拟输入GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入GPIO_Mode_IPD = 0x28, // 下拉输入GPIO_Mode_IPU = 0x48, // 上拉输入GPIO_Mode_Out_OD = 0x14, // 开漏输出GPIO_Mode_Out_PP = 0x10, // 推挽输出GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
(3)如何查找GPIO对应的功能
- F:\BaiduNetdiskDownload\A盘(资料盘)[野火]STM32F103指南者_开发板规格书.pdf
如PB0和PB1分别接着LED绿灯和蓝灯:

(4)如何查找GPIO对应的工作模式
- F:\BaiduNetdiskDownload\A盘(资料盘)\3-STM32官方资料\STM32F1官方手册资料\1-STM32F10x-中文参考手册.pdf
若想让PB0对应的绿灯亮起,则应设置PB0的低电平有效,设置GPIOB_CRL为输出推挽模式,在代码中,我们先把控制PB0的端口位清0,然后再向它赋值“0001 b”,从而使GPIOB0引脚设置成输出模式,速度为10M。

// 清空控制PB0的端口位
GPIOB_CRL &= ~( 0x0F<< (4*0));//1111,4组,第0组;注意:低4位哦,所以只清空低4位,别的不要动!!!
// 配置PB0为通用推挽输出,速度为10M
GPIOB_CRL |= (1<<4*0);//0001,4组,第0组
// PB0输出低电平
GPIOB_ODR &= ~(1<<0);//0001,4组,第0组;管脚对于位写1 gpio 管脚为高电平,写 0 为低电平,1生效,0无效
注:以 STM32F103ZET6 芯片为例子,该芯片共有 144 脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组 GPIO 口组有 16 个 GPIO 口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中 x 为0-15,也就是端口的0-15所有引脚,PB0中的0代表CNF0+MODE0要设置,同理还有ODR0。

另外要记得开启时钟:

// 开启 GPIOB 端口 时钟
RCC_APB2ENR |= (1<<3);
相关文章:
STM32(二):STM32工作原理
0、参考1、寄存器和存储器基本概念(1)基本概念(2)主要区别(3)联系(4)实际应用中的案例(5)总结(6)一些名词解释 2、STM32指南者板子-存…...
真实工作项目Java使用apache.poi生成word
加油,新时代打工人! 将实体类利用poi转成Word文件 demo示例 package com.fqpais.util;import com.fqpais.business.domain.TestReportTemplate; import com.fqpais.common.utils.StringUtils; import org.apache.poi.xwpf.usermodel.*; import org.slf4…...
[Python自动化办公]--从网页登录网易邮箱进行邮件搜索并下载邮件附件
[Python自动化办公]–从网页登录网易邮箱进行邮件搜索并下载邮件附件 使用说明 本文使用Python的selenium库进行操作邮箱登录、固定名称搜索邮件并下载附件,Python版本:3.9.16, selenium版本:4.19.0,EdgeBrowser版本:126.0.2…...
mysql8多值索引
MySQL8新出了一个多值索引,我还没体验过呢,今天试一试。 建表 我先建个表试一试多值索引的效果。我粗略地看了下多值索引的介绍,发现是只适用于数组类型的。所以我建一个含有数组字段的表试一试。语法还是挺麻烦的: create tabl…...
MT3055 交换排列
1.思路 若数对为(1,4)和(4,7),则说明14可以互换,47可以互换,并且17也可以互换。所以把可以交换的元素放到一个集合中。 例如样例1:有三个集合,…...
Zkeys三方登录模块支持QQ、支付宝登录
1,覆盖到根目录,并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理,配置管理员权限-系统类别-找到云外科技,全部打勾 3,后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…...
数字探秘:用神经网络解密MNIST数据集中的数字!
用神经网络解密MNIST数据集中的数字! 一. 介绍1.1 MNIST数据集简介1.2 MLP(多层感知器)模型介绍1.3 目标:使用MLP模型对MNIST数据集中的0-9数字进行分类 二.数据预处理2.1 数据集的获取与加载2.2 数据集的探索性分析(E…...
11个IT运维领域必考证书,每一个都含金量极高
这几年,网络方向里,IT运维其实还是挺吃香的。 运维人员的职责不仅仅是确保系统的正常运行,还需要应对突发事件、优化性能以及保障信息安全。 面对如此复杂的工作环境,拥有专业认证不仅是对自身技能的肯定,更是提升职业…...
VScode 常用插件
基础开发插件 Chinese (Simplified)(简体中文语言包):这是适用于VS Code的中文(简体)语言包,适用于英语不太流利的用户。Auto Rename Tag:这个插件可以同步修改HTML/XML标签,当用户修…...
299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源
299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源 在现代软件开发中,API(应用程序接口)是实现应用间通信和功能扩展的关键工具。公共API(Public APIs)则为开发者提供了宝贵的资源&#…...
在目标检测数据集上微调Florence-2
Florence-2是由微软开源的轻量级视觉-语言模型,采用MIT许可。该模型在任务如图像描述、目标检测、定位和分割中展示了强大的零样本和微调能力。 图1。图示展示了每个任务所表达的空间层次和语义细粒度水平。来源:Florence-2:推进多种视觉任务的统一表示。 该模型将图…...
AI提示词:AI辅导「数学作业」
辅导孩子作业对许多家长来说可能是一件头疼的事,但这部分工作可以在一定程度上交给AI来完成。 打开ChatGPT4,输入以下内容: # Role 数学辅导专家## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 专门为小学生…...
odoo文档的安装
步骤 1: 安装必要的软件 确保你已经安装了Git和Python 3.6、3.7或3.8之一。 步骤 2: 克隆 Odoo 文档存储库 打开终端,然后使用Git克隆Odoo的文档存储库。 git clone https://github.com/odoo/documentation.git cd documentation步骤 3: 安装 Python 依赖项 …...
02STM32软件安装新建工程
STM32软件安装&新建工程 1.软件安装:1.1Keil5 MDK安装1.2安装器件支持包离线安装支持包在线安装支持包 1.3软件注册:1.4安装驱动STLINK驱动JLink驱动在此文件夹下USB转串口 2.新建工程2.1STM32开发方式:1.寄存器2.标准库3.HAL库 固件库压…...
社区6月月报 | Apache DolphinScheduler重要修复和优化记录
各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注。 月度Merge Stars 感谢以下小伙伴上个月为Apache DolphinScheduler所做的精彩贡献(排名不分先后…...
Docker 使用基础(2)—镜像
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 4:20 🔄 ◀️ ⏸ …...
Docker学习笔记(三)Dockerfile
一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件,其中包含了从一个基础镜像开始,到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层,指导 Docker 如何安装软…...
学懂C#编程:C# 索引器(Indexer)的概念及用法
C#中的索引器(Indexer)是一种特殊的成员,它允许类或结构的实例像数组那样通过索引来访问其内部的数据。索引器提供了一种灵活的方式来暴露集合或数组类型的内部数据,使得客户端代码可以使用类似于数组下标的语法来访问类的成员&am…...
汇川CodeSysPLC教程03-2-14 与HMI通信
硬件连接 PLC与HMI连接采用何种连接方式,通常是参考双方支持哪些接口。PLC(可编程逻辑控制器)与HMI(人机界面)之间的通讯方式主要有以下几种: 串行通讯(Serial Communication)&…...
centos部署jar包
第一步: 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里,我在opt新建api目录,将jar文件放入,如下图: 第二步: 将需要读取的配置文件也放入此目录(其他目录也可以,和脚本中…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
