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

STM32学习笔记(三) —— GPIO点亮LED

1.GPIO简介

GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个GPIO,其他引脚分别是电源、地、一个复位引脚以及一个BOOT引脚。这51个GPIO被分为不同的组,比如PAx、PBx、PCx等,每组一般是16个GPIO。又因为单片机功能很强大,集成了很多外设(比如UART、I2C、SPI等),但引脚有限,所以一般每个GPIO能复用成好几种功能,对于哪个引脚可以用作哪些功能可以通过查阅数据手册得知。比如PC3引脚,它是第11脚,引脚名称是PC3,可以作为GPIO(PC3),也可以用作ADC的输入引脚

引脚复用1

2.GPIO 结构

SSS2.001

图中所示是GPIO基本的内部控制框图,总体分为输入与输出两部分。每个GPIO端口都可以用对应的寄存器来控制其状态。

3.GPIO 模式

输入浮空,输入引脚内部不进行上下拉
输入上拉,输入引脚内部上拉
输入下拉,输入引脚内部下拉
模拟输入,一般用于模拟量输入,比如ADC输入
开漏输出,引脚只能输出电平,不能输出高电平,可以用于线与功能
推挽输出,既能输出高电平也能输出低电平
推挽复用功能,引脚被其他外设接管(比如UART),能输出高低电平
开漏复用功能,引脚被其他外设接管(比如I2C),只能输出低电平

4.GPIO 寄存器

GPIO寄存器就是来控制GPIO的功能及行为的,可以将GPIO配置成上述列出的各种模式,让GPIO检测输入的信号或者控制其输出高电平或者低电平等
每个GPIO有以下几种寄存器

两个32位配置寄存器GPIOx_CRL and GPIOx_CRH
两个32位数据寄存器GPIOx_IDR and GPIOx_ODR
一个32位置位/复位寄存器GPIOx_BSRR
一个16位复位寄存器GPIOx_BRR
一个32位锁定寄存器GPIOx_LCKR

4.1 GPIOx_CRL and GPIOx_CRH寄存器

GPIOx_CRH寄存器与GPIOx_CRL寄存器类似,只不过GPIOx_CRL寄存器用于控制每组GPIO的0-7个引脚,GPIOx_CRH寄存器用于控制每组GPIO的8-15个引脚,这里重点分析GPIOx_CRL寄存器

GPIOx_CRL

上图是参考手册中的GPIOx_CRL寄存器描述。可以看到这32个位都是由CNFy[1:0] - MODEy[1:0]重复组成(其中,y = 0,1,2…7)。每一对CNFy - MODEy(占4个位)用来配置一个GPIO,CNF0 - MODE0用来控制GPIO0,CNF1 - MODE1用来控制GPIO1,依次类推。所以GPIOx_CRL(共32个位)可以控制GPIO0 - 7这8个引脚,GPIOx_CRH用来控制GPIO8 - 15这8个引脚。GPIO属于哪一组由GPIOx_CRL/H中的x指定(x = A,B,C…)。

MODEy[1:0]用于选择GPIO是输入模式还是输出模式,如果是输出模式可以指定输出的最大速率
CNFy[1:0]用于选择GPIO的工作模式(输入浮空、输入上拉、输入下拉…)

比如配置PC5引脚为推挽输出,输出速率2MHz:
1° PC5属于C组引脚,应该选择GPIOC_CRL或者GPIOC_CRH寄存器
2° PC5是C组第5个引脚,每组0-7这8个引脚用GPIOx_CRL寄存器配置,每组8-15这8个引脚用GPIOx_CRH寄存器配置,应该选择GPIOC_CRL寄存器
3° 配置GPIOC_CRL寄存器中的第20 -23位(CNF5 - MODE5)

