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

【正点原子STM32连载】第二十四章 高级定时器PWM输入模式实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第二十四章 高级定时器PWM输入模式实验

本章将介绍使用APM32F407的高级定时器检测输入PWM的占空比和周期。通过本章的学习,读者将学习到高级定时器PWM输入模式的使用。
本章分为如下几个小节:
24.1 硬件设计
24.2 程序设计
24.3 下载验证

24.1 硬件设计

24.1.1 例程功能

  1. 利用定时器8的通道1(PC6)捕获定时器14通道1(PA7)输出的占空比为50%,频率为100Hz的PWM,结果通过串口输出
  2. LED0闪烁,指示程序正在运行
    24.1.2 硬件资源
  3. LED
    LED1 - PF9
  4. 定时器14
    通道1 - PA7
  5. 定时器8
    通道1 - PC6
  6. USART1(PA9、PA10连接至板载USB转串口芯片上)
    24.1.3 原理图
    本章实验使用的定时器8为APM32F407的片上资源,因此没有对应的连接原理图。
    24.2 程序设计
    24.2.1 Geehy标准库的TMR驱动
    本章实验将使用TMR8的通道1(PC6引脚)在PWM输入模式下捕获TMR14从通道1(PA7)引脚输出的PWM(有关通用定时器输出PWM的相关内容,请见第十八章“通用定时器PWM输出实验”),将分别捕获输入PWM信号的上升沿和下降沿,以此来计算输入PWM信号的占空比和周期,要是实现以上功能都依赖于高级定时器的PWM输入模式,其具体的配置步骤如下:
    ①:配置TMR8的自动重装载值和预分频器数值等参数
    ②:配置TMR8通道1的PWM输入模式
    ③:配置TMR8的触发输入信号
    ④:配置TMR8的从模式功能为复位模式
    ⑤:使能TMR8的捕获比较通道1和2中断
    ⑥:使能TMR8中断,并配置其相关的中断优先级
    ⑦:使能TMR8
    ⑧:读取TMR8通道1和通道2的捕获比较寄存器
    在Geehy标准库中对应的驱动函数如下:
    ①:配置TMR
    请见第16.2.1小节中配置TMR的相关内容。
    ②:配置PWM输入模式
    该函数用于配置PWM输入模式,其函数原型如下所示:
    void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig);
    该函数的形参描述,如下表所示:
    形参 描述
    tmr 指向TMR外设结构体的指针
    例如:TMR1、TMR2等(在apm32f4xx.h文件中有定义)
    PWMConfig 指向PWM输入模式配置结构体的指针
    需自行定义,并根据PWM输入模式配置参数填充结构体中的成员变量
    表24.2.1.1 函数TMR_ConfigPWM()形参描述
    该函数的返回值描述,如下表所示:
    返回值 描述
    无 无
    表24.2.1.2 函数TMR_ConfigPWM()返回值描述
    该函数使用TMR_ICConfig_T类型的结构体变量传入PWM输入模式的配置参数,该结构体的定义请见第19.2.1小节中TMR_ICConfig_T的相关内容。
    该函数的使用示例,如下所示:
#include "apm32f4xx.h"
#include "apm32f4xx_tmr.h"void example_fun(void)
{TMR_ICConfig_T tmr_ic_init_struct;/* 配置TMR8通道1的PWM输入模式 */tmr_ic_init_struct.channel		= TMR_CHANNEL_1;tmr_ic_init_struct.polarity		= TMR_IC_POLARITY_RISING;tmr_ic_init_struct.selection	= TMR_IC_SELECTION_DIRECT_TI;tmr_ic_init_struct.prescaler	= TMR_IC_PSC_1;tmr_ic_init_struct.filter		= 0;TMR_ConfigPWM(TMR8, &tmr_ic_init_struct);
}

③:配置触发输入信号
该函数用于配置定时器的触发输入信号,其函数原型如下所示:
void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource);
该函数的形参描述,如下表所示:
形参 描述
tmr 指向TMR外设结构体的指针
例如:TMR1、TMR2等(在apm32f4xx.h文件中有定义)
triggerSource 定时器的触发输入信号源
例如:TMR_TRIGGER_SOURCE_ITR0、TMR_TRIGGER_SOURCE_TI1FP1等(在apm32f4xx_tmr.h文件中有定义)
表24.2.1.3 函数TMR_SelectInputTrigger()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表24.2.1.4 函数TMR_SelectInputTrigger()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_tmr.h"void example_fun(void)
{/* 配置TMR8的触发输入信号源为TI1FP1 */TMR_SelectInputTrigger(TMR8, TMR_TRIGGER_SOURCE_TI1FP1);
}

