STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘

news2024/11/15 21:52:02

目录

1、准备材料

2、实验目标

3、USB概述

3.1、USB协议

3.2、USB设备

3.3、USB接口

3.4、硬件原理

4、实验流程

4.0、前提知识

4.1、CubeMX相关配置

4.1.0、工程基本配置

4.1.1、时钟树配置

4.1.2、外设参数配置

4.1.3、外设中断配置

4.2、生成代码

4.2.0、配置Project Manager页面

4.2.1、设初始化调用流程

4.2.2、外设中断调用流程

4.2.3、添加其他必要代码

5、烧录验证

6、常用函数

7、注释详解

参考资料


1、准备材料

正点原子stm32f407探索者开发板V2.4

STM32CubeMX软件(Version 6.10.0)

keil µVision5 IDE(MDK-Arm)

ST-LINK/V2驱动

野火DAP仿真器

XCOM V2.6串口助手

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板USB_OTG_FS为工作在Mass Storage Host Class(大容量存储主机类)模式下的USB_HOST(USB主机),并使用FatFs文件系统对插入开发板的U盘进行读写等操作

3、USB概述

3.1、USB协议

通用串行总线(Universal Serial Bus,简称USB)是1994年提出的一种支持热插拔的外部传输总线,现在不管是在什么设备上都可以非常容易看到它,USB协议从诞生到如今经历了很多次升级换代,如下图所示为USB历史版本号及传输速度等相关信息 (注释1)

另外在USB2.0的基础上还扩展出了一种既可以工作为USB主机又可以工作为USB外设(但不能同时)的协议标准USB on the go(USB_OTG),易于进行角色的转换

3.2、USB设备

一个USB系统包括USB主机(USB HOST)、USB外设(USB DEVICE)和USB连接三个部分,USB外设又可以分为USB功能外设(USB FUNCTION)和USB集线器(USB HUB)

一个USB系统只能有一个USB主机,但USB主机通过连接USB集线器可以扩展USB端口数量,最多可以有127个USB从机,USB主机负责控制所有的USB外设,而USB外设接受USB主机的控制来实现某个具体的功能,USB设备分类及连接方式具体如下图所示

3.3、USB接口

在USB协议从USB 1.0发展到今天USB4(虽然还未普及),速度有了很大的进步,接口的类型也多种多样(未来可能会暂时稳定在Type-C),有Type A/B/C,还有衍生出来的MINI类型接口,micro类型接口等,不同类型接口适配的USB协议也不尽相同,如下图所示为USB机械电子标准一览表 (注释1)

3.4、硬件原理

STM32F407的两个USB_OTG都内置了PHY,因此无需在外部添加额外的PHY芯片,当USB仅工作在主机/从机模式下时,USB座只需要VBUS、D+、D-和Vss共4根线,其中D+/D-负责传输差分信号,在主机模式下VBUS用于给插入主机的USB设备供电,在从机模式下VBUS可以用于监测主机提供的电源,Vss为接地端

而当USB工作在双角色设备时,USB座除了需要上述的4根线外,还需要一根额外的ID信号线,该信号线用于判断插入USB接口的设备为主机设备还是从机设备,在内置的PHY中ID线拥有上拉电阻,当检测到输入的ID线为高电平时,此时认为该USB设备为从机设备,否则认为该USB设备为主机设备

当USB工作在仅主机模式(A类设备)下时,对于插入主机的USB设备需要由主机提供电源,而主机提供的电源一般由某一个引脚控制,方便在不使用USB设备的时候切断电源,节省能源,如下图所示为USB_OTG工作在仅主机模式下的硬件结构框图 (注释2)

当USB工作在仅从机模式(B类设备)下时,此时开发板USB接口的电源应该由其他的主机提供,这个时候VBUS信号线可以连接STM32F407的某一个引脚(默认为PA9),通过配置该引脚为输入可以监测其他主机提供给本从机设备的电压有无,如下图所示为USB_OTG工作在仅从机模式下的硬件结构框图

