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

news2024/11/18 11:44:11

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

  • 一、USB简介
  • 二、新建工程
  • 三、USB
    • 3.1 参数配置
    • 3.2 引脚配置
    • 3.3 配置时钟
    • 3.4 USB Device
  • 四、生成代码
  • 五、修改报告描述符
  • 六、修改端点大小
  • 七、修改发送缓冲区大小和报告描述符大小
  • 八、添加串口打印
  • 九、增加上下传数据
    • 9.1 EP1上传数据
  • 十、查看效果
    • 10.1 下载测试工具
    • 10.2 测试上传数据
    • 10.3 测试下传数据
    • 10.4 测试Feature Report上下传数据
  • 十一、工程代码
  • 十二、注意事项

原创链接 1

一、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 In和EP2 Out为中断端点上下传,因报告描述符中有定义Feature报告,现在可通过控制端点EP0来进行Get/Set Feature Report数据传输。

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

打开工程文件夹Middlewares/USB_Device_Library下usbd_customhid.c文件,找到USBD_CUSTOM_HID_Setup()函数,添加以下代码,实现对类命令SET_REPORT和GET_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
在这里插入图片描述
在这里插入图片描述


  1. 链接:https://www.jianshu.com/p/a30b9f326681 作者:Leung_ManWah ↩︎

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

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

相关文章

VC6 WIN32,Dialog为主窗口编程

VC6是Microsoft非常经典的开发环境&#xff0c;尤其是Windows API方式开发&#xff0c;自从Quick C for win以来基本保持着同样的风格和API&#xff0c;在它上面做习练很不错。下面是习练完成的界面&#xff0c;它是在自动创建的WIN32 application模板下&#xff0c;增加一个Di…

微服务的初步使用

环境说明 jdk1.8 maven3.6.3 mysql8 idea2022 spring cloud2022.0.8 微服务案例的搭建 新建父工程 打开IDEA&#xff0c;File->New ->Project&#xff0c;填写Name&#xff08;工程名称&#xff09;和Location&#xff08;工程存储位置&#xff09;&#xff0c;选…

git提交代码实际操作

1.仓库的代码 2.克隆代码下存在的分支 git clobe https://gitee.com/sadsadasad/big-event-11.git 3.查看当下存在的分支 git branch -a 在很多情况下,我们是要围绕着dev分支进行开发,所以我们可以在开发之前问明白围绕那个分支进行开发。 4.直接拉去dev分支代码 5.如果没在…

LabVIEW开发教学实验室自动化INL和DNL测试系统

LabVIEW开发教学实验室自动化INL和DNL测试系统 如今&#xff0c;几乎所有的测量仪器都是基于微处理器的设备。模拟输入量在进行数字处理之前被转换为数字量。对于参加电气和电子测量课程的学生来说&#xff0c;了解ADC以及如何欣赏其性能至关重要。ADC的不确定性可以根据其传输…

2.3 Node2vec(图神经网络笔记)

BFS&#xff1a;广度优先 DFS&#xff1a;深度优先 描述&#xff0c;当前已从 t 节点到达 V 节点&#xff0c;可以选择 x1、x2、x3、t任意一个节点 dtx 0 &#xff0c;从t - v - t ,回到原点 dtx 1 &#xff0c;还是说从t出发&#xff0c;离t节点距离为1&#xff0c;有z、x…

beego-简单项目写法--后续放到git上

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

Python 无废话-基础知识流程控制语句

If 流程控制语句 最常见的控制流语句是if 语句。在自然语言中&#xff0c;if 语句念起来可能是&#xff1a;“如果条件为真&#xff0c;执行子句中的代码。”在Python中的条件语句用于根据特定条件执行不同的代码块条件。 用代码描述如下&#xff1a; cost 60000 if cost &…

数据结构——红黑树(详解性质+C++模拟)

文章目录 前言红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入操作1. **按照二叉搜索树的规则插入新结点**2. 检测新节点插入后&#xff0c;红黑树的性质是否遭到破坏 红黑树的验证总结 前言 本篇博客将为大家重点讲述红黑树这一数据结构&#xff0c;讲解其实现的方式即…