④:配置从模式功能
该函数用于配置定时器的从模式功能,其函数原型如下所示:
void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode);
该函数的形参描述,如下表所示:
形参 描述
tmr 指向TMR外设结构体的指针
例如:TMR1、TMR2等(在apm32f4xx.h文件中有定义)
slaveMode 定时器的从模式功能
例如:TMR_SLAVE_MODE_RESET、TMR_SLAVE_MODE_GATED等(在apm32f4xx_tmr.h文件中有定义)
表24.2.1.5 函数TMR_SelectSlaveMode()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表24.2.1.6 函数TMR_SelectSlaveMode()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_tmr.h"void example_fun(void)
{/* 配置TMR8的从模式功能为复位模式 */TMR_SelectSlaveMode(TMR8, TMR_SLAVE_MODE_RESET);
}

⑤:使能TMR指定中断
请见第16.2.1小节中使能TMR指定中断的相关内容。
⑥:配置TMR中断
请见第12.2.3小节中配置中断的相关内容。
⑦:使能TMR
请见第16.2.1小节中使能TMR的相关内容。
⑧:读取TMR通道的捕获比较寄存器
该函数用于读取TMR通道的捕获比较寄存器,其函数原型如下所示:

uint32_t TMR_ReadCaputer1(TMR_T* tmr);
uint32_t TMR_ReadCaputer2(TMR_T* tmr);
uint32_t TMR_ReadCaputer3(TMR_T* tmr);
uint32_t TMR_ReadCaputer4(TMR_T* tmr);

该函数的形参描述,如下表所示:
形参 描述
tmr 指向TMR外设结构体的指针
例如:TMR1、TMR2等(在apm32f4xx.h文件中有定义)
表24.2.1.7 函数TMR_ReadCaptuern()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
uint32_t类型数据 TMR通道的捕获比较寄存器值
表24.2.1.8 函数TMR_ReadCaptuern()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_tmr.h"void example_fun(void)
{uint32_t tmr8_cap_1;tmr8_cap_1 = TMR_ReadCaputer1(TMR8);/* Do something. */
}

24.2.2 高级定时器驱动
本章实验的高级定时器驱动主要负责向应用层提供高级定时器的初始化函数,并实现高级定时器的中断服务函数。本章实验中,高级定时器的驱动代码包括atmr.c和atmr.h两个文件。
高级定时器驱动中,对TMR、GPIO相关的宏定义,如下所示:

#define ATMR_TMRX_PWMIN					TMR8
#define ATMR_TMRX_PWMIN_CC_IRQn			TMR8_CC_IRQn
#define ATMR_TMRX_PWMIN_CC_IRQHandler	TMR8_CC_IRQHandler
#define ATMR_TMRX_PWMIN_CHY				TMR_CHANNEL_1
#define ATMR_TMRX_PWMIN_CLK_ENABLE()						\do {														\RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR8);	\} while (0)#define ATMR_TMRX_PWMIN_CHY_GPIO_PORT			GPIOC
#define ATMR_TMRX_PWMIN_CHY_GPIO_PIN			GPIO_PIN_6
#define ATMR_TMRX_PWMIN_CHY_GPIO_PIN_SOURCE	GPIO_PIN_SOURCE_6
#define ATMR_TMRX_PWMIN_CHY_GPIO_AF			GPIO_AF_TMR8
#define ATMR_TMRX_PWMIN_CHY_GPIO_CLK_ENABLE()				\do {														\RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC);	\} while (0)
高级定时器驱动中TMR8的初始化函数,如下所示:
/*** @brief	初始化高级定时器PWM输入模式* @note	当APB1PSC!=1时,定时器的时钟频率为APB2时钟的2倍* 			因此定时器的时钟频率为168MHz* 			定时器溢出时间计算方法:Tout = ((arr + 1) * (psc + 1)) / TMRxCLK* 			TMRxCLK=定时器时钟频率,单位MHz* @param	psc: 预分频器数值* @retval	无*/
void atmr_tmrx_pwmin_chy_init(uint16_t psc)
{GPIO_Config_T gpio_init_struct;TMR_BaseConfig_T tmr_init_struct;TMR_ICConfig_T tmr_ic_init_struct;/* 使能时钟 */ATMR_TMRX_PWMIN_CLK_ENABLE();			/* 使能高级定时器时钟 */ATMR_TMRX_PWMIN_CHY_GPIO_CLK_ENABLE();	/* 使能PWM输入引脚端口时钟 *//* 配置PWM输入引脚 */gpio_init_struct.pin	= ATMR_TMRX_PWMIN_CHY_GPIO_PIN;	/* PWM输入引脚 */gpio_init_struct.mode	= GPIO_MODE_AF;					/* 复用功能模式 */gpio_init_struct.speed	= GPIO_SPEED_100MHz;			/* 高速 */gpio_init_struct.otype	= GPIO_OTYPE_PP;				/* 推挽输出 */gpio_init_struct.pupd	= GPIO_PUPD_DOWN;				/* 下拉 */GPIO_Config(ATMR_TMRX_PWMIN_CHY_GPIO_PORT, &gpio_init_struct);GPIO_ConfigPinAF(ATMR_TMRX_PWMIN_CHY_GPIO_PORT,			/* 配置引脚复用功能 */ATMR_TMRX_PWMIN_CHY_GPIO_PIN_SOURCE,ATMR_TMRX_PWMIN_CHY_GPIO_AF);/* 配置高级定时器 */tmr_init_struct.countMode			= TMR_COUNTER_MODE_UP;	/* 向上计数 */tmr_init_struct.clockDivision		= TMR_CLOCK_DIV_1;		/* 时钟分频系数 */tmr_init_struct.period				= 0xFFFF;				/* 自动重装载值 */tmr_init_struct.division			= psc;					/* 预分频器数值 */tmr_init_struct.repetitionCounter	= 0;					/* 重复计数数值 */TMR_ConfigTimeBase(ATMR_TMRX_PWMIN, &tmr_init_struct);		/* 配置高级定时器 *//* 配置PWM输入模式 */tmr_ic_init_struct.channel		= ATMR_TMRX_PWMIN_CHY;tmr_ic_init_struct.polarity		= TMR_IC_POLARITY_RISING;tmr_ic_init_struct.selection	= TMR_IC_SELECTION_DIRECT_TI;tmr_ic_init_struct.prescaler	= TMR_IC_PSC_1;tmr_ic_init_struct.filter		= 0;TMR_ConfigPWM(ATMR_TMRX_PWMIN, &tmr_ic_init_struct);/* 配置从模式 */TMR_SelectInputTrigger(ATMR_TMRX_PWMIN, TMR_TRIGGER_SOURCE_TI1FP1);TMR_SelectSlaveMode(ATMR_TMRX_PWMIN, TMR_SLAVE_MODE_RESET);/* 使能高级定时器及其相关中断 */NVIC_EnableIRQRequest(ATMR_TMRX_PWMIN_CC_IRQn, 1, 0);	/* 使能输入捕获中断 */TMR_EnableInterrupt(ATMR_TMRX_PWMIN, TMR_INT_CC1);		/* 使能CC1中断 */TMR_EnableInterrupt(ATMR_TMRX_PWMIN, TMR_INT_CC2);		/* 使能CC2中断 */TMR_Enable(ATMR_TMRX_PWMIN);							/* 使能高级定时器 */
}

从上面的代码中可以看出,在配置PWM输入模式时,配置了IC1捕获上升沿,IC2捕获下降沿,并同时开启了捕获比较1和2的中断,这么一来就可以在中断回调函数中获取通道1和通道2的捕获比较寄存器值来计算输入PWM信号的周期和占空比了。
高级定时器驱动中,TMR8的中断回调函数,如下所示:

/*** @brief	高级定时器中断服务函数* @param	无* @retval	无*/
void ATMR_TMRX_PWMIN_CC_IRQHandler(void)
{/* 判断CC1中断标志 */if (TMR_ReadIntFlag(ATMR_TMRX_PWMIN, TMR_INT_CC1) == SET){/* 捕获到上升沿 *//* 获取TMRx_CC1,用于计算输入PWM的周期 */g_tmrxchy_pwmin_cval = TMR_ReadCaputer1(ATMR_TMRX_PWMIN) + 1;/* 标记捕获完成 */g_tmrxchy_pwmin_sta = 1;/* 清除CC1中断标志 */TMR_ClearIntFlag(ATMR_TMRX_PWMIN, TMR_INT_CC1);}/* 判断CC2中断标志 */if (TMR_ReadIntFlag(ATMR_TMRX_PWMIN, TMR_INT_CC2) == SET){/* 捕获到下降沿 *//* 获取TMRx_CC2,用于计算输入PWM的占空比 */g_tmrxchy_pwmin_hval = TMR_ReadCaputer2(ATMR_TMRX_PWMIN) + 1;/* 清除CC2中断标志 */TMR_ClearIntFlag(ATMR_TMRX_PWMIN, TMR_INT_CC2);}
}

