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

PY32F003F18之输入捕获

输入捕获是定时器的功能之一,配合外部引脚,捕获脉宽时间或采集周期。

CPU中的定时器最基本的功能就是计数功能,其次是输入捕获(IC),再次就是比较输出(OC),还有就是使用引脚对外部时钟进行计数,触发信号捕捉等。

1、输入捕获功能图:

2、测试程序

#include "TIM1_EdgeAligned_InputCapture.h"
#include "LED.h"/*
将PA3复用为TIM1_CH1,用作捕获信号输入引脚,
PA4为TIM3中断时输出的信号,将这两个脚短接,使用示波器跟踪PA0的信号,就可以测试。
*/void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc);
void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);void HAL_TIM_IC_MspInit1(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef   GPIO_InitStructure;if(htim->Instance == TIM1)//初始化TIM1{__HAL_RCC_TIM1_CLK_ENABLE();  //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟GPIO_InitStructure.Pin = GPIO_PIN_3;       //选择第3脚,PA3是为TIM1_CH1GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStructure.Pull = GPIO_PULLUP;     //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速GPIO_InitStructure.Alternate = GPIO_AF13_TIM1;//选择AF13,将PA3引脚复用为TIM1_CH1HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//将PA3初始化为TIM1_CH1功能,用作IC11输入捕获引脚HAL_NVIC_SetPriority(TIM1_CC_IRQn,1, 0); //设置"捕获/比较"的中断优先级为1HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);        //开启"捕获/比较"总中断}if(htim->Instance == TIM3)//初始化TIM3{}
}//函数功能:TIM1中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr:自动重装值。
//psc:时钟预分频数
//TIM1_COUNTERMODE_UP_IC1_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
//TIM1_COUNTERMODE_UP_IC1_Init(20000,80);//若使用HSI,当arr=20000,psc=80时,则为200ms,误差为10us;
void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc)
{GPIO_InitTypeDef   GPIO_InitStructure;TIM_HandleTypeDef  TIM1_HandleStructure;TIM_IC_InitTypeDef TIM1_IC_InitStructure;//HAL_TIM_IC_MspInit开始/__HAL_RCC_TIM1_CLK_ENABLE();  //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟GPIO_InitStructure.Pin = GPIO_PIN_3;       //选择第3脚,PA3是为TIM1_CH1GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStructure.Pull = GPIO_PULLUP;     //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速GPIO_InitStructure.Alternate = GPIO_AF13_TIM1;//选择AF13,将PA3引脚复用为TIM1_CH1HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//将PA3初始化为TIM1_CH1功能,用作IC11输入捕获引脚HAL_NVIC_SetPriority(TIM1_CC_IRQn,1, 0); //设置"捕获/比较"的中断优先级为1HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);        //开启"捕获/比较"总中断
//HAL_TIM_IC_MspInit结束/TIM1_HandleStructure.Instance = TIM1;   //选择TIM1TIM1_HandleStructure.Init.Period            = arr-1;//设置在下一个更新事件产生时,装入"自动重载入寄存器TIMx_ARR"的值//将(arr-1)写入"自动重载入寄存器TIMx_ARR",设置自动重装载值TIM1_HandleStructure.Init.Prescaler         = psc-1;//设置用来作为TIMx时钟频率除数的预分频值//将(psc-1)写入"预装载寄存器TIMx_PSC",的PSC[15:0],设置预分频值//计数器的时钟频率CK_CNT=fCK_PSC/(PSC[15:0]+1)TIM1_HandleStructure.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;//时钟不分频,则tDTS=tCK_INT//若使用HSE,计算公式:arr*psc/24000000/1,当arr=20000,psc=240时,则为200ms,误差为10us;//若使用HSI,计算公式:arr*psc/8000000/1,当arr=20000,psc=80时,则为200ms,误差为100us;TIM1_HandleStructure.Init.CounterMode       = TIM_COUNTERMODE_UP;//向上计数TIM1_HandleStructure.Init.RepetitionCounter = 1 - 1;//不重复计数//将(1-1)写入"重复计数寄存器TIMx_RCR"中的REP[7:0],设置"重复计数器值"TIM1_HandleStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//"自动重装载寄存器"没有缓冲//不允许将"TIMx自动重新加载寄存器TIMx_ARR"的值被装入缓冲区;HAL_TIM_Base_Init(&TIM1_HandleStructure);    //TIM1初始化//选择计数器模式:向上计数//设置时钟分频因子:时钟不分频,则tDTS=tCK_INT//设置自动重装载:"自动重装载寄存器"没有缓冲//设置自动重装载值:TIM_Base_InitStructure.Period//设置预分频值:TIM_Base_InitStructure.Prescaler//设置"重复计数器值":TIM_Base_InitStructure.RepetitionCounter//启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件TIM1_IC_InitStructure.ICPolarity  = TIM_ICPOLARITY_RISING;   //上升沿捕获TIM1_IC_InitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI;//CC1通道配置为输入TIM1_IC_InitStructure.ICPrescaler = TIM_ICPSC_DIV1;          //输入不分频TIM1_IC_InitStructure.ICFilter    = 0;                       //输入无滤波HAL_TIM_IC_ConfigChannel(&TIM1_HandleStructure, &TIM1_IC_InitStructure, TIM_CHANNEL_1);//配置通道1输入捕获HAL_TIM_IC_Start_IT(&TIM1_HandleStructure, TIM_CHANNEL_1);//使能输入捕获1中断,使能输入捕获1通道
}//函数功能:TIM3中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr:自动重装值。
//psc:时钟预分频数
//TIM3_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
//TIM3_COUNTERMODE_UP_Init(20000,80);//若使用HSI,当arr=20000,psc=80时,则为200ms,误差为10us;
void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc)
{TIM_HandleTypeDef  TIM3_HandleStructure;//HAL_TIM_Base_MspInit开始/__HAL_RCC_TIM3_CLK_ENABLE();           //使能TIM3时钟HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); //设置中断优先级HAL_NVIC_EnableIRQ(TIM3_IRQn);         //使能TIM3中断
//HAL_TIM_Base_MspInit开始/TIM3_HandleStructure.Instance = TIM3;   //选择TIM3TIM3_HandleStructure.Init.Period            = arr-1;//设置在下一个更新事件产生时,装入"自动重载入寄存器TIMx_ARR"的值//将(arr-1)写入"自动重载入寄存器TIMx_ARR",设置自动重装载值TIM3_HandleStructure.Init.Prescaler         = psc-1;//设置用来作为TIMx时钟频率除数的预分频值//将(psc-1)写入"预装载寄存器TIMx_PSC",的PSC[15:0],设置预分频值//计数器的时钟频率CK_CNT=fCK_PSC/(PSC[15:0]+1)TIM3_HandleStructure.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;//时钟不分频,则tDTS=tCK_INT//若使用HSE,计算公式:arr*psc/24000000/1,当arr=20000,psc=240时,则为200ms,误差为10us;//若使用HSI,计算公式:arr*psc/8000000/1,当arr=20000,psc=80时,则为200ms,误差为100us;TIM3_HandleStructure.Init.CounterMode       = TIM_COUNTERMODE_UP;//向上计数TIM3_HandleStructure.Init.RepetitionCounter = 1 - 1;//不重复计数//将(1-1)写入"重复计数寄存器TIMx_RCR"中的REP[7:0],设置"重复计数器值"TIM3_HandleStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//"自动重装载寄存器"没有缓冲//不允许将"TIMx自动重新加载寄存器TIMx_ARR"的值被装入缓冲区;HAL_TIM_Base_Init(&TIM3_HandleStructure);    //TIM3初始化//选择计数器模式:向上计数//设置时钟分频因子:时钟不分频,则tDTS=tCK_INT//设置自动重装载:"自动重装载寄存器"没有缓冲//设置自动重装载值:TIM_Base_InitStructure.Period//设置预分频值:TIM_Base_InitStructure.Prescaler//设置"重复计数器值":TIM_Base_InitStructure.RepetitionCounter//启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件HAL_TIM_Base_Start_IT(&TIM3_HandleStructure);//允许计数器产生"更新中断";//如果计数器不是工作在触发模式中,则开始计数
}//函数功能:TIM1输入捕获中断服务程序
//IC1为上升沿捕获,所以捕获周期是TIM3周期的2倍
void TIM1_CC_IRQHandler(void)
{
HAL_TIM_PeriodElapsedCallback开始/if (_HAL_TIM_GET_FLAG(TIM1,TIM_FLAG_CC1) != RESET){//根据TIM_FLAG_CC1,读"TIMx状态寄存器(TIMx_SR)"中输入捕获中断标志位_HAL_TIM_CLEAR_IT(TIM1, TIM_IT_CC1);//TIM_IT_CC1,令CC1IF=0,清除输入捕获中断标志位TIM1_LED_Toggle();}
HAL_TIM_PeriodElapsedCallback结束/
}//函数功能:TIM3中断服务程序
void TIM3_IRQHandler(void)
{
HAL_TIM_PeriodElapsedCallback开始/if (_HAL_TIM_GET_FLAG(TIM3,TIM_FLAG_UPDATE) != RESET){//根据TIM_FLAG_UPDATE,读"TIMx状态寄存器(TIMx_SR)"中更新中断标志位_HAL_TIM_CLEAR_IT(TIM3, TIM_IT_UPDATE);//TIM_IT_UPDATE,令UIF=0,清除定时器更新中断标志位TIM3_LED_Toggle();}
HAL_TIM_PeriodElapsedCallback结束/
}

#ifndef __TIM1_EdgeAligned_InputCapture_H
#define __TIM1_EdgeAligned_InputCapture_H#include "py32f0xx_hal.h"#define _HAL_TIM_GET_FLAG(__INSTANCE__, __FLAG__)          (((__INSTANCE__)->SR &(__FLAG__)) == (__FLAG__))
//根据__FLAG__,读"TIMx状态寄存器(TIMx_SR)"中相应的中断标志位
//TIM_FLAG_UPDATE,若UIF=1,建立"更新事件"
//TIM_FLAG_CC1,若CC1IF=1,如果通道CC1配置为输出模式,则建立"CC1输出事件";
//TIM_FLAG_CC1,若CC1IF=1,如果通道CC1配置为输入模式,则建立"CC1捕获事件"
//TIM_FLAG_CC2,若CC2IF=1,如果通道CC2配置为输出模式,则建立"CC2输出事件";
//TIM_FLAG_CC2,若CC2IF=1,如果通道CC2配置为输入模式,则建立"CC2捕获事件"
//TIM_FLAG_CC3,若CC3IF=1,如果通道CC3配置为输出模式,则建立"CC3输出事件";
//TIM_FLAG_CC3,若CC3IF=1,如果通道CC3配置为输入模式,则建立"CC3捕获事件"
//TIM_FLAG_CC4,若CC4IF=1,如果通道CC4配置为输出模式,则建立"CC4输出事件";
//TIM_FLAG_CC4,若CC4IF=1,如果通道CC4配置为输入模式,则建立"CC4捕获事件";
//TIM_FLAG_COM,若COMIF=1,则建立"COM事件"
//TIM_FLAG_TRIGGER,若TIF=1,则建立"触发事件"
//TIM_FLAG_BREAK,若BIF=1,则建立"刹车事件"
//TIM_FLAG_CC1OF,若CC1OF=1,则表示"计数器x的值被捕获到TIMx_CCR1寄存器"
//TIM_FLAG_CC2OF,若CC2OF=1,则表示"计数器x的值被捕获到TIMx_CCR2寄存器"
//TIM_FLAG_CC3OF,若CC3OF=1,则表示"计数器x的值被捕获到TIMx_CCR3寄存器"
//TIM_FLAG_CC4OF,若CC4OF=1,则表示"计数器x的值被捕获到TIMx_CCR4寄存器"#define _HAL_TIM_CLEAR_IT(__INSTANCE__, __INTERRUPT__)      ((__INSTANCE__)->SR = ~(__INTERRUPT__))
//根据__INTERRUPT__,将"TIMx状态寄存器(TIMx_SR)"中相应的中断标志位置0
//TIM_IT_UPDATE,令UIF=0,清除定时器更新中断标志位
//TIM_IT_CC1,令CC1IF=0,清除捕获/比较1中断标志位
//TIM_IT_CC2,令CC2IF=0,清除捕获/比较2中断标志位
//TIM_IT_CC3,令CC3IF=0,清除捕获/比较3中断标志位
//TIM_IT_CC4,令CC4IF=0,清除捕获/比较4中断标志位
//TIM_IT_COM,令COMIF=0,清除COM事件中断标志位
//TIM_IT_TRIGGER,令TIF=0,清除触发中断标志位
//TIM_IT_BREAK,令BIF=0,清除刹车中断标志位extern void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc);
extern void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);
#endif /* __TIM1_EdgeAligned_InputCapture_H */
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "TIM1_EdgeAligned_InputCapture.h"int main(void)
{HSE_Config();
//	HAL_Init();//systick初始化delay_init();HAL_Delay(1000);TIM1_LED_Init();TIM3_LED_Init();TIM1_COUNTERMODE_UP_IC1_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;TIM3_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;while (1){delay_ms(100);
//		TIM1_LED_Toggle();
//		TIM3_LED_Toggle();}
}
#include "LED.h"void TIM1_LED_Init(void);
void TIM3_LED_Init(void);//函数功能:TIM1_LED灯引脚初始化,并配置为关灯
void TIM1_LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟//初始化PA0GPIO_InitStructure.Pin = GPIO_PIN_0;                  //选择第0脚GPIO_InitStructure.Pull = GPIO_PULLUP;                //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;        //设置引脚工作模式为推挽输出方式HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructure结构变量指定的参数初始化GPIOA的外设寄存器TIM1_LED_Off();
}//函数功能:TIM3_LED灯引脚初始化,并配置为关灯
void TIM3_LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟//初始化PB5GPIO_InitStructure.Pin = GPIO_PIN_4;                  //选择第4脚GPIO_InitStructure.Pull = GPIO_PULLUP;                //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;        //设置引脚工作模式为推挽输出方式HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructure结构变量指定的参数初始化GPIOA的外设寄存器TIM3_LED_Off();
}