当USB工作在双角色设备(DRD)下时,通过输入的ID线决定该USB设备为主机设备还是从机设备,其硬件原理读者可以理解为A/B两类设备的合并,ID线为高电平时,此时认为该USB设备为从机设备,否则认为该USB设备为主机设备,如下图所示为USB_OTG工作在双角色设备下的硬件结构框图

4、实验流程

4.0、前提知识

注意:由于USB协议源码比较复杂,故本实验对其源码具体内容一概不涉及,仅作应用,读者阅读本文将了解如何使用STM32CubeMX配置STM32F407作为USB主机读写SD里的内容

STM32F407片上集成了 USB_OTG_FS(全速,最高12Mb/s) 和 USB_OTG_HS(高速,最高480Mb/s) 两个USB_OTG,本实验我们将使用 USB_OTG_FS,将其配置为大容量存储主机类,使开发板工作在主机模式下,对接入开发板主机USB接口的大容量存储设备(U盘)进行读写等操作

片上集成的USB_OTG_FS挂载在APB2总线上,USB_OTG_HS直接挂载在AHB(应用总线)上,这两个USB_OTG内部均集成了PHY,硬件上无需外部重复设计,如下图所示为STM32F4XX的功能概览框图 (注释2)

USB_OTG_FS主要由OTG FS内核和PHY组成,时钟树上的48MHz时钟为其OTG FS内核提供了48MHz的USB时钟,如下图所示为其OTG_FS功能框图

笔者使用的开发板上有一个USB_HOST接口和一个USB_SALVE接口,这两个USB接口都是使用的USB_OTG_FS实现的,在使用USB主机/从机时需要将USB/CNA排针座上的跳线帽选择为USB,同时在硬件原理图中还有一个控制USB作为主机时提供给USB外设设备电源VBUS的引脚PA15,该引脚通过一个三极管和一个P-MOS管组成了开关电路,具体硬件原理图如下图所示

4.1、CubeMX相关配置

4.1.0、工程基本配置

打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示

开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示

详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”

4.1.1、时钟树配置

当在STM32CubeMX中启用USB_OTG功能后,时钟树中48MHz时钟便可以进行调节,该时钟一般如其名字一样配置为48MHz即可,也即将Main PLL(主锁相环)的Q参数调节为7即可,其他HCLK、PCLK1和PCLK2时钟仍然设置为STM32F407能达到的最高时钟频率,具体如下图所示

4.1.2、外设参数配置

本实验需要需要初始化开发板上WK_UP、KEY2、KEY1和KEY0用户按键,具体配置步骤请阅读“STM32CubeMX教程2 GPIO输出 - 点亮LED灯”

本实验需要需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”

单击Pinout & Configuration页面左边功能分类栏目中Connectivity/USB OTG_FS,在模式配置中将其配置为Host_Only(仅主机)模式,不勾选Activate_SOF 和 Activate_VBUS,在下方的Configuration栏目中设置参数 Speed 为主机全速12MBit/s,参数 Signal start of frame 选择Disabled,具体配置如下图所示

 Mode/OTG/Dual Role_Device (双角色设备模式):工作在双角色设备模式,通过ID线切换角色

 Host_Only (仅主机模式):工作在主机模式下

 Device_Only (仅外设模式):工作在外设模式下

 Activate_SOF (启用帧的起始信号引脚PA8):不使能,读写SD卡无需SOF信号

 Activate_VBUS (激活VBUS PA9控制引脚):笔者开发板上未使用PA9引脚,因此此处不激活

 Speed (USB主机速度设置):可选12Mbit/s、1.5Mbit/s

 Signal start of frame (帧起始信号):不使能

然后需要配置USB主机的电源控制引脚,在Pinout view(引脚功能预览)页面中找到控制USB主机电源的引脚PA15,左键单击将其配置为GPIO_Output

接下来单击Pinout & Configuration页面左边功能分类栏目最下面的Middleware and SoftwarePacks,当USB_OTG配置为Host_Only时该栏目下的USB_HOST将变为可选状态

选择其中的USB_HOST,在模式配置中将Class for FS IP的模式选择为Mass Storage Host Class(大容量存储主机类),下方的Configuration/Prameter Settings无需修改,保持默认即可,具体配置如下图所示