从上面的代码中可以看出,在捕获比较通道1中断中获取通道1的捕获比较寄存器值就是TMR8在输入PWM信号的两个上升沿之间的计数值,通过该值可以计算出输入PWM信号的周期;在捕获比较通道2中断中获取通道2的捕获比较寄存器值就是TMR8在输入PWM信号的上升沿和下降沿之间的计数值,通过该值可以计算出输入PWM信号的高电平占空比。
24.2.3 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{uint8_t t = 0;NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */delay_init(168);										/* 初始化延时功能 */usart_init(115200);									/* 初始化串口 */led_init();											/* 初始化LED *//* 初始化通用定时器PWM输出,频率为100Hz */gtmr_tmrx_pwm_chy_init(100 - 1, 8400 - 1);/* 初始化高级定时器PWM输入模式,计数频率为1MHz */atmr_tmrx_pwmin_chy_init(168 - 1);while (1){if (g_tmrxchy_pwmin_sta == 1)		/* 判断成功捕获标志 */{g_tmrxchy_pwmin_sta = 0;		/* 清除捕获成功标志 */printf("高电平时间:%d us\r\n", g_tmrxchy_pwmin_hval);printf("PWM周期:%d us\r\n", g_tmrxchy_pwmin_cval);printf("PWM频率:%d Hz\r\n", 1000000 / g_tmrxchy_pwmin_cval);printf("\r\n");}t++;if (t >= 20){t = 0;LED0_TOGGLE();}delay_ms(10);}
}

从上面的代码中可以看出,会配置通用定时器输出一个频率为100Hz、占空比为50%的PWM,该PWM信号用于作为本实验中高级定时器的PWM输入信号。随后会初始化高级定时器TMR8,TMR8的预分频计数器值配置为(168-1),并且TMR8的时钟频率为168MHz,因此TMR8的计数频率为1MHz,即1个计数值对应1微秒,方便后面的时间计算。
初始化完成后,就等待高级定时器中断函数中的捕获成功标志为真,捕获成功后,便将捕获到的PWM输入信号的周期和占空比输出值串口调试助手。
24.3 下载验证
在完成编译和烧录操作后,将TMR14通道1输出的PWM信号接入TMR8的PWM输入引脚,即将PA7引脚与PC6引脚进行短接,随后便可在串口调试助手上看到,捕获到PWM输入信号的高电平时间为5000微秒、PWM周期为10000微秒,即PWM的占空比为50%,并且也能看到PWM输入信号的频率为100Hz。

相关文章:

【正点原子STM32连载】第二十四章 高级定时器PWM输入模式实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第二…...

Adapter Tuning Overview:在CV,NLP,多模态领域的代表性工作

文章目录 Delta TuningAdapter Tuning in CVAdapter Tuning in NLP Delta Tuning Adapter Tuning in CV 题目: Learning multiple visual domains with residual adapters 机构:牛津VGG组 论文: https://arxiv.org/pdf/1705.08045.pdf Adapter Tuning in NLP …...

velocity一个基于Java的模板引擎

参考:https://blog.csdn.net/m0_51517236/article/details/126175283 http://www.51gjie.com/javaweb/896.html...

异步servlet

我们日常使用的 SpringMVC,基本上都不是异步 Servlet,而学习 WebFlux,异步 Servlet 是基础,WebFlux。 1.什么是异步 Servlet 先来说说什么是非异步 Servlet。 在 Servlet3.0 之前,Servlet 采用 Thread-Per-Request 的方…...

煤矿皮带运输智能监控算法 opencv

煤矿皮带运输智能监控算法通过opencvpython深度学习算法网络模型,煤矿皮带运输智能监控算法实时监测皮带运输过程中的各种异常情况,如跑偏、撕裂、堆料异常等,一旦检测到异常情况,立即发出告警并采取相应的措施,以保障…...

Docker搭建elasticsearch+kibana测试