将PA3复用为TIM1_CH1,用作捕获信号输入引脚,PA4为TIM3中断时输出的信号,将这两个脚短接,使用示波器跟踪PA0的信号,就可以测试。

相关文章:

PY32F003F18之输入捕获

输入捕获是定时器的功能之一,配合外部引脚,捕获脉宽时间或采集周期。 CPU中的定时器最基本的功能就是计数功能,其次是输入捕获(IC),再次就是比较输出(OC),还有就是使用引脚对外部时钟进行计数,触发信号捕捉…...

科目三基础四项(一)

​ 第一天,基础操作,仪表,方向,挡位 按照模块来 1、方向盘两手在两侧 ​ 编辑 转向时的角度,只用:向左540,向右180 向左打和向右打的角度要抵消,回正 掉头向左打满再回 注意…...

C语言入门Day_24 函数与指针

目录 前言: 1.指针和数组 2.函数和指针 3.易错点 4.思维导图 前言: 我们知道数组是用来存储多个数据的,以及我们可以用指针来指向一个变量。那么我们可以用指针来指向一个数组中的数据么? 指针除了可以像指向一个变量一样指…...

9月21日,每日信息差

今天是2023年9月21日,以下是为您准备的14条信息差 第一、谷歌高管已经广泛讨论了在2027年之前将博通作为人工智能芯片供应商的可能性 第二、清华系团队宣布研发出千亿参数“制药版ChatGPT”,覆盖药物立项、临床前研究、临床试验的各阶段,作…...

