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

STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路

        我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:=>N*(ARR+1)+CCRx的值

N是在这段时间内,可能会发生的N次溢出。CCRx是寄存器中的计数,ARR打满65536-1

N个重装载值+CCRx的值

 2、实验目的

  • 使 用 定 时 器 2 通 道 2 来 捕 获 按 键 2 按 下 时 间 , 并 通 过 串 口 打 印 。
  • 计 一 个 数 的 时 间:1 u s , P S C = 7 1 , A R R = 6 5 5 3 5
  • 下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

为什么要使用定时器2通道2来捕获按键2?

这个板子只有两个按键。一个是key1,一个是key2,分别对应A0和A1引脚

原理图

产品手册(17页)

在这里可以看到,KEY1是接的定时器2通道1的ETR引脚,通过下图我们可以看出来,ETR引脚是作为一个输入源的,而我们这里是想要一个通道,所以这里使用KEY2

中文参考手册(254页)

1s = 1000 000us

P S C = 7 1 

PSC+1=72

72/72MHZ

1个时间周期 = 1/1000 000 = 1us

这里使用1us来表示记一个数的时,也可以更小,A R R = 6 5 5 3 5,直接把ARR拉满

上面是对时基单元配置

下面是对通道的配置

下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

滤波器先不要,对边沿检测时,先对下降沿检测,然后迅速在回调函数中对上升沿进行检测。

分频器不分频

3、实现输入捕获功能

复制项目文件19,重命名为20-实现捕获功能

打开项目文件

创建文件夹ic

加载文件

编译

编译

编译

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//printf("hello word!\r\n");ic_init(72-1,65536-1);while(1){ }
}

ic.c

#include "ic.h"
#include "stdio.h"TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{printf("捕获一个下降沿\r\n");
}

ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"void ic_init(uint16_t psc,uint16_t arr);#endif

 在ic.c函数中

ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电

如果

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;//配置输入捕获通道的输入信号选择为间接定时器输入模式。

TIM Input 1 被选择连接到 IC2。

TIM Input 2 被选择连接到 IC1。

TIM Input 3 被选择连接到 IC4。

TIM Input 4 被选择连接到 IC3。

如果这里的ic_config.ICSelection设置成下面这个参数

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;

则摁KEY1才会响应按键

这是因为定时器2则连接到通道1中

在串口助手中摁KEY2会显示

4、实现一次完整的按键动作

复制项目文件20-实现捕获功能,重命名21-捕获一次完整的按键动作

在上面实现了捕获下降沿,在这里将会实现捕获上升沿,整合就会实现一次完整的按键动作。

具体流程如下:

succeed_flag:是否发生了一次完整的按键动作标志位

falling_flag:下降沿标志,当falling_flag = 0时(默认情况下),代表下降沿捕获成功;

当falling_flag = 1时(默认情况下),代表上升沿捕获成功;

这里用到两个函数

TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2);//这行代码的作用是重置定时器捕获通道2的触发极性。
TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING);//这行代码的意思是:为ic_handle所指向的定时器的第二个通道配置输入捕获极性为上升沿(即输入信号从低电平变为高电平时)。

在STM32的HAL库中,TIM_RESET_CAPTUREPOLARITY函数用于重置定时器的捕获通道的触发极性。具体来说,这个函数会将指定通道的触发极性设置为默认值,通常是上升沿或下降沿。

IM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING); 这行代码是在使用STM32 HAL库(硬件抽象层库)进行定时器(TIM)的输入捕获配置时使用的。

代码流程:定义一个结构体,用于存放标志位和统计时间,在回调函数中,当用户按下按键,最初赋值是下降沿检测,检测到下降沿触发中断,响应回调函数,在回调函数中,初始的相应完整按键的标志位为0,执行if,初始响应上升沿标志位为0,执行else,在else中,将响应上升沿标志位 置1,并且将检测下降沿重置为检测上升沿,则在下次进入回调函数时,由于检测完整按键的标志位依旧为0,进入if,检测上升沿标志位为1,进入if,执行上升沿函数代码段。