最近需要做大数据画像,所以先简单搭建一个eskibana学习使用,记录一下搭建过程和遇到的问题以及解决办法 1.拉取es和kibana镜像 在拉取镜像之前先搜索一下 elasticsearch发现是存在elasticsearch镜像的,我一般习惯性拉取最新镜像&#xff0c…...

QT(C++)-QTreeview节点折叠与展开

文章目录 1、前言2、QTreeview全部展开与折叠3、QTreeview某个节点展开与折叠3.1 节点折叠与展开的信号与槽3.2 槽函数的实现3.3 某个节点展开与折叠 1、前言 最近要用QT开发项目,对QT不是很熟,就根据网上的查到的知识和自己的摸索,将一些经…...

项目 - 后端技术栈转型方案

前言 某开发项目的后端技术栈比较老了,现在想换到新的技术栈上。使用更好的模式、设计思想、更合理的架构等,为未来的需求迭代做铺垫。怎么办呢?假设系统目前在线上运行着的,直接整体换的话耗时太久,且中间还有新的需…...

Oracle权限语句

授予权限:grant 权限 to 用户名; 撤销权限:revoke 权限 from 用户名; 常用: 创建用户: create user zhangsan identified by zhangsan; grant connect, resource to zhangsan; //授权zhangsan用户连接权限 grant create …...

微信小程序发布一个npm包

参考:https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 同npm一样流程 npm install weixin_heath_apis...

Pytorch-lightning简介

Pytorch-lightning pytorch-lighting(简称pl),它其实就是一个轻量级的PyTorch库,用于高性能人工智能研究的轻量级PyTorch包装器。缩放你的模型,而不是样板。 框架核心内容 研究代码(位于LightningModule…...

【ES6】迭代器Iterator

JavaScript中的Iterator是一种特殊对象,它允许我们访问并操作对象的每一个元素。Iterator对象由具有next方法的对象创建,next方法返回一个包含两个属性的对象:value和done。value属性是当前元素的值,done属性是一个布尔值&#xf…...

火狐浏览器使用scss嵌套编写css无法识别问题

火狐浏览器使用scss嵌套编写css无法识别问题 版本: “node-sass”: “^4.14.1”, “sass-loader”: “^7.3.1”,vue版本: v2问题描述: 我的文件目录是这样的: 而在scss文件中我是这样书写的 .vue文件中 在火狐浏览器中 在谷…...

Kotlin的Lambda闭包语法

Lambda 表达式是一种在现代编程语言中常见的特性,它可以用来创建匿名函数或代码块,使得将函数作为参数传递、简化代码以及实现函数式编程范式变得更加便捷。Lambda 表达式在函数式编程语言中得到广泛应用,也在诸如 Java 8 和 Kotlin 等主流编…...

day-01 Docker

一、docker简介 Docker 是一种开源的容器化平台,它可以帮助开发人员将应用程序及其依赖项打包成一个独立的、可移植的容器,而无需担心环境差异和依赖问题。通过使用 Docker,您可以更轻松地创建、分发和运行应用程序,无论是在开发、…...

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

1.目标: a.数码管显示相同的值 0000 1111 ......9999; b.数码管显示不同的值 1234; 2.分析m74hc595芯片内部框图; 真值表: 3.代码; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…...

思路灰度传感器及红外传感器线序

四路红外传感器 黑线读取数据为0 白线读取数据为1 四路灰度传感器 黑线读取数据为1 白线读取数据为0...

squid服务器

目录 squid初识 安装squid代理 常用命令 主要配置文件 正向代理 环境配置 linux服务器设置 windows客户端设置 反向代理 环境配置 在web服务器配置服务 linux服务器配置 squid初识 含义:squid cache是一个流行的自由软件(GNU通用公共许可证…...

spring的后置处理器BeanPostProcessor

什么是BeanPostProcessor 是spring IOC容器给我们提供的一个扩展接口在调用初始化方法前后对bean进行额外加工,ApplicationContext会自动扫描实现了BeanPostProcessor的bean,并注册这些bean为后置处理器是bean的统一前置后置处理而不是基于某一个bean 执…...

vue、uniapp中动态添加绑定style、class 9种方法实现

9种方法介绍 直接使用静态class和style属性: 使用场景:当class和style属性是固定不变的时候,可以直接在模板中写死。优点:简单直接,没有额外的计算和逻辑。缺点:无法根据条件动态修改class和style。 使用v…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

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

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

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...