STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备)

news2024/11/29 10:50:17

一、USB简介

USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。

USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。目前用的最多的就是 USB1.1 和 USB2.0,USB3.0 目前已经开始普及。STM32F103 自带的 USB 符合 USB2.0 规范,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。

标准 USB 共四根线组成,除 VCC/GND 外,另外为 D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。

STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接;PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用 512 字节缓冲区(专用的 512 字节,和 CAN 共用),最多可用于 16 个单向或 8 个双向端点。USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。

1.1 USB HID简介

USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。

官方资料:http://www.usb.org/developers/hidpage
其中包含最主要的两个说明:

  • 《Device Class Definition for human interface device (HID)》【描述了 HID 的基本组成和格式】
  • 《Universal Serial Bus HID Usage Tables》【对上面文档的补充,将各种不同的 HID 设备的基本组成列举出来】

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”

2. 选择 MCU 和封装

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire

三、USB

3.1 参数配置

Connectivity 中选择 USB 设置,并勾选 Device(FS) 激活 USB 设备。

Parameter Settings 进行具体参数配置。

  • Speed: Full Speed 12MBit/s(固定为全速)
  • Low Power: 默认 Disabled(在任何不需要使用usb模块的时候,通过写控制寄存器总可以使usb模块置于低功耗模式(low power mode ,suspend模式)。在这种模式下,不产生任何静态电流消耗,同时usb时钟也会减慢或停止。通过对usb线上数据传输的检测,可以在低功耗模式下唤醒usb模块。也可以将一特定的中断输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止时钟系统。)

3.2 引脚配置

USB 的 DP 引脚必须上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到。

查看野火指南者开发板原理图可知,需要将 PD6 配置为低电平使能 USB。

在右边图中找到 PD6 引脚,选择 GPIO_Output

GPIO output level 中选择 Low 输出低电平。

3.3 配置时钟

选择 Clock Configuration,USB 时钟配置为 48MHz,且来源最好是外部晶振分频得到。

3.4 USB Device

USB有主机(Host)和设备(Device)之分。一般电脑的USB接口为主机接口,而键盘、鼠标、U盘等则为设备。

部分型号的STM32芯片有1~2个USB接口。像STM32F103系列的有一个USB Device接口,STM32F407系列的有2个USB接口,既可以作为HOST,又可以作为Device,还可以作为OTG接口。

Middleware 中选择 USB_DEVICE 设置,在 Class For FS IP 设备类别选择 Custom Human Interface Device Class(HID) 自定义人机接口设备。

参数配置保持默认。

  • CUSTOM_HID_FS_BINTERVAL(主机读取设备数据时间间隔): 0x5(STM32将数据发送到一个缓存区,而不是直接发送到上位机,而上位机每隔一端时间会来访问缓冲区读取数据。读取时间间隔过快会导致多次数据发送,过慢会导致数据丢失)
  • USBD_CUSTOM_HID_REPORT (Total length for Report descriptor(IN ENDPOINT))(报告描述符大小): 2(默认为2,可根据自定义设备描述符的具体大小修改)
  • USBD_CUSTOMHID_OUTREPORT_BUF_SIZE (Maximum report buffer size))(发送与接收数据大小): 2(默认为2,HID一次最多可以发送64个字节)

设备描述符保持默认。

四、生成代码

输入项目名和项目路径

选择应用的 IDE 开发环境 MDK-ARM V5

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

点击 GENERATE CODE 生成代码

五、修改报告描述符

默认报告描述表为空的,此时烧录运行默认代码程序,电脑识别驱动程序错误,需要修改自定义设备的报告描述符。

打开工程文件夹Middlewares/USB_DEVICE/Appusbd_custom_hid_if.c文件

找到CUSTOM_HID_ReportDesc_FS数组定义处。

添加如下代码:

/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
  	0x06,0xFF,0x00,     // USAGE_PAGE (Vendor Page: 0xFF00) 表示一个报文标签之类的用途类页
	0x09,0x01,			// USAGE (Vendor Usage 1) 表示一个报告ID标志
	0xA1,0x01,			// COLLECTION (Application) 表示应用集合,要以下面最后的0xc0结束它
	0x15,0x00,			// LOGICAL_MINIMUM (0) 表示每个传输数据限定为0
	0x26,0xFF,0x00,		// LOGICAL_MAXIMUM (255) 表示每个传输数据的最大值限定为255
	0x75,0x08,			// REPORT_SIZE (8) 传输字段的宽度为8bit,表示每个传输的数据范围为0~ffff ffff
	0x95,0x40,			// REPORT_COUNT (64)每次发送的数据长度,这里是64位
	0x09,0x02,			// USAGE (Vendor Usage 2) 表示一个报告ID标志
	0x81,0x02,			// INPUT (Data,Var,Abs) 表示USB要输入数据到PC的功能
	0x09,0x03,			// USAGE (Vendor Usage 3) 表示一个报告ID标志
	0x91,0x02,			// OUTPUT (Data,Var,Abs) 表示USB设备要接收PC的数据的功能
	0x0A,0x00,0xFF,	    // UsageS(0xFF00)
	0x0B1,0x02, 		// feature (data, variable, absolute)
  /* USER CODE END 0 */
  0xC0                  // END_COLLECTION 结束标志
};

上面描述表分别定义了Input、Ouput、Feature三个报告,Input用于MCU上传数据,Output下传数据,Feature可用于上下传数据。所有报告大小定义为64byte,每次最大上下传数据量也就为64byte,另外数组USBD_CUSTOM_HID_REPORT_DESC_SIZE也要对应修改为30。

也可借助 HID Descriptor Tool (DT) HID描述符工具根据自己需求生成,想了解更多的可以百度《圈圈教你玩USB》
官网下载:https://usb.org/sites/default/files/documents/dt2_4.zip
百度网盘:https://pan.baidu.com/s/1ayjdQtc7e9NWwYJqdp0pXA?pwd=4ghb 提取码:4ghb

  • 第一部分为报文头
  • 第二部分为USB告诉PC机问我要做什么,这里主要告诉PC机我要做一个接收与发送的设备
    • **INPUT:**是描述这个USB设备作为输入的时候的数据格式
    • **OUTPUT:**是描述该USB设备输出的数据格式
    • **LOGICAL_MINIMUM:**是指每个字节数据的最小值
    • **LOGICAL_MAXIMUM:**是指每个字节数据的最大值
    • **REPORT_COUNT:**是指定每次传输数据最多多少个字节
    • **REPORT_SIZE:**是指定每次传输数据每个字节的位数
  • 第三部分为结束标志

六、修改端点大小

打开工程文件夹Middlewares/USB_Device_Libraryusbd_customhid.h文件

要能最大上下传 64byte(0x40) 数据,还需修改对应上下传端点大小为 64

#define CUSTOM_HID_EPIN_ADDR                 0x81U
#define CUSTOM_HID_EPIN_SIZE                 0x40 	//0x02U Modify

#define CUSTOM_HID_EPOUT_ADDR                0x02U	//0x01U Modify
#define CUSTOM_HID_EPOUT_SIZE                0x40 	//0x02U Modify

ADDR中最高位代表端点的方向,1对应IN,0对应OUT,剩下7位为端点号,0x81代表端点1为IN Endpoint 1(EP1),这里修改为OUT的端点为Endpoint 2(EP2),两个端点的SIZE也由2改为64。

七、修改发送缓冲区大小和报告描述符大小

打开工程文件夹Application/User/USB_DEVICE/Targetusbd_conf.h文件

#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE     30

发送缓冲区大小USBD_CUSTOMHID_OUTREPORT_BUF_SIZE改为最大的64byte,另外报告描述符大小USBD_CUSTOM_HID_REPORT_DESC_SIZE改为上面CUSTOM_HID_ReportDesc_FS数组的大小30

八、添加串口打印

串口打印功能查看 STM32CubeMX学习笔记(6)——USART串口使用

九、增加上下传数据

9.1 EP1上传数据

添加头文件和USB设备句柄。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "usbd_customhid.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PV */