最后需要配置FatFs文件系统,单击Middleware and SoftwarePacks中的FATFS,将其模式配置为USB Disk,在下方Configuration/Set Defines修改参数 CODE_PAGE (Code page on target) 为 Simplified Chinese (DBCS),其他参数保持默认即可,具体配置如下图所示

4.1.3、外设中断配置

当在Middleware and SoftwarePacks中配置了USB_HOST的模式不为Disable时,便会自动开启USB_OTG的全局中断,且不可关闭,用户配置合适的中断优先级即可,具体配置如下图所示

4.2、生成代码

4.2.0、配置Project Manager页面

单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示

详细Project Manager配置内容读者可以阅读”STM32CubeMX教程1 工程建立”实验3.4.3小节

4.2.1、设初始化调用流程

在生成的工程代码中增加了USB_HOST相关初始化及其他用到的外设/中间件功能初始化函数,同时读者可以发现,在以往配置好的工程生成的工程代码中,while主循环中并无任何程序,但是在本实验USB_HOST中增加了名为 MX_USB_HOST_Process() 的函数,该函数仅调用了 USBH_Process() 函数

USBH_Process() 函数是USB Core的后台进程函数,它负责监测USB主机接口的状态变化,在U盘热插拔的时候,可以判断出此时接口状态,同时如果定义了用户的回调函数,还会根据不同的接口状态调用对应该状态的用户定义的回调函数

CubeMX在工程代码usb_host.c中自动生成了USBH_UserProcess()用户回调函数,在该函数中用户可以根据不同状态调用自己定义的函数;当然如果读者不需要热插拔,U盘一直插在主机USB接口上,接口状态不会发生变化,那么注释掉该后台进程函数也可以


接下来我们来根据生成的工程代码,给读者详细介绍USB_HOST工作流程,读者简单了解即可

在开发板上电进入主循环后会执行USB_HOST的初始化函数MX_USB_HOST_Init(),在该函数中分别调用了以下三个函数(三个函数位于usb_host.c中)

  1. USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS)
  2. USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS)
  3. USBH_Start(&hUsbHostFS)

第一个函数用于USB_HOST的初始化,对我们实例化的USBH_HandleTypeDef结构体对象内部参数进行了配置,并且将名为USBH_UserProcess的函数指针赋值给USBH_HandleTypeDef结构体对象内部最后一个函数指针参数

第二个函数用于注册当前USB_HOST工作的类别,开发板上的USB_HOST只能工作在一种模式下,不能同时工作在不同模式下,因此在该函数中判断注册的类数量是否超过最大值1,没有超过就设置USBH_HandleTypeDef结构体中ClassNumber为0,pClass为函数参数中指定的工作类别,这里为大容量主机存储类USBH_MSC_CLASS

第三个函数用于启动USB_HOST内核,同时激活VBUS电源端口


执行完上述三个函数后退出USB_HOST的初始化函数MX_USB_HOST_Init()后,如果之前就在开发板USB口插入了U盘,此时USB接口的状态应该为APPLICATION_START,这个时候还不能够对插入的U盘进行FatFs文件系统的挂载

需要进入while主循环中不断执行USB Core的后台进程函数MX_USB_HOST_Process()直到接口状态变为APPLICATION_READY才可以挂载文件系统并通过上层API对U盘文件进行操作,此时如果拔掉U盘,接口状态会改变为APPLICATION_DISCONNECT

读者可以将usb_host.c文件中的用户回调函数USBH_UserProcess()增加串口打印信息的功能,然后编译烧录程序到开发板并插拔U盘,观察串口助手接收到开发板传来的消息就可以清楚的看到这一变化,具体源代码如下所示

/*
 * user callback definition
 */
static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)
{
  /* USER CODE BEGIN CALL_BACK_1 */
  switch(id)
  {
  case HOST_USER_SELECT_CONFIGURATION:
	printf("HOST_USER_SELECT_CONFIGURATION\r\n");
  break;

  case HOST_USER_DISCONNECTION:
  Appli_state = APPLICATION_DISCONNECT;
	printf("Appli_state = APPLICATION_DISCONNECT\r\n");
  break;

  case HOST_USER_CLASS_ACTIVE:
  Appli_state = APPLICATION_READY;
	printf("Appli_state = APPLICATION_READY\r\n");
  break;

  case HOST_USER_CONNECTION:
  Appli_state = APPLICATION_START;
	printf("Appli_state = APPLICATION_START\r\n");
  break;

  default:
  break;
  }
  /* USER CODE END CALL_BACK_1 */
}