【FAQ】安防监控系统/视频云存储/监控平台EasyCVR服务器解释器出现变更该如何修改?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

Python手写人脸识别

Python手写人脸识别 引言 人脸识别是一种通过计算机视觉和模式识别技术来识别和验证人脸的技术。Python是一种广泛使用的编程语言,它提供了许多强大的库和工具来实现人脸识别。 在Python中,可以使用多种方法来实现人脸识别,包括基于特征提取的方法、基于深度学习的方法等…...

我的Qt作品(19)使用Qt写一个轻量级的视觉框架---第2章,仿海康VM实现思维导图拖拽方式的算法流程图

上次写的第1章介绍了主界面的设计。 https://blog.csdn.net/libaineu2004/article/details/130277151 本次是第2章,主要介绍流程图的运行。 目前市面上视觉框架很多,主要有列表图方式和流程图方式。海康VM的流程图方式比较受用户的喜爱和欢迎&#xf…...

仿写Timi记账

项目仿照Timi记账,本 APP 仅用作学习,如有侵权联系删除,项目地址:Timi记账 TIMI记账项目 简单功能对于tableview向上延伸部分采用了insertSubview形式:添加特殊字体添加.ttf文件获取plist文件数据 计算器功能说明简单逻…...

Java语言实现 比较两个Date日期的先后