添加上传数据功能,USB 库里已经有写好上传函数USBD_CUSTOM_HID_SendReport(),会通过Endpoint 1上传数据,调用就可以上传数据,在主循环中添加上传数据功能。

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t bEP1_SendBuf[64] = { 0 };
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("\r\n****** USB-HID Custom Example ******\r\n\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if(USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, bEP1_SendBuf, 64) == USBD_OK)
	{
		bEP1_SendBuf[0]++;
	}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

9.2 EP2下传数据

打开工程文件夹Application/User/USB_DEVICE/Appusbd_custom_hid_if.c文件,找到CUSTOM_HID_OutEvent_FS()函数,添加以下代码,实现对接收数据的串口打印。

/**
  * @brief  Manage the CUSTOM HID class events
  * @param  event_idx: Event index
  * @param  state: Event state
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
  /* USER CODE BEGIN 6 */
  char log[250];
  uint8_t i;
  uint8_t len = USBD_GetRxCount(&hUsbDeviceFS, CUSTOM_HID_EPOUT_ADDR);  // 第一参数是USB句柄,第二个参数的是接收的末端地址;要获取发送的数据长度的话就把第二个参数改为发送末端地址即可
  USBD_CUSTOM_HID_HandleTypeDef *hhid;                                  // 定义一个指向USBD_CUSTOM_HID_HandleTypeDef结构体的指针
  hhid = (USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData;      // 得到USB接收数据的储存地址
  for(i = 0; i < len; i++)
  {
    sprintf(log + (i*2), "%02x", hhid->Report_buf[i]);
  }
  printf("%s\n", log);
    
  return (USBD_OK);
  /* USER CODE END 6 */
}

9.3 Feature Report上下传数据

前面EP1 InEP2 Out为中断端点上下传,因报告描述符中有定义Feature报告,现在可通过控制端点EP0来进行Get/Set Feature Report数据传输。

Cube Library中没有提供相应的接口,这部分的代码实现,必须去修改原始的类命令处理。

打开工程文件夹Middlewares/USB_Device_Libraryusbd_customhid.c文件,找到USBD_CUSTOM_HID_Setup()函数,添加以下代码,实现对类命令SET_REPORTGET_REPORT进行处理。

        case CUSTOM_HID_REQ_SET_REPORT:
          //类命令的wValue高字节,1-Input Report; 2-Output Report; 3-Feature Report
          if(((req->wValue>>8) & 0xFF) == 0x03)			//add  Set Feature report
          {
              printf("Set Feature report\n");
        	  hhid->IsReportAvailable = 1U;
        	  USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);
              char log[250];
              uint8_t i;
              for(i = 0; i < req->wLength; i++)
              {
                  sprintf(log + (i*2), "%02x", hhid->Report_buf[i]);
              }
              printf("%s\n", log);
          }
          else if(((req->wValue>>8) & 0xFF) == 0x02)		//add  Set out report
          {
              printf("Set out report\n");
//              hhid->IsReportAvailable = 1U;
//              USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);
          }
          break;
        //add
        case CUSTOM_HID_REQ_GET_REPORT:
          if(((req->wValue>>8) & 0xFF) == 0x03)		//add  Get Feature
          {
              printf("Get Feature\n");
        	  hhid->Report_buf[0] = 0xAA;
        	  USBD_CtlSendData(pdev, hhid->Report_buf, req->wLength);
              char log[250];
              uint8_t i;
              for(i = 0; i < req->wLength; i++)
              {
                  sprintf(log + (i*2), "%02x", hhid->Report_buf[i]);
              }
              printf("%s\n", log);
          }
          break;

十、查看效果

编译工程,下载到板子上,插上USB线连接到电脑上,识别出为未指定设备。

注意: 如果设备带有感叹号,则参考下面十二、注意事项

10.1 下载测试工具

  • Bus Hound
    百度网盘:https://pan.baidu.com/s/1Q8x3gjN9tl2pW1qHcG9I-A?pwd=0yjp 提取码:0yjp

  • PortHelper
    百度网盘:https://pan.baidu.com/s/157gd_8zBh9cBPf9qXVDnow?pwd=5cw5 提取码:5cw5