另外关于FatFs的初始化已经被CubeMX软件自动完成,读者可以阅读STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡实验“3.2.1、外设初始化调用流程”小节了解此过程

4.2.2、外设中断调用流程

在CubeMX中配置了USB_HOST的模式不为Disable时,便会强制自动开启USB_OTG的全局中断,在生成的工程文件stm32f4xx_it.c中将增加OTG_FS_IRQHandler()这个USB全局中断处理函数

读者对于其调用内容无需了解,也不需要任何修改(也不希望读者修改),在使用USB的一系列回调函数时仅需要在usb_host.c文件中的用户回调函数USBH_UserProcess()处修改即可

4.2.3、添加其他必要代码

在生成的工程代码中增加使用FatFs库中API进行文件操作的函数,包括挂载文件系统、显示存储设备信息、读/写TXT文件、获取文件信息、扫描文件列表和删除文件等函数,笔者将其封装在了file_operate.c / file_operate.h文件中,具体的源代码如下所示

file_operate.c文件

与STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写实验中实现的file_operate.c文件一致,除了测试写的函数FatFs_WriteTXTFile()中写入SD卡的内容修改为了“Hello,USB_HOST!\n”

file_operate.h文件

与STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写实验中实现的file_operate.h文件一致,除了下面三个宏定义需要修改为本实验的SD卡相关内容,修改内容如下所示

/*定义自己的存储设备*/
/*用户存储设备扇区字节数*/
#define User_Sector 512
/*用户存储设备FatFs对象*/
#define User_FatFs 	USBHFatFS
/*用户存储设备卷路径*/
#define User_SDPath USBHPath

向工程中添加.c/.h文件的步骤请阅读“STM32CubeMX教程19 I2C - MPU6050驱动”实验3.2.3小节

这里需要读者重点理解U盘在插入开发板主机的时候状态的变化过程,存在的四种状态是在usb_host.h文件中一个ApplicationTypeDef结构体中定义的,如下源码所示

/** Status of the application. */
typedef enum {
  APPLICATION_IDLE = 0,      /*空闲*/
  APPLICATION_START,         /*开始*/
  APPLICATION_READY,         /*已准备好*/
  APPLICATION_DISCONNECT     /*断开连接*/
}ApplicationTypeDef;

首先开发板上电复位,假设此时U盘还未插入开发板主机,在调用MX_USB_HOST_Init()对USB_HOST初始化之后应该不断执行USB Core的后台进程函数MX_USB_HOST_Process(),此时接口状态应该一直为APPLICATION_DISCONNECT状态

然后将U盘插入开发板主机,此时由于不断执行USB Core的后台进程函数,接口状态立马改变为APPLICATION_START状态

当接口状态变为APPLICATION_START状态后,紧接着再执行几次USB Core的后台进程函数MX_USB_HOST_Process(),如果一切正常,接口状态应该改变为APPLICATION_READY,此时便可以在U盘上挂载FatFs文件系统,最后利用FatFs上层API对U盘进行读写等操作了

根据以上描述,构建的测试程序源代码如下所示,主循环中的按键逻辑控制程序与STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写实验中的一致

/*主函数初始化完进入主循环前*/
printf("Reset\r\n");
while(1)
{
	//初始化完毕应不断执行该函数更新接口状态
	MX_USB_HOST_Process();
	//当接口状态Ready便可以退出循环
	if(Appli_state == APPLICATION_READY) break;
}
//挂载文件系统
Mount_FatFs();
FatFs_GetDiskInfo();

/*主函数主循环中*/
/*按键WK_UP被按下*/
if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET)
{
	HAL_Delay(50);
	if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET)
	{
		FatFs_ScanDir("0:/");
		while(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin));
	}
}