[NSSRound#1 Basic]sql_by_sql - 二次注入+布尔盲注||sqlmap

进入注册界面后   假设sql&#xff1a;update user set password ‘’ where username ‘’ and password ‘’     此时如果我们注册的用户名是admin’–、admin’#、admin’–的话   update user set password ‘123’ where username ‘admin’#’ and passwor…

[NISACTF 2022]hardsql - quine注入

题目描述&#xff1a;$password$_POST[passwd]; $sql"SELECT passwd FROM users WHERE usernamebilala and passwd$password;"; 从描述看出是quine注入&#xff0c;且用户名要是bilala 1、经测试&#xff0c;参数为&#xff1a;username&passwd&login登录&a…

重置系统后出现 press F12 to clear the tpm press Esc to reject this chan

案例分享&#xff1a; 外星人M15 R7重置系统后出现下图问题&#xff0c;暂时不能下一步。 原文如下&#xff1a; A configuration change was requested to Clear this computers TPM (Trusted platform module) warning:clearing erases information stored on the tpm.you …

正向代理和反向代理

正向代理和反向代理 1.正向代理和反向代理&#xff0c;squid&#xff0c;Nginx2.正向代理主要作用&#xff1a;3.反向代理主要作用&#xff1a;4.透明代理 1.正向代理和反向代理&#xff0c;squid&#xff0c;Nginx 1.用途不同&#xff1a;正向代理的典型用途是为在防火墙内的…

深度学习-卷积神经网络-AlexNET

文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数9.双GPU10.单GPU模型 1.LeNet-52.AlexNet1.架构2.局部响应归一化&#xff08;VGG中取消了&#xff09;3.重叠/不重叠池化4…

一文解释mapState的来龙去脉

mapState Vuex 提供的辅助函数之一&#xff0c;将 store 中的状态映射到组件的计算属性中&#xff0c;使得在组件中可以轻松地访问 Vuex store 中的状态值 MapState(映射状态) 在我们的 Count.vue 组件中&#xff0c;可以使用 mapState 来更简洁地获取 count 的状态值 首先&…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目&#xff0c;先看项目质量&#xff08;有源码论文&#xff09; 项目链接&#xff1a;医疗预约挂号平台git地址 演示视频&#xff1a;医疗预约挂号平台 功能结构图 登录注册模块&#xff1a;该模块具体分为登录和注册两个功能&#xff0c;这些…

Android 开发错误集合

&#x1f525; 开发错误集合一 &#x1f525; Caused by: java.lang.ClassNotFoundException: Didnt find class "com.mask.app.ui.LoginRegisterActivity" on path: DexPathList[[zip file "/data/app/~~NMvHVhj8V6-HwGbh2amXDA/com.mask.app-PWbg4xIlETQ3eVY…

解密京东面试:如何应对Redis缓存穿透?

亲爱的小伙伴们&#xff0c;大家好&#xff01;欢迎来到小米的微信公众号&#xff0c;今天我们要探讨一个在面试中可能会遇到的热门话题——Redis缓存穿透以及如何解决它。这个话题对于那些渴望进入技术领域的小伙伴们来说&#xff0c;可是必备的哦&#xff01; 认识Redis缓存…

javaWeb蛋糕商城(前后台)

一、项目功能 1.前台功能 商品基本展示,包括推荐商品展示和类型商品展示.推荐商品包括条幅推荐,热销推荐和新品推荐.按照商品类型展示商品.商品详细信息展示.商品加入购物车.修改购物车内商品信息,例如数量等.用户登录.用户注册.修改个人信息,包括密码和收获信息.购物车付款.…

数值分析学习笔记——误差【华科B站教程版本】

误差 误差&#xff1a;一个物理量的真实值与计算值之间的误差 误差来源与分类 模型误差&#xff1a;对问题所抽象出来的数学/物理模型是误差的&#xff0c;比如要有一些假设条件才进行理论的推导观测误差&#xff1a;测量得到的模型的参数的值的误差方法误差&#xff08;截断…

React项目部署 - Nginx配置

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…