在 Java 中,可以使用 Date 类的 compareTo() 方法或 before()、after() 方法来比较两个 Date 类型的日期的先后顺序。 使用 compareTo() 方法: Date date1 ...; // 第一个日期 Date date2 ...; // 第二个日期int result date1.compareTo(date2); if (…...

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…...

3288S Android11 适配红外遥控功能(超详细)

目录 一、rk3288平台红外遥控介绍二、原理图分析三、配置设备树并使能红外遥控功能四、打开红外打印功能&#xff0c;查看红外遥控的用户码和键值五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件七、补充&am…...

Linux高性能服务器编程 学习笔记 第三章 TCP协议详解

与IP协议相比&#xff0c;TCP协议更靠近应用层&#xff0c;因此在应用程序中有更强的可操作性。一些重要的socket选项都和TCP协议相关。 本章从以下方面讨论TCP协议&#xff1a; 1.TCP头部信息。TCP头部信息出现在每个TCP报文段中&#xff0c;用于指定通信的源端端口号、目的端…...

【云原生】Kubernetes学习笔记

部署 在部署前强调几点 不要使用IPv6, 很多组件都不支持IPv6不要使用最新版本, 最新版本非常不稳定, 甚至可能存在无法运行的bug不要版本更新, 安装后就将版本固定下来, 新的版本可能会引入新功能, 或移除旧功能, 导致Kubernetes无法运行 Kubeadm介绍 K8s是由多个模块构成的…...