/*
0x03是十六进制
换成二进制是11,用32位来表示就是11前面加30个0
0000 0000 0000 0000 0000 0000 0000 0011
左移20位得到
0000 0011 0000 0000 0000 0000 0000 0000
按位取反得到
1111 1100 1111 1111 1111 1111 1111 1111,两个0的位置对应的就是第20 - 21位,也就是MODE5[1:0]
将上面的值与原来的值进行按位与操作就会将MODE5[1:0]清零
*/
GPIOC->CRL &= ~((uint32_t)0x03 << 20); //将 MODE5[1:0] 清0
/*
同理,将0x02 << 20位后再与原来的值按位或就可以将MODE5[1:0]配置为10
GPIOC_CRL寄存器一共有32个位,上述这样赋值的好处是不会干扰其他位的值,只对需要修改的位进行修改
*/
GPIOC->CRL |=  ((uint32_t)0x02 << 20); //将 MODE5[1:0] 配置为10 输出模式,最大速率2MHz
GPIOC->CRL &= ~((uint32_t)0x03 << 22); //将 CNF5[1:0] 清0
/* 上一步已经清0,如果还要配置为0,这一步可以不要 */
GPIOC->CRL |=  ((uint32_t)0x00 << 22); //将 CNF5[1:0] 配置为00 通用推挽输出模式

4.2 GPIOx_IDR and GPIOx_ODR寄存器

GPIOx_IDR寄存器与GPIOx_ODR寄存器类似,只不过GPIOx_IDR寄存器用于读取GPIO口电平状态且各寄存器位只能读不能写(也不需要写),GPIOx_ODR用于控制GPIO口输出电平状态

GPIOx_ODR

从GPIOx_ODR寄存器描述中可以看到, 32位寄存器的高16位是保留的,低16位用于控制GPIO口的电平输出。每一个ODRy用于控制一个GPIO,ODR0用于控制GPIO0,ODR1用于控制GPIO1,依次类推。所以GPIOx_ODR的低16位就足以控制一组GPIO,GPIO属于哪一组由GPIOx_ODR中的x指定(x = A,B,C…)。

ODRy置1对应的GPIO会输出1(高电平),ODRy清0对应的GPIO会输出0(低电平)

比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_ODR寄存器
2° 配置GPIOC_ODR寄存器中的第5位(ODR5)

/* PC5引脚输出0(低电平) */
GPIOC->ODR &= ~((uint16_t)0x01 << 5); //将ODR5清0/* PC5引脚输出1(高电平) */
GPIOC->ODR |= ((uint16_t)0x01 << 5); //将ODR5置1

4.3 GPIOx_BSRR寄存器

GPIOx_BSRR

在GPIOx_BSRR寄存器中,有两种类型的控制位,一种是BRy(高16位),一种是BSy(低16位),最终都是用于控制GPIOx_ODR寄存器。每一个BRy/BSy用于控制一个对应的ODRy位,BR0/BS0用于控制ODR0,BR1/BS1用于控制ODR1,依次类推。而GPIOx_ODR寄存器最终是控制GPIO输出电平状态的,所以可以等效认为BRy/BSy控制的是GPIO输出电平状态,BR0/BS0用于控制GPIO0,BR1/BS1用于控制GPIO1,依次类推。

BRy:写0不会对GPIO输出电平产生影响,置1使对应的GPIO输出低电平
BSy:写0不会对GPIO输出电平产生影响, 置1使对应的GPIO输出高电平

比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_BSRR寄存器
2° 要输出低电平应该选择BRy位,PC5是C组的第5个引脚,应该选择BR5位;要输出高电平应该选择BSy位,PC5应该选择BS5位
3° 配置GPIOC_BSRR寄存器中的第21位(BR5)/第5位(BS5)

/* PC5引脚输出0(低电平) */
/* 0x01 << 5是定位到第5个GPIO,再左移16是定位到BRy位,因为BRy位是GPIOx_BSRR寄存器的高16位 */
GPIOC->BSRR = (((uint32_t)0x01 << 5) << 16);/* PC5引脚输出1(高电平) */
GPIOC->BSRR = ((uint32_t)0x01 << 5);

4.4 GPIOx_BRR寄存器

GPIOx_BRR1
GPIOx_BRR2
GPIOx_BRR寄存器也是用于控制GPIOx_ODR寄存器,与GPIOx_BSRR寄存器中的BRy位功能相同,这里也可以认为是直接控制GPIO输出电平状态的,只能让对应的GPIO输出低电平

比如配置PC5引脚输出0(低电平):
1° PC5属于C组引脚,应该选择GPIOC_BRR寄存器
2° 配置GPIOC_BRR寄存器中的第5位(BR5)

/* PC5引脚输出0(低电平) */
GPIOC->BRR = ((uint16_t)0x01 << 5);

4.5 GPIOx_LCKR寄存器

GPIOx_LCKR寄存器可以锁定GPIOx_CRL与GPIOx_CRH寄存器的配置,一旦对相应的GPIO被锁定后,在下次系统复位之前将不能再更改对应的GPIOx_CRL与GPIOx_CRH寄存器。

锁键写入序列:
对LCKK位 写1 -> 写0 -> 写1 -> 读0 -> 读1,并且在进行写入序列时不能更改LCK[15:0]位的值
最后一个读1可以省略,但可以用来确认锁键已被激活

比如要锁定PC5的配置寄存器(GPIOC_CRL and GPIOC_CRH):

uint32_t xReturn = 0x00;
/* 0x01 << 16 是对LCKK位写1,0x01 << 5 是对LCK5位置1(对PC5的配置寄存器进行锁定) */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 <<5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 读0 */
xReturn = GPIOC->LCKR;
/* 读1 */
xReturn = GPIOC->LCKR;if(xReturn & ((uint16_t)0x01 << 16)) {printf("PC5 has been locked\r\n");
}

当PC5的配置寄存器被锁定后,在下次系统复位之前都不能再更改。如果需要继续锁定其他GPIO,可针对对应的GPIO再次重复上述写序列。

上述对GPIO寄存器进行了一个比较完整的分析,对于其他外设,也同样是操作对应的外设寄存器来实现相应的功能,至于每个外设的寄存器描述可以查阅参考手册。由于STM32寄存器比较多,我们在实际应用时一般很少使用寄存器编程,更多的是使用库编程,后续我们采用HAL库编程的方式进行功能验证

5.硬件连接

在这里插入图片描述

我们开发板上将LED引脚接在单片机的PB1引脚上。当PB1输出高电平时,LED不亮;当PB1输出低电平时,LED点亮。开发板完整的原理图可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

6.寄存器软件编程

1° 这里的PB1引脚是当作普通引脚来使用,所以不能配置成开漏复用或者推挽复用,又要求PB1能输出高低电平,所以要配置成通用推挽输出模式,这里要求的速率不高,可以配置成最大输出速率2MHz就可以。(那为什么不能配置成输入模式呢,因为输入模式下的引脚状态是由外部决定的,内部可以去读取外部引脚状态。我们这里要求PB1引脚既要有高电平也要有低电平,即使外部能让PB1引脚在高低电平之间转换,也不一定是单片机内部程序可控的,所以不能用输入模式。)
2° 在while循环中将LED点亮500ms再熄灭500ms,依次循环。500ms延时可以使用HAL_Delay(500)来实现。

在编程之前,我们还要知道要使用某一个外设功能时,要先打开外设的时钟,时钟的开启在参考手册中RCC(复位和时钟控制)那一章,通过查阅手册可以发现GPIOB的时钟使能位在RCC_APB2ENR寄存器中的第3位

RCC_APB2ENR1
RCC_APB2ENR2

将RCC_APB2ENR寄存器中的第3位置1就可以开启GPIOC的时钟,其他外设时钟的开启也是类似的。

开启GPIOC时钟代码:

RCC_APB2ENR |= ((uint16_t)0x01 << 3); //开启GPIOB时钟

在上一节调试串口的基础上增加以下代码:

/* 在while循环之前添加以下初始化代码 */
RCC->APB2ENR |=  ((uint16_t)0x01 << 3 ); //开启GPIOB时钟
/* 配置PB1为通用推挽输出模式,输出速率设置为2MHz */
GPIOB->CRL &= ~((uint32_t)0x03 << 4); //将 MODE1[1:0] 清0
GPIOB->CRL |=  ((uint32_t)0x02 << 4); //将 MODE1[1:0] 配置为10 输出模式,最大速率2MHz
GPIOB->CRL &= ~((uint32_t)0x03 << 6); //将 CNF1[1:0]  清0
GPIOB->CRL |=  ((uint32_t)0x00 << 6); //将 CNF1[1:0]  配置为00 通用推挽输出模式/* PB1引脚输出1(高电平),默认熄灭LED */
GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0(低电平)点亮LED */GPIOB->BSRR = (((uint32_t)0x01 << 1) << 16); //这里也可以使用BRR寄存器、ODR寄存器/* 延时 */HAL_Delay(500);/* PB1引脚输出1(高电平)熄灭LED */GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器/* 延时 */HAL_Delay(500);
}

将程序下载到开发板,发现LED会以500ms的间隔不停闪烁。

上述我们使用的是寄存器来实现LED亮灭的功能的,下面我们使用STM32CubeMX来配置HAL库实现LED亮灭功能。

7.HAL库软件编程

使用STM32CubeMX打开工程文件

打开工程文件

按下图所示找到PB1引脚,点击后在弹出的选项中选择GPIO_Output

PC5

按下图配置PB1引脚

在这里插入图片描述

生成代码后,可以发现在gpio.c文件中已经配置好了PB1引脚:

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable *//* 开启GPIO时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/* 开启GPIOB时钟 */__HAL_RCC_GPIOB_CLK_ENABLE();/* 这里将PB1引脚默认输出高电平 *//*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/*Configure GPIO pin : PtPin *//* 这里是PB1引脚,我们给他定义了一个标签LED,所以他显示LED_Pin */GPIO_InitStruct.Pin = LED_Pin; //在main.h中有定义:#define LED_Pin GPIO_PIN_1/* 推挽输出模式 */GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;/* 无上下拉 */GPIO_InitStruct.Pull = GPIO_NOPULL;/* 输出速率选择 */GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;/* 调用HAL_GPIO_Init对PC5进行初始化 */HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); //在main.h中有定义:#define LED_GPIO_Port GPIOB
}

以上就是STM32CubeMX对PB1引脚做的初始化配置,并且会在main函数中调用初始化配置函数MX_GPIO_Init()。对于如何使用这个引脚是由我们自己实现的,不过有相关的库函数可供我们调用,这些函数可以在对应外设的头文件中查找。比如GPIO相关的接口函数可以在stm32f1xx_hal_gpio.h中找到

stm32f1xx_hal_gpio.h

我们上述初始化PC5引脚时调用的就是HAL_GPIO_Init函数,如果需要让PC5引脚输出高低电平可以调用
HAL_GPIO_WritePin函数。在对应外设的源文件中可以找到相关函数,函数定义上方有注释说明函数各个参数的含义。比如在stm32f1xx_hal_gpio.c中的HAL_GPIO_WritePin函数

HAL_GPIO_WritePin

第一个参数是指定哪一组GPIO,我们使用PB1,是B组,就是GPIOB;
第二个参数是指定哪一个引脚,我们使用PB1是C组第1个引脚,就是GPIO_PIN_1;
第三个参数是指要在引脚上输出的电平状态,GPIO_PIN_RESET是输出低电平,GPIO_PIN_SET是输出高电平。

那我们要让LED灯亮灭时就可以调用HAL_GPIO_WritePin函数,我们在while函数中编程:

/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0(低电平)点亮LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);/* 延时 */HAL_Delay(500);/* PB1引脚输出1(高电平)熄灭LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/* 延时 */HAL_Delay(500);
}

将程序下载到开发板后,发现LED会以500ms的间隔不停闪烁。

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

以上是通过开发板进行实际验证的,下面使用软件仿真,

我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),按下图所示打开逻辑分析仪

在这里插入图片描述

点击 Setup…

在这里插入图片描述

添加PB1端口

在这里插入图片描述

选择显示类型为Bit

在这里插入图片描述

点击Close就可以在逻辑分析仪中看到我们添加的PB1端口

在这里插入图片描述

点击全速运行后,就可以看到PB1的波形,每隔500ms翻转一次状态( 高低电平 )

在这里插入图片描述

注:逻辑分析仪中每一隔代表的时间间隔,可以通过,先将鼠标光标移到波形区域,使用鼠标中的滚轮滚动调节

相关文章:

STM32学习笔记(三) —— GPIO点亮LED

1.GPIO简介 GPIO&#xff0c;全称是General-purpose input/output&#xff08;通用输入输出&#xff09;。在单片机中是表示能被控制的引脚&#xff0c;能检测输入信号的高低电平&#xff0c;也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚&#xff0c;其中有51个…...

gRPC使用详解

起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年&#xff0c;当时谷歌发布了一款开源RPC框架&#xff0c;名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…...

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…...

测试工作(新入职)感悟

背景&#xff1a;我之前在小规模传统公司&#xff0c;工作强度一般&#xff0c;早九晚六&#xff0c;偶尔加班。现在就职的是大型同行业互联网公司&#xff0c;工作强度大&#xff0c;早九晚九&#xff0c;目前已经入职两个礼拜。 基于这个背景&#xff0c;新工作对我是比较有…...

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…...

Linux下的线程操作

一、多线程的创建于退出 1. pthread_create(线程的创建) pthread_create 是 POSIX 线程库中的函数&#xff0c;用于创建一个新的线程。 函数原型如下&#xff1a; int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void…...

机器学习 | 如何利用集成学习提高机器学习的性能?

目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…...

[Python] 什么是PCA降维技术以及scikit-learn中PCA类使用案例(图文教程,含详细代码)

什么是维度&#xff1f; 对于Numpy中数组来说&#xff0c;维度就是功能shape返回的结果&#xff0c;shape中返回了几个数字&#xff0c;就是几维。索引以外的数据&#xff0c;不分行列的叫一维&#xff08;此时shape返回唯一的维度上的数据个数&#xff09;&#xff0c;有行列…...

npm 淘宝镜像正式到期,更新使用成功

npm 淘宝镜像原网址&#xff1a;https://registry.npm.taobao.org/ npm 淘宝镜像更新后网址&#xff1a;https://registry.npmmirror.com 过程&#xff1a; 部署 nuxt docker 容器的时候&#xff0c;报以下错&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CE…...

python_蓝桥杯刷题记录_笔记_全AC代码_入门2

前言 现在正式进入蓝桥杯的刷题啦&#xff0c;用python来做算法题&#xff0c;因为我之前其实都是用C来做题的&#xff0c;但是今年的话我打算换python来试试&#xff0c;很明显因为也才这学期接触python 加上之前C做题也比较菜&#xff0c;所以我打算用python重新来做题&#…...

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…...

2023_12蓝桥杯STEMA 考试 Scratch 中级试卷解析

2023蓝桥杯STEMA 考试 Scratch 中级试卷(12 月)解析 由于没有原始文件,这里使用的角色和背景和实际题目会有所差异,已经尽量还原原题,以下代码仅供参考。吐槽一句:蓝桥杯越来越变态了!\(`Δ’)/\(`Δ’)/\(`Δ’)/孩子学习速度永远也赶不上内卷的速度。 一、选择…...

从编程中理解:大脑中的杏仁核

编程和神经科学在某种程度上可以相互借鉴,尤其是在模拟大脑功能时。让我们以Unity游戏引擎中的C#代码为例,结合金庸武侠小说中的人物形象来构建一个类比故事,探讨如何通过编程模拟大脑中杏仁核的作用。 假设在一款名为“脑海江湖”的Unity游戏中,主角张无忌(代指玩家角色…...

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…...

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接&#xff1a;20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路&#xff1a;遇到左括号直接进栈&#xff1b;遇到右括号判断站顶是否有匹配的括号&#xff0c;没有就返回flase&#xff0c;有就将栈顶元素出栈&#xff1…...

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…...

ElementUI安装与使用指南

Element官网-安装指南 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令&#xff1a;brew install node node.js安装完后&#xff0c;输入&#xff1…...

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…...

项目安全-----加密算法实现

目录 对称加密算法 AES &#xff08;ECB模式&#xff09; AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法&#xff0c;是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话&#xff0c;双方需要先约定一个密钥&#xff0c;加密方才能加密&#…...

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...