10.2 测试上传数据

  • Bus Hound
    打开Bus Hound,在Devices页面找到我们的HID设备,注意VID和PID与我们设置的一致,勾选该设备:

    然后切换到Capture页面,点击Run,检测收发数据,可以看到开发板向计算机发送的数据,长度为64字节:

  • PortHelper
    查找USB,然后根据USB设备的名称找到STM32的USB接口:

    然后点击打开USB,勾选Hex显示,检测收发数据,可以看到开发板向计算机发送的数据,长度为64字节:

10.3 测试下传数据

  • Bus Hound
    Devices页面,选中我们自定义的HID设备后,点击右下方的Send Commands,打开发送窗口:

    选中USB选项卡,然后选中Interrupt Out,在Data Length处填入64,即需要发送64个字节;修改下方的数据为想要发送的数据,这里为便于观察,设置成全0x11,然后点击Run发送。

打开串口工具查看:

  • PortHelper
    点击打开USB,勾选Hex发送,修改下方的数据为想要发送的数据:

打开串口工具查看:

10.4 测试Feature Report上下传数据

  • Bus Hound
    • 接收Set Feature Report数据

查看串口打印:

  • 接收Get Feature Report数据

查看串口打印:

十一、工程代码

链接:https://pan.baidu.com/s/16yaJxfE5GxKhF-wkOwiFQg?pwd=02fu
提取码:02fu

十二、注意事项

用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。

如果USB端口出现感叹号设备无法启动的问题,可适当将堆改大,如0x400


• 由 Leung 写于 2022 年 11 月 4 日

• 参考:STM32CubeMX生成STM32F072 USB 自定义HID Device
    【STM32+cubemx】0018 HAL库开发:自定义usb HID设备实现
    YIE002开发探索09-USB(HID双向通信)
    STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
    STM32 基础系列教程 27 - USB_HID

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

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

相关文章

浅刷牛客链表题,逐步深入链表,理解链表

作者&#xff1a;渴望力量的土狗 博客主页&#xff1a;渴望力量的土狗的博客主页 专栏&#xff1a;手把手带你刷牛客 工欲善其事必先利其器&#xff0c;给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 1、反转链表 2、删除链表的倒数第n个…

RocketMQ 消息重新投递 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2022年11月4日 &#x…

35、Java——一个案例学会Dao+service层对数据表的增删改查

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;乐趣国学的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

deployment html--->JDBC--->mysql

spec: 相关属性定义 spec.selector: 符合该条件的收到该deployment管理 #spec.selector.matchLables 和 spec.template.metadata.labels 标签要一致 mysql Service metadata.name: Service的服务名 spec.ports: 虚拟端口 spec.selector: 哪些pod&#xff08;实列&…

《Java》深浅拷贝解析(还不会区分深浅拷贝吗?快进来)

目录 一、深浅拷贝的意义 浅拷贝 深拷贝 二、深浅拷贝举例 浅拷贝 深拷贝 一、深浅拷贝的意义 首先我们来了解一下深浅拷贝的意义 浅拷贝 浅拷贝是会将对象的每个属性进行依次复制&#xff0c;但是当对象的属性值是引用类型时&#xff0c;实质复制的是其引用&#xff0c…

全网最全【数据结构与算法】408真题实战(含代码+详解)—— 线性表专题(持续更新...)

线性表专题 每道题目均有对应的代码&#xff0c;大家自行查看哦&#xff01; 顺序表 ADT&#xff1a;SeqList 文件名&#xff1a;SeqList.hpp #include <iostream> #include <cstdlib> using namespace std; // 以上是实际运行所需依赖&#xff0c;考试不用写t…

怎样编写裸片启动程序-ARMv8的Boot Code和ROM程序

ROM程序就是固化在芯片的ROM里面&#xff0c;把应用程序从存储器里加载/搬移到RAM中并使处理器开始执行应用程序的一段程序 1 Boot Code和ROM程序 从多普通单核MCU&#xff08;如STM32&#xff09;的使用者的角度来看&#xff0c;只需要把编译好的hex文件烧写到片上Flash中&am…

