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

news2025/1/7 12:19:52

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;//定时器2
    ic_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;//引脚1
        gpio_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};//全部初始化为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;//定时器2
    ic_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;//引脚1
        gpio_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);//重置捕获通道2
                TIM_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);//重置捕获通道2
                TIM_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;//定时器2
    ic_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;//引脚1
        gpio_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);//重置捕获通道2
                TIM_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);//重置捕获通道2
                TIM_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

可计算按键按下的时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…

软件逆向之标志位

进位标志CF&#xff08;Carry Flag&#xff09; 介绍&#xff1a;如果运算结果的最高位产生了一个进位&#xff08;加法&#xff09;或借位&#xff08;减法&#xff09;&#xff0c;那么&#xff0c;其值为1&#xff0c;否则其值为0。无符号数。 示例&#xff1a; mov al&…

api接口技术开发系列如何调用电商平台的按图搜索商品API?

不同电商平台的按图搜索商品 API 调用方法大致相似&#xff0c;以下是一般的调用步骤&#xff1a; 注册与获取权限 注册账号&#xff1a;在相应的电商开放平台注册成为开发者&#xff0c;如淘宝平台、1688 平台等。创建应用&#xff1a;登录后创建应用&#xff0c;填写应用的相…

【Seed-Labs 2.0】Buffer Overflow Attack Lab (Server Version)

说在前面 实验总述 缓冲区溢出是指程序试图写入超出缓冲区边界的数据。恶意用户可利用这一漏洞改变程序的流控制&#xff0c;从而导致恶意代码的执行。本实验的目的是让学生从实践中了解这种类型的漏洞&#xff0c;并学习如何在攻击中利用这种漏洞。 在本实验中&#xff0c;…

WPS表格技巧01-项目管理中的基本功能-计划和每日记录的对应

前言&#xff1a; 在项目管理中&#xff0c;一般就是用些项目管理工具来管理这个任务和 task&#xff0c;但是就是要学这些工具很麻烦&#xff0c;比较好的方法&#xff0c;通用的方法就是用 Excel 表格去做&#xff08;这非常适合松散的团队组织&#xff09;&#xff0c;然后…

SpringBoot入门之创建一个Hello World项目

文章目录 一、使用传统的方式1、创建一个SpringBoot项目2、配置pom.xml文件3、下载Maven依赖4、创建一个Controller类&#xff1a;com.devops.controller.HelloController5、创建一个引导类&#xff1a;com.devops.HelloApplication6、启动项目8、访问80809、完整项目结构 二、…

机器学习笔记 - 单幅图像深度估计的最新技术

1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…

探索AI在地质科研绘图中的应用:ChatGPT与Midjourney绘图流程与效果对比

文章目录 个人感受一、AI绘图流程1.1 Midjourney&#xff08;1&#xff09;环境配置&#xff08;2&#xff09;生成prompt&#xff08;3&#xff09;完善prompt&#xff08;4&#xff09;开始绘图&#xff08;5&#xff09;后处理 1.2 ChatGPT不合理的出图结果解决方案 二、主题…

HTML——28.音频的引入

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频当属性名和属性值一样&#xff0c;可以只写属性名src属性:指定音频文件路径&#xff0c;必…

SMTP发送邮件的过程

&#xff08;1&#xff09;SMTP客户端首先请求与服务器端的25号端口建立TCP连接(1分)。&#xff08;2&#xff09;连接建立成功后&#xff0c;客户端和服务器通过握手阶段验证双方身份(1分)。&#xff08;3&#xff09;验证成功后&#xff0c;客户端首先向服务器端通告邮件发送…

计算机毕设-基于springboot的酒店管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)

此文为系列文章&#xff0c;此系列主要讲解RTSP客户端的拉流及播放&#xff0c;文章持续更新&#xff0c;会从rtsp的基本协议讲起&#xff0c;如何一步步实现音视频的拉流过程&#xff0c;包括一系列涉及到的协议&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

量子力学复习

黑体辐射 热辐射 绝对黑体&#xff1a; &#xff08;辐射能力很强&#xff0c;完全的吸收体&#xff0c;理想的发射体&#xff09; 辐射实验规律&#xff1a; 温度越高&#xff0c;能量越大&#xff0c;亮度越亮 温度越高&#xff0c;波长越短 光电效应 实验装置&#xf…

如何排查 Apache Doris 中 “Failed to commit txn“ 导入失败问题?

今天来聊聊 Doris 数据导入那些事儿。你是不是在数据导入的时候遇到各种状况&#xff0c;让人头疼不已&#xff1f;别担心&#xff0c;这篇文章给你答案&#xff01; 在 Doris 的版本里&#xff0c;< 2.0.3 的时候&#xff0c;数据迁移存在一些已知的问题&#xff0c;比如可…

基于AT89C51单片机的可暂停八路抢答器设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下&#xff1a; 摘要 随着社会进步和科技发展&#xff0c;电子设备在各类活动中的应用日益普遍&#xff0c…

OSCP - Proving Grounds - Pelican

主要知识点 当信息多的时候&#xff0c;耐心搜索Zookeeper exhibitor RCE漏洞 具体步骤 依旧执行Nmap Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-13 22:44 UTC Nmap scan report for 192.168.54.98 Host is up (0.00090s latency). Not shown: 65526 closed …

计算机毕业设计PyHive+Hadoop深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

WebRtc01:课程导学、框架介绍

应用 难点 课程大纲 学习收获 涉及内容 概述 用途 学习收获

特殊车辆检测数据集VOC+YOLO格式2730张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2730 标注数量(xml文件个数)&#xff1a;2730 标注数量(txt文件个数)&#xff1a;2730 …

【AI日记】25.01.04 kaggle 比赛 3-3 | 王慧玲与基层女性

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Forecasting Sticker Sales时间&#xff1a;6 小时 读书 书名&#xff1a;基层女性时间&#xff1a;3 小时原因&#xff1a;虽然我之前就知道这个作者&#xff0c;因为我…