/*按键KEY2被按下*/
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
{
	HAL_Delay(50);
	if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
	{
		FatFs_WriteTXTFile("test.txt",2016,11,15);
		while(!HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin));
	}
}

/*按键KEY1被按下*/
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
{
	HAL_Delay(50);
	if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
	{
		FatFs_ReadTXTFile("test.txt");
		FatFs_GetFileInfo("test.txt");
		while(!HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin));
	}
}

/*按键KEY0被按下*/
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
{
	HAL_Delay(50);
	if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
	{
		FatFs_DeleteFile("test.txt");
		while(!HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin));
	}
}

5、烧录验证

烧录程序,开发板上电后将U盘插入开发板主机中,当接口状态变为APPLICATION_READY后,在U盘上挂载文件系统,挂载成功后会输出读取到的U盘的信息,接下来按照下面几个步骤使用FatFs文件系统对U盘进行读写等测试

  1. 按下开发板上的WK_UP按键,扫描U盘根目录下所有文件,并通过串口将文件列表输出
  2. 按下开发板上的KEY2按键,在U盘根目录创建一个”test.txt“文件,将一个字符串”Hello,USB_HOST!”写入该文件中,该字符串大小为17个字节(该字符串末尾包括了一个’\n‘和一个‘\0')
  3. 按下开发板上的KEY1按键,读取U盘根目录下名为”test.txt“的文件,将其中的内容通过串口输出,然后读取该文件的信息(大小,属性,名称,创建时间),并通过串口输出
  4. 按下开发板上的KEY0按键,删除U盘根目录下名为”test.txt“的文件

最后将U盘从开发板主机USB接口拔出,整个实验过程串口具体的输出情况如下图所示

写入”test.txt“文件信息到U盘后不删除,将U盘插入Windows电脑USB接口,利用第三方软件(笔者使用了 DiskGenius 软件)查看U盘中的内容(U盘被挂载了FatFs文件系统,所以Windows无法正常读取卷),发现U盘根目录下有一个名为“test.txt”的文件夹,其中内容为”Hello,USB_HOST!”,如下图所示

6、常用函数

由于U盘往往内存较大,因此本实验没有使用按照根据地址对U盘进行读写等操作的函数,而是直接使用FatFs的上层API来对U盘进行读写等操作,对于FatFs的上层API常用函数读者可以阅读STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写实验“5、常用函数”小节,以下列出了一些最常用的按照地址对U盘读写等操作的函数

/*检查lun是否已准备好*/
uint8_t USBH_MSC_UnitIsReady(USBH_HandleTypeDef *phost, uint8_t lun)
/*读*/
USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost,
                                 uint8_t lun,
                                 uint32_t address,
                                 uint8_t *pbuf,
                                 uint32_t length)
/*写*/
USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost,
                                  uint8_t lun,
                                  uint32_t address,
                                  uint8_t *pbuf,
                                  uint32_t length)
/*获取lun信息*/
USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info)

7、注释详解

注释1:图片来源 维基百科 - USB

注释2:图片来源 STM32F4XX 中文参考手册 RM009

参考资料

STM32Cube高效开发教程(高级篇)

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

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

相关文章

C++ day2 类 访问权限

1> 思维导图 2> 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

数据权限方案设计(后端)

有些BO模型放在bo包下用来装一些SQL语句查询返回,用于在Service层中进行处理业务逻辑,不会出现在Controller接口层的包装中。在持久层的基础组件中,我司业务种用的是Mysql5.7版本。在前后端开发使用的是分离技术,即前端使用流行的VUEElement-…

RISC-V常用汇编指令

RISC-V寄存器表: RISC-V和常用的x86汇编语言存在许多的不同之处,下面将列出其中部分指令作用: 指令语法描述addiaddi rd,rs1,imm将寄存器rs1的值与立即数imm相加并存入寄存器rdldld t0, 0(t1)将t1的值加上0,将这个值作为地址,取…

6家券商综合评级上升,12月券商App终端业务体验评测报告发布

随着移动金融服务的盛行,手机 App 炒股成为广大股民普遍的选择。股市行情变幻莫测,行情推送速度会影响到投资者的交易决策,委托下单与撤单等关键操作环节的响应性能又会极大影响投资者的收益。由此,行情数据的推送实时性和交易的快…