[Machine Learning][Part 2]监督学习的实现

目录 线性模型实现&#xff1a; cost function &#xff1a;代价函数或者损失函数——衡量模型优劣的一个指标 理论&#xff1a; 代码实现: 梯度下降——自动寻找最小的cost function 代价函数 梯度的概念&#xff1a; 梯度下降公式&#xff1a; 实现一个简单的监督学习…...

【计算机毕业设计】基于SpringBoot+Vue大学生心理健康管理系统的开发与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…...

下载水果FLStudio21.2软件安装更新教程

编曲是一种对音乐创作过程中涉及的元素和步骤进行组织和安排的艺术形式。对于想要学习编曲的人来说&#xff0c;以下是一些有用的建议&#xff1a; 1. 学习基础知识 在开始学习编曲之前&#xff0c;你需要掌握一些基础知识&#xff0c;例如音乐理论、乐器演奏和数字音乐制作技…...

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…...

linux部署页面内容

/bin&#xff1a;该目录包含了常用的二进制可执行文件&#xff0c;如ls、cp、mv、rm等等。 /boot&#xff1a;该目录包含了启动Linux系统所需的文件&#xff0c;如内核文件和引导加载程序。 /dev&#xff1a;该目录包含了所有设备文件&#xff0c;如硬盘、光驱、鼠标、键盘等等…...

若依框架集成WebSocket带用户信息认证

一、WebSocket 基础知识 我们平时前后台请求用的最多的就是 HTTP/1.1协议&#xff0c;它有一个缺陷&#xff0c; 通信只能由客户端发起&#xff0c;如果想要不断获取服务器信息就要不断轮询发出请求&#xff0c;那么如果我们需要服务器状态变化的时候能够主动通知客户端就需要用…...

0基础学习VR全景平台篇 第101篇:企业版功能-子账号分配管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;企业版教程-子账号分配管理功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 子账号分配管理功能&#xff0c;主要用于企业版用户为自己服务的终…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

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

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

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...