JavaScript(WebAPI) (前端)

文章目录前言一、WebAPI二、DOM1.选中元素2.事件3.获取/修改元素内容4.获取/修改元素属性5.获取/修改表单元素属性6.操作复选框7.获取/修改样式属性①行内样式②通过css class 指定的样式8.新增节点9.删除节点总结前言 虽然学了一些js的语法,但是仍然无法写出页面的动态效果~~…

【JavaScript高级进阶】构造函数和原型,学会prototype

目录 前言 1.构造函数和原型 1.1使用prototype解决内存浪费的问题 1.2constructor构造函数构造器构造函数 2.原型链 2.1js中成员查找规则 2.2原型对象this指向 2.3扩展内置对象 3.call作用 4.继承 4.1利用原型对象继承 写在最后 前言 哈喽哈喽大家好&#xff0c;因为…

【Day1】零基础学java--》记事本运行java程序,通熟语言让你彻底明白为什么配置java环境变量

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;从今天开始我将协同大家一起从零基础学习Java&#xff0c;期待与君为伴&#xff0c;走向海的彼岸。&#x1f495;&#x1f495;&#x1f495; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&a…

C语言之数组练习题

第1关&#xff1a;数组插入元素 300 任务要求参考答案评论106 任务描述相关知识 数组数组元素的表示方法编程要求测试说明任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中&#xff0c;为了处理方便&#xff0c; 把具有相同类型…

【C++】多态 — 多态的原理 (下篇)

文章目录&#x1f4d6; 前言1. 虚函数表1.1 虚函数表的引入&#xff1a;1.2 基类的虚表&#xff1a;1.3 派生类虚表&#xff1a;2. 多态的原理2.1 多态虚函数的调用和普通函数的调用&#xff1a;2.1 - 1 到底什么是多态&#xff08;重点&#xff09;2.1 - 2 父类的指针实现多态…

Allegro基本规则设置指导书之Analysis Modes

Allegro基本规则设置指导书之Analysis Modes 下面介绍基本规则设置指导书之Analysis Modes 点击set-up-constrains-Modes 调出Analysis Modes,这个是所有DRC的总开关 下面介绍常用的一些开关设置 Design Options (Soldermask) 从上往下 阻焊到阻焊的间距 阻焊到pad和走线…

EasyCVR及智能分析网关在校园视频融合及明厨亮灶项目中的应用方案设计

随着校园智能化需求的不断增长&#xff0c;越来越多的校园逐渐开始升级校园监控视频平台&#xff0c;将原先传统的视频监控系统&#xff0c;逐渐升级转变为灵活性强、视频能力丰富、具备AI检测能力、并能支持视频汇聚与统一管理的智能化校园综合管理平台。 在某学校的视频监控…

MapReduce概述

MapReduce概述 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 MapReduce…

【优化算法】鹈鹕优化算法(POA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

ARMv7/ARMv8/ARMv9架构你不知道的那些事

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 以下仅代表个人观点&…

七大排序算法——快速排序

AcWing算法专题——快速排序 文章目录AcWing算法专题——快速排序前言一、快速排序的核心二、算法图示三、算法代码四、算法详解1.递归停止的条件2.下标移动的实现3.下标初始值的设定4.边界情况分析4.1区间划分4.2 do while循环条件五、思考题总结前言 现在我们开始进入算法模块…

【第一章 虚拟机】

第一章 虚拟机 1. 虚拟机VM ①虚拟机就是一台虚拟的计算机&#xff0c;它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。 ②虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机&#xff08;比如VMware&#xff09;,它们完全是对物理计算机的仿真&#xff0c;提供了一个可运…

瑞芯微rk3568移植openbmc(三)

2022.11.04 更新 1、关于h264 novnc openbmc中使用的ipkvm其server端调用的是libvncserver库&#xff0c;而其web client端调用的则是novnc的库&#xff0c;既上篇研究修改了libvncserver后&#xff0c;再次继续研究了一下novnc。 Github搜索一圈以后&#xff0c;发现https://…