小程序系列--14.小程序分包

一、基础概念 1. 什么是分包 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 2. 分包的好处 3. 分包前项目的构成 4. 分包后项目的构成 5. 分包的加载规则 6. 分包的…

vue3预览pdf文件的几种方法

vue3预览pdf集中方法 方法一&#xff1a; iframe&#xff1a;这种方法显示有点丑 <iframesrc"E:\\1.pdf"frameborder"0"style"width: 80%; height: 100vh; margin: auto; display: block"></iframe>方法二&#xff1a; 展示效果&…

Objective-C方法的声明实现及调用

1.无参数的方法 1)声明 a.位置&#xff1a;在interface括弧的外面 b.语法&#xff1a; - (返回值类型)方法名称; interface Person : NSObject -(void) run; end 2)实现 a.位置&#xff1a;在implementation中实现 b.语法&#xff1a;加大括弧将方法实现的代码写在大括孤之中 …

浅出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

抽象工厂模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练习.Model.抽象工厂模式 {public abstrac…

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

Rollup:打包 TypeScript - React 组件库

调用浏览器摄像头拍照组件 1、前提1、安装依赖2、添加 rollup.config.js 配置3、修改 package.json3.1 添加打包命令3.2 添加组件入口3.3 添加组件声明入口3.4 浏览器支持 1、前提 1.1 通过 create-react-app take-photo --template 创建前端应用 1.2 添加组件 TakePhoto (拍照…

华为三层交换机之基本操作

Telnet简介 Telnet是一个应用层协议,可以在Internet上或局域网上使用。它提供了基于文本的远程终端接口&#xff0c;允许用户在本地计算机上登录到远程计算机&#xff0c;然后像在本地计算机上一样使用远程计算机的资源。Telnet客户端和服务器之间的通信是通过Telnet协议进行的…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

JavaSE基础学习

一、编程入门 二、Java语言概述 三、Java基本语法 四、程序流程控制 五、数组 六、面向对象(上) 数组工具类的封装: 七、面向对象(中) 八、面向对象(下) 九、异常处理 十、多线程 十一、常用类 十二、枚举类与注解 十三、集合 十四、泛型 十五、IO流 十六、网络编程 十七、反射…

【论文阅读】Grasp-Anything: Large-scale Grasp Dataset from Foundation Models

文章目录 Grasp-Anything: Large-scale Grasp Dataset from Foundation Models针对痛点和贡献摘要和结论引言相关工作Grasp-Anything 数据集实验 - 零镜头抓取检测实验 - 机器人评估总结 Grasp-Anything: Large-scale Grasp Dataset from Foundation Models Project page&…

【重点】【DP】123.买卖股票的最佳时机III

题目 法1&#xff1a;单次遍历&#xff0c;Best! class Solution {public int maxProfit(int[] prices) {int f1 -prices[0], f2 0, f3 -prices[0], f4 0;for (int i 1; i < prices.length; i) {f1 Math.max(f1, -prices[i]);f2 Math.max(f2, f1 prices[i]);f3 Ma…

Cesium中实现流体模拟

流体模拟 流体模拟是指通过数学模型和计算机算法来模拟流体行为的过程。它可以用来研究和预测各种液体和气体的运动、相互作用和变形。 流体模拟有多种方法&#xff0c;下面列举了几种常见的方法&#xff1a; 网格方法&#xff1a;网格方法是最常用的流体模拟方法之一。它将模…

VSCode Vue项目中报错 [vue/require-v-for-key]

报错 [vue/require-v-for-key] Elements in iteration expect to have v-bind:key directives.eslint-plugin-vue 解决办法&#xff1a; 在设置里把这个取消勾选

Java 数据库连接

1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 …

单片机14-17

目录 LCD1602 LCD1602液晶显示屏 直流电机驱动&#xff08;PWM&#xff09; LED呼吸灯 直流电机调速 AD/DA&#xff08;SPI通信&#xff09; AD模数转换 DA数模转换 红外遥控&#xff08;外部中断&#xff09; 红外遥控 红外遥控电机调速 LCD1602 LCD1602液晶显示屏 …