代码如下:

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"struct
{uint8_t succeed_flag;//完整的按键动作标志位uint8_t rising_flag;//上升标志位uint8_t falling_flag;//下降标志位uint16_t timeout_cnt;//时间统计}capture_status={0};//全部初始化为0TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整{if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿{printf("捕获一个上升沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿}else{//未捕获到上升沿,现在是下降沿printf("捕获一个下降沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿}}}
}

打开串口助手

按下按键2,串口显示

5、测量按键按下时间

回顾:如何测量按键按下的时间计算?

在按键按下的瞬间,检测到下降沿时,立刻把计时器关闭,将计数器置0,再打开(重启一下),使其从头开始计数,在未检测到上升沿之前,计数器中间可能会发生几次溢出,当检测到上升沿时,关闭计数器,查询当前计数器寄存器中的值。

复制项目文件21-捕获一次完整的按键动作,重命名为22-测量按键按下时间

__HAL_TIM_DISABLE(&ic_handle); 这行代码是在使用STM32 HAL库时,用于禁用(或停止)一个定时器的功能

__HAL_TIM_SET_COUNTER(&ic_handle, 0); 这行代码在使用STM32 HAL库时,用于设置定时器的计数器值。

__HAL_TIM_ENABLE(&ic_handle);//用于打开计数器

HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2); 这行代码在使用STM32 HAL库时,用于读取定时器指定通道的捕获值。

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//printf("hello word!\r\n");ic_init(72-1,65536-1);while(1){ pressed_time_get();delay_ms(500);}
}

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"struct
{uint8_t succeed_flag;//完整的按键动作标志位uint8_t rising_flag;//上升标志位uint8_t falling_flag;//下降标志位uint16_t timeout_cnt;//时间统计}capture_status={0};//全部初始化为0
uint16_t last_cnt = 0;TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整{if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿{printf("捕获一个上升沿\r\n");capture_status.succeed_flag = 1;//检测到一个完整的按键动作TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿last_cnt = HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2);//用于读取定时器指定通道的捕获值。}else{//未捕获到上升沿,现在是下降沿printf("捕获一个下降沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的__HAL_TIM_DISABLE(&ic_handle); //用于禁用(或停止)一个定时器的功能__HAL_TIM_SET_COUNTER(&ic_handle, 0);//用于设置定时器的计数器值。TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿__HAL_TIM_ENABLE(&ic_handle);//用于打开计数器}}}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//溢出中断回调函数
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//在没有产生完整按键时{if(capture_status.rising_flag == 1)//边沿检测标志位等于1,代表在产生下降沿之后,上升沿之前这段时间,产生的溢出进行计数{capture_status.timeout_cnt++;}}}
}
void pressed_time_get(void)
{if(capture_status.succeed_flag == 1)//产生完整按键之后,执行下面代码,未产生完整按键,不执行下面代码{printf("按下时间为:%d \r\n",capture_status.timeout_cnt * 65536 + last_cnt);memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零}
}

ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"void ic_init(uint16_t psc,uint16_t arr);
void pressed_time_get(void);#endif

打开串口助手

按下KEY2

可计算按键按下的时间

相关文章:

STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路 我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:>N*(ARR1)CCRx的值 N是在这段时间内&…...

2024年12月30日Github流行趋势

项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:343,398今日star数:246项目维护者:vhf, eshellman, davorpa, MHM5000,…...

SAP PP bom历史导出 ALV 及XLSX 带ECN号

bom总数 104W PS超过XLSX上限 ,那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…...

使用WebRTC进行视频通信

一、WebRTC技术简介 什么是WebRTC? 是一种支持浏览器之间实时音频、视频和数据传输的开放源代码项目。它允许开发者在不需要任何第三方插件或软件的情况下实现点对点的实时通信。WebRTC已经成为现代Web应用中的关键技术,为开发者提供了强大的工具和API…...

npm ERR! ECONNRESET 解决方法

问题:npm 命令遇到的错误是 ECONNRESET,这通常与网络连接问题相关。设置代理解决问题。 一、查看当前代理设置 npm config get proxy npm config get https-proxy二、设置代理 npm config set proxy http://your-proxy-address:port npm config set h…...

【连续学习之SS-IL算法】2021年CPVR会议论文Ss-il:Separated softmax for incremental learning

1 介绍 年份:2021 期刊: 2021CPVR Ahn H, Kwak J, Lim S, et al. Ss-il: Separated softmax for incremental learning[C]//Proceedings of the IEEE/CVF International conference on computer vision. 2021: 844-853. 本文提出的SS-IL&#xff08…...

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…...

【MySQL 高级特性与性能优化】

MySQL 高级特性与性能优化 一、MySQL 存储引擎 (一)InnoDB 存储引擎 1. 特点 支持事务:InnoDB 是 MySQL 中提供完整 ACID 事务支持的存储引擎,这意味着它能够保证数据库操作在复杂的并发环境下的一致性、隔离性、原子性和持久…...

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…...

微信小程序开发示例

微信小程序开发涉及多个方面&#xff0c;包括页面布局、交互逻辑、数据处理等。以下是一个简单的微信小程序开发示例&#xff0c;包括页面布局、样式定义、交互逻辑等方面的内容。 一、页面布局&#xff08;WXML&#xff09; <!-- index.wxml --> <view class"…...

【机器学习】概述

文章目录 1. 机器学习三步骤2. 机器学习图谱2.1 任务类型 (Task)2.2 模型选择 (Methods)2.3 学习场景 (Scenario) 1. 机器学习三步骤 定义一个模型 (Define a set of function) 选择一组合适的函数来表示模型。 评估模型好坏 (Goodness of function) 找到一个损失函数&#xf…...

音视频采集推流时间戳记录方案

音视频同步更多文章 深入理解音视频pts&#xff0c;dts&#xff0c;time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…...

【Linux】:线程安全 + 死锁问题

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 线程安全和重入问题&…...

【深度学习】时间序列表示方法

自然界除了2D的图片数据之外&#xff0c;还有语音、文字&#xff0c;这些数据都有时间的先后顺序的。对于2D的图像的数据&#xff0c;可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示&#xff0c;而Pytorch没有自带String支持&#xff0c;在表示文字之前需要进行Em…...

1.微服务灰度发布落地实践(方案设计)

文章目录 前言灰度发布的优点设计概要系统架构图流量控制客户端服务端 路由路径应用客户端实现核心组件分析1.网关2. spring-cloud3. dubbo4. nocas5. thread6. message queue 前言 微服务架构中的灰度发布&#xff08;也称为金丝雀发布或渐进式发布&#xff09;是一种在不影响…...

【UE5 C++课程系列笔记】15——Assert的基本使用

目录 概念 一、Check 二、Verify 三、Ensure 对比 基本使用 一、check的基本使用 二、ensure的基本使用 三、verify的基本使用 概念 assert 可在开发期间帮助检测和诊断不正常或无效的运行时条件。这些条件通常检查是否指针为非空、除数为非零、函数并非递归运行&…...

kubernetes Gateway API-1-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…...

likeAdmin架构部署(踩坑后的部署流程

1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven&#xff1a;>3.8 ❤️.9 (最好不要3.9已经试过失败 node &#xff1a;node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK&#xff1a;JDK8 node 需要换源 npm c…...

【一款超好用的开源笔记Logseq本地Docker部署与远程使用指南】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

浅谈torch.utils.data.TensorDataset和torch.utils.data.DataLoader

1.torch.utils.data.TensorDataset 功能定位 torch.utils.data.TensorDataset 是一个将多个张量&#xff08;Tensor&#xff09;数据进行简单包装整合的数据集类&#xff0c;它主要的作用是将相关联的数据&#xff08;比如特征数据和对应的标签数据等&#xff09;组合在一起&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...