【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA
本篇,将使用CubeMX+Keil,创建一个SD卡的 FatFS+SDIO+DMA 文件系统读写工程。
目录
一、简述
二、CubeMX 配置 FatFS+SDIO + DMA
三、Keil 编辑代码
四、实验效果
实现效果,如下图:
一、简述
上两篇,已循序渐进讲解了SD、SDIO、基础读写、DMA读写。
这里不再啰嗦,有兴趣的可翻看之前的篇章:
1、CubeMX_STM32_SD卡_基础读写
2、CubeMX_STM32_SD卡_DMA读写
本篇,再向前一步,展示CubeMX添加 FatFs 文件系统,对SD卡进行文件方式的读写。
对于FatFs,这里只示范操作、使用,不详述背后细节原理。
SD卡的接线原画图,使用通用的接线:
二、CubeMX 配置 SDIO + DMA + FatFS
新建工程部分,略过。
- 参考1:【STM32+CubeMX】 新建一个工程(STM32F407)_stm32f407 cubemx-CSDN博客
- 参考2:【STM32+CubeMX】USART1 DMA收发、printf
- 参考3: STM32串口通信 -- bsp_UART.c 文件的移植和函数使用-CSDN博客
1、使能SDIO、DMA
- Mode : 选择 SD 4 bits Wide bus ;
- 其它参数 :F4系列不用修改配置,默认即可。F103系列,需把时钟分频系数修改为 6,即SDIOCLK Clock divide factor这一项,默认0,修改为6, 不然会通信失败。
- DMA Settings : 添加SDIO_RX、SDIO_TX这两项; 本页其它参数默认;
2、开启SDIO全局中断,修改中断优先级
3、FatFs 使能、参数配置
- Mode: 打勾 SD Card
- 参数 CODE_PAGE:简体中文
- 参数 USE_LFN:长文件名称(缓存放在STACK,因此STACK得设置大一些,如>0x1000)
- 参数 FS_EXFAT:ENABLE (挂载、格式化时,会自动选择合适的FAT16、FAT32、exFAT)
4、FatFS 使用DMA
5、FatFS 是否使用检测引脚
让我们先回看一下原理图:
SD卡座的第9脚,用于检测是否已插入SD卡,如果已插入SD卡,CD脚会输出低电平。
不建议使用这个功能!因为:SD卡与U盘不同,没有完善的保护电路,不应该进行热插拔!而且,做SD卡项目调试时,默认状态应该是一直插着SD卡的。如果项目有需要,也可以自己写几行引脚电平检测,当引脚电平为低时,再对SD卡进行操作,这样更灵活。
回到FatFs配置界面 ,下方配置里,可以设置是否使用检测引脚:
- 如果你的SD卡已连接检测引脚,想使用CubeMX生成管理,可以在这里指定引脚。
- 如果不需要这个检测功能,就让它默认空着即可。不管是否已连接此引脚,都可空着。
CubeMX生成时注意:
当不指定检测引脚,在最后生成工程时,会有弹窗警告,不用管它,到时点击Yes即可,将会正常生成工程,代码上不会有任何影响。
如果不想有弹窗,可以随便指定一个空闲的引脚,这样在生成时就不会弹警告了,但是需要在生成的工程代码里,注释掉引脚检测功能,这里不详述,可自行搜索方法。操作有点烦人,不建议此方法。
6、时钟设置
进入时钟树配置页面。
如果之前没配置过SDIO、USB,这时就会弹窗:是否自动配置所需时钟?
选择:NO ,手动修改即可。
不推荐 Yes,因为它将针对已使能的SDIO、USB进行必须值的配置,而已设置好的系统时钟,将会被修改成其它值。
F4系列,如果板子用25M晶振,使用下图配置即可;如果是8M晶振,修改晶振、分频两处为8即可。
重点:箭头所指的Q值,它用于控制USB 、SDIO和随机数生成器的时钟,这个时钟配置成 48M ! 因此,箭头的Q值设置为 7;
好了,SD卡文件系统通信所需的 SDIO + FatFS + DMA 已完成配置。
重新生成工程,这时,会有弹窗提示,因为我们没有指定SD卡的检测引脚。
点击 Yes 确认,继续生成即可!
三、Keil 编辑代码
1、打开keil 工程,先重新编译一次。
- 正常情况,编译是0 Error的。
- 如果有Error, 应该是新建工程时,路径、名称有中文了,重新开建工程,改为英文即可。
2、重要修改:SD卡的初始化,使用 1-bit 模式
CubeMX生成的SDIO初始化代码,有一个bug,需要手动修改,操作如下:
- 右击 main.c 文件中函数 MX_SDIO_SD_Init(),
- 在弹出菜单中:Go To Ddfinition Of ...; 将跳转到SD卡初始化函数内部;
跳转到 sdio.c文件的 MX_SDIO_SD_Init() 初始化函数内部后,
把下图位置中的 4B,改为 1B ;
因为初始化时,需要低速率,1线通信即可。如果不修改,初始化过程会导致程序卡死。
重要!CubeMX每次重新生成后,都要手动修改一次。
3、常用函数
我们上两篇介绍SD卡的读写时,共用过6个函数,如下表。
这6个函数,在本工程中,还是可用的。但本篇暂时用不上,这里就进行不示范了。
1、获取SD卡信息
HAL_SD_CardInfoTypeDef pCardInfo = {0}; // SD卡信息结构体
HAL_SD_GetCardInfo(&hsd, &pCardInfo); // 获取 SD 卡的信息2、读数据
HAL_SD_ReadBlocks(&hsd, aOldData, 7, 2, 3000); // SD卡的句柄、数据、块地址、块数量、超时ms3、写数据
HAL_SD_WriteBlocks(&hsd, aTestData, 7, 2, 3000) // SD卡的句柄、数据、块地址、块数量、超时ms4、读数据_DMA
HAL_SD_ReadBlocks_DMA(&hsd, aOldData, 7, 2); // 读取SD卡指定块的数据; 参数:SD句柄、数据地址、块起始地址、需要读取的块数量;5、写数据_DMA
HAL_SD_WriteBlocks_DMA(&hsd, aTestData, 7, 2); // 向指定块写入数据; 参数:SD句柄、数据地址、块起始地址、需要写入的块数量;6、擦除数据
HAL_SD_Erase(&hsd, 7, 8) // SD卡的句柄、块起始地址、块结束地址
而FatFS常用的几个操作函数,如下表:
函数参数的具体作用,可以通过 Kimi 进行查询。
FRESULT f_res;1、挂载文件系统
f_res = f_mount(&myFatFs, "0:", 1); // 在SD卡上挂载文件系统; 参数:文件系统对象、驱动器路径、读写模式(0只读、1读写)2、格式化
static uint8_t aMountBuffer[4096]; // 格式化时所需的临时缓存; 块大小512的倍数; 值越大格式化越快, 如果内存不够,可改为512或者1024; 当需要在函数内定义这种大缓存时,要用static修饰,令缓存存放在全局数据区内,不然,可能会导致stack溢出。
f_res = f_mkfs("0:", 0, 0, aMountBuffer, sizeof(aMountBuffer)); // 格式化SD卡; 参数:驱动器路径、文件系统(0自动\1FAT12\2FAT16\)、簇大小(0为自动选择)、格式化临时缓冲区、缓冲区大小3、打开文件
f_res = f_open(&myFile, "0:Test.txt", FA_CREATE_ALWAYS | FA_WRITE); // 打开文件; 参数:要操作的文件对象、路径和文件名称、打开模式;4、关闭文件
f_close(&myFile); // 不再读写,关闭文件5、文件写入数据
f_res = f_write(&myFile, aWriteBuf, sizeof(aWriteBuf), &num); // 向文件内写入数据; 参数:文件对象、数据缓存、申请写入的字节数、实际写入的字节数6、文件读取数据
f_res = f_read(&myFile, aReadData, sizeof(aReadData), &num); // 从文件中读取数据; 参数:文件对象、数据缓冲区、请求读取的最大字节数、实际读取的字节数
4、具体操作示例代码
第一步:编写FatFs的示范函数
在main()的上方,/* USER CODE BEGIN 0 */ 下面,编写以下代码(建议直接复制):
这个函数的作用是:判断是否需要格式化、挂载文件系统、创建文件、写入数据、读出数据。
// SD卡的FatFS文件系统挂载、格式化、读写测试
void FatFsTest(void)
{static FATFS myFatFs; // FatFs 文件系统对象; 这个结构体占用598字节,有点大,需用static修饰(存放在全局数据区), 避免stack溢出static FIL myFile; // 文件对象; 这个结构体占用570字节,有点大,需用static修饰(存放在全局数据区), 避免stack溢出static FRESULT f_res; // 文件操作结果static uint32_t num; // 文件实际成功读写的字节数static uint8_t aReadData[1024] = {0}; // 读取缓冲区; 这个数组占用1024字节,需用static修饰(存放在全局数据区), 避免stack溢出static uint8_t aWriteBuf[] = "测试; This is FatFs Test ! \r\n"; // 要写入的数据// 重要的延时:避免烧录期间的复位导致文件读写、格式化等错误HAL_Delay(1000); // 重要:稍作延时再开始读写测试; 避免有些仿真器烧录期间的多次复位,短暂运行了程序,导致下列读写数据不完整。// 1、挂载测试:在SD卡挂载文件系统printf("\r\n\r\n");printf("1、挂载 FatFs 测试 ****** \r\n");f_res = f_mount(&myFatFs, "0:", 1); // 在SD卡上挂载文件系统; 参数:文件系统对象、驱动器路径、读写模式(0只读、1读写)if (f_res == FR_NO_FILESYSTEM) // 检查是否已有文件系统,如果没有,就格式化创建创建文件系统{printf("SD卡没有文件系统,开始格式化…...\r\n");static uint8_t aMountBuffer[4096]; // 格式化时所需的临时缓存; 块大小512的倍数; 值越大格式化越快, 如果内存不够,可改为512或者1024; 当需要在函数内定义这种大缓存时,要用static修饰,令缓存存放在全局数据区内,不然,可能会导致stack溢出。f_res = f_mkfs("0:", 0, 0, aMountBuffer, sizeof(aMountBuffer)); // 格式化SD卡; 参数:驱动器、文件系统(0-自动\1-FAT12\2-FAT16\3-FAT32\4-exFat)、簇大小(0为自动选择)、格式化临时缓冲区、缓冲区大小; 格式化前必须先f_mount(x,x,1)挂载,即必须用读写方式挂载; 如果SD卡已格式化,f_mkfs()的第2个参数,不能用0自动,必须指定某个文件系统。if (f_res == FR_OK) // 格式化 成功{printf("SD卡格式化:成功 \r\n");f_res = f_mount(NULL, "0:", 1); // 格式化后,先取消挂载f_res = f_mount(&myFatFs, "0:", 1); // 重新挂载if (f_res == FR_OK)printf("FatFs 挂载成功 \r\n"); // 挂载成功elsereturn; // 挂载失败,退出函数}else{printf("SD卡格式化:失败 \r\n"); // 格式化 失败return;}}else if (f_res != FR_OK) // 挂载异常{printf("FatFs 挂载异常: %d; 检查MX_SDIO_SD_Init()是否已修改1B\r", f_res);return;}else // 挂载成功{if (myFatFs.fs_type == 0x03) // FAT32; 1-FAT12、2-FAT16、3-FAT32、4-exFatprintf("SD卡已有文件系统:FAT32\n");if (myFatFs.fs_type == 0x04) // exFAT; 1-FAT12、2-FAT16、3-FAT32、4-exFatprintf("SD卡已有文件系统:exFAT\n"); printf("FatFs 挂载成功 \r\n"); // 挂载成功}// 2、写入测试:打开或创建文件,并写入数据printf("\r\n");printf("2、写入测试:打开或创建文件,并写入数据 ****** \r\n");f_res = f_open(&myFile, "0:text.txt", FA_CREATE_ALWAYS | FA_WRITE); // 打开文件; 参数:要操作的文件对象、路径和文件名称、打开模式;if (f_res == FR_OK){printf("打开文件 成功 \r\n");printf("写入测试:");f_res = f_write(&myFile, aWriteBuf, sizeof(aWriteBuf), &num); // 向文件内写入数据; 参数:文件对象、数据缓存、申请写入的字节数、实际写入的字节数if (f_res == FR_OK){printf("写入成功 \r\n");printf("已写入字节数:%d \r\n", num); // printf 写入的字节数printf("已写入的数据:%s \r\n", aWriteBuf); // printf 写入的数据; 注意,这里以字符串方式显示,如果数据是非ASCII可显示范围,则无法显示}else{printf("写入失败 \r\n"); // 写入失败printf("错误编号: %d\r\n", f_res); // printf 错误编号}f_close(&myFile); // 不再读写,关闭文件}else{printf("打开文件 失败: %d\r\n", f_res);}// 3、读取测试:打开已有文件,读取其数据printf("3、读取测试:打开刚才的文件,读取其数据 ****** \r\n");f_res = f_open(&myFile, "0:text.txt", FA_OPEN_EXISTING | FA_READ); // 打开文件; 参数:文件对象、路径和名称、操作模式; FA_OPEN_EXISTING:只打开已存在的文件; FA_READ: 以只读的方式打开文件if (f_res == FR_OK){printf("打开文件 成功 \r\n");f_res = f_read(&myFile, aReadData, sizeof(aReadData), &num); // 从文件中读取数据; 参数:文件对象、数据缓冲区、请求读取的最大字节数、实际读取的字节数if (f_res == FR_OK){printf("读取数据 成功 \r\n");printf("已读取字节数:%d \r\n", num); // printf 实际读取的字节数printf("读取到的数据:%s\r\n", aReadData); // printf 实际数据; 注意,这里以字符串方式显示,如果数据是非ASCII可显示范围,则无法显示}else{printf("读取 失败 \r\n"); // printf 读取失败printf("错误编号:%d \r\n", f_res); // printf 错误编号}}else{printf("打开文件 失败 \r\n"); // printf 打开文件 失败printf("错误编号:%d\r\n", f_res); // printf 错误编号}f_close(&myFile); // 不再读写,关闭文件f_mount(NULL, "0:", 1); // 不再使用文件系统,取消挂载文件系统
}
编写完成后,位置如下图:
第二步:编写SD卡信息获取函数
在刚才函数的下方,再编写一个SD卡信息获取函数(建议直接复制)。
这个函数的作用是:获取SD卡的基础信息、块数量 、块大小、卡容量。
// 获取SD卡信息
// 注意: 本函数需要在f_mount()执行后再调用,因为CubeMX生成的FatFs代码, 会在f_mount()函数内对SD卡进行初始化
void SDCardInfo(void)
{HAL_SD_CardInfoTypeDef pCardInfo = {0}; // SD卡信息结构体uint8_t status = HAL_SD_GetCardState(&hsd); // SD卡状态标志值if (status == HAL_SD_CARD_TRANSFER){HAL_SD_GetCardInfo(&hsd, &pCardInfo); // 获取 SD 卡的信息printf("\r\n");printf("*** 获取SD卡信息 *** \r\n");printf("卡类型:%d \r\n", pCardInfo.CardType); // 类型返回:0-SDSC、1-SDHC/SDXC、3-SECUREDprintf("卡版本:%d \r\n", pCardInfo.CardVersion); // 版本返回:0-CARD_V1、1-CARD_V2printf("块数量:%d \r\n", pCardInfo.BlockNbr); // 可用的块数量printf("块大小:%d \r\n", pCardInfo.BlockSize); // 每个块的大小; 单位:字节printf("卡容量:%lluG \r\n", ((uint64_t)pCardInfo.BlockSize * pCardInfo.BlockNbr) / 1024 / 1024 / 1024); // 计算卡的容量; 单位:GB}
}
第三步:在 main()函数内,调用刚才那两个函数
调用位置,如下图:
至此,代码编写完成,可以编译、烧录了。
四、实验效果
程序运行后,串口助手输出如下:
如有错漏 ,望指正~~~!
相关文章:

【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA
本篇,将使用CubeMXKeil,创建一个SD卡的 FatFSSDIODMA 文件系统读写工程。 目录 一、简述 二、CubeMX 配置 FatFSSDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上两篇,已循序渐进讲解了SD、…...

Kotlin 2.1.0 入门教程(十)if、when
if 表达式 if 是一个表达式,它会返回一个值。 不存在三元运算符(condition ? then : else),因为 if 在这种场景下完全可以胜任。 var max aif (a < b) max bif (a > b) {max a } else {max b }max if (a > b) a…...

AJAX项目——数据管理平台
黑马程序员视频地址: 黑马程序员——数据管理平台 前言 功能: 1.登录和权限判断 2.查看文章内容列表(筛选,分页) 3.编辑文章(数据回显) 4.删除文章 5.发布文章(图片上传࿰…...

华为云搭建微信小程序商城后台
目录 安装宝塔界面 配置运行环境 1. 修改默认用户名密码 2. 修改默认端口号 3. 安装依赖软件 4. 安装商城 配置商城 1. 点击下一步进行商城环境检测 2. 将安装ShopXO成功后的弹窗信息填写到配置界面 3. 点击安装 发布小程序 源代码地址 1. 下载HBuilderX 2. 导入插…...

5、大模型的记忆与缓存
文章目录 本节内容介绍记忆Mem0使用 mem0 实现长期记忆 缓存LangChain 中的缓存语义缓存 本节内容介绍 本节主要介绍大模型的缓存思路,通过使用常见的缓存技术,降低大模型的回复速度,下面介绍的是使用redis和mem0,当然redis的语义…...

Windows下AMD显卡在本地运行大语言模型(deepseek-r1)
Windows下AMD显卡在本地运行大语言模型 本人电脑配置第一步先在官网确认自己的 AMD 显卡是否支持 ROCm下载Ollama安装程序模型下载位置更改下载 ROCmLibs先确认自己显卡的gfx型号下载解压 替换替换rocblas.dll替换library文件夹下的所有 重启Ollama下载模型运行效果 本人电脑配…...

代码随想录day09
151.反转字符串中的单词,需二刷 //先去除多余空格,再反转所有字符,再反转单词,即可反转字符串中的单词 void removeWhiteSpace(string& s){int slowIndex 0;for(int fastIndex 0; fastIndex < s.size(); fastIndex){if(…...

Racecar Gym 总结
1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台,提供 Gymnasium(OpenAI Gym) 接口,主要用于强化学习(Reinforcement Learning, RL)、多智能体竞速(Multi-Ag…...

【C++高并发服务器WebServer】-15:poll、epoll详解及实现
本文目录 一、poll二、epoll2.1 相对poll和select的优点2.2 epoll的api2.3 epoll的demo实现2.5 epoll的工作模式 一、poll poll是对select的一个改进,我们先来看看select的缺点。 我们来看看poll的实现。 struct pollfd {int fd; /* 委托内核检测的文件描述符 */s…...

Visual Studio 2022 中使用 Google Test
要在 Visual Studio 2022 中使用 Google Test (gtest),可以按照以下步骤进行: 安装 Google Test:确保你已经安装了 Google Test。如果没有安装,可以通过 Visual Studio Installer 安装。在安装程序中,找到并选择 Googl…...

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!
在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…...

Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

操作系统—进程与线程
补充知识 PSW程序状态字寄存器PC程序计数器:存放下一条指令的地址IR指令寄存器:存放当前正在执行的指令通用寄存器:存放其他一些必要信息 进程 进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位…...

团队:前端开发工期参考 / 防止工期不足、过足、工期打架
一、前端开发工期参考 序号功能 / 模块 / 页面 / 描述pc端(数值为比例)小程序端(数值为比例)1简单页面 / 常规页面1:12复杂页面(功能复杂 / 逻辑复杂)1:1.5 / 1:2 / …...

APL语言的云计算
APL语言的云计算:一种灵活而高效的编程方式 引言 随着信息技术的迅猛发展,云计算已经成为现代计算的重要组成部分。云计算不仅带来了计算资源的高效利用,也引发了新一轮的技术革命。在这个背景下,APL(A Programming …...

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...

C++拷贝构造函数与运算符重载应该注意的一个问题?
看下面的例子: class TestClass { public:char* _pdata;size_t _nLength;public:TestClass(const TestClass& other) {_nLength other._nLength;_pdata new char[_nLength];memcpy((void*)_pdata,other._pdata, _nLength 1);}TestClass(const char* pstr) {…...

[7] 游戏机项目说明
[7] 游戏机项目说明 在这节课中,我们将学习如何基于FreeRTOS开发一个简单的游戏项目。我们会使用一个开源项目nwatch,它是一个基于STM32的开源手表,包含了三个游戏。我们的目标是将这个游戏移植到我们的开发板上,并逐步使用FreeR…...

“深入浅出”系列之C++:(20)C++17
C17的新拓展 并行算法: C17引入了并行STL算法,允许使用多个线程并行处理元素,提高了在多核系统上的性能。 示例代码:std::sort(std::execution::par, v.begin(), v.end()); 类模板参数推导(CTAD)&#…...

.net一些知识点5
1.dot Net带out的参数如何使用 string name;//假设这个参数带out TestMethod(1,out name);//一定要有out 方法体中,一定要有out参数的赋值,并且能输出 2.参数的传递方式有哪些 a.值传递 b.引用传递 ref c.输出传递 out 3.设计模式知道哪些 3.us…...

(七)QT——消息事件机制&绘图&文件
目录 前言 消息事件机制 (Event System) 绘图 (Graphics & Drawing) 绘图设备 Qt 提供的主要绘图设备 Qt 主要绘图设备的特点 各个绘图设备的详细介绍 文件处理 (File Handling) 总结 前言 QT 是一个非常强大的图形用户界面(GUI)开发框架&…...

【虚幻引擎UE】AOI算法介绍与实现案例
【虚幻引擎UE】AOI算法介绍与实现 一、AOI算法介绍AOI算法的典型应用场景二、AOI相关算法1. 边界框法(Bounding Box Method)2. 动态AOI算法3. 布尔运算(Boolean Operations)4. 四叉树(Quadtree)5. R树(R-Tree)6. 圆形AOI算法7. 网格分割(Grid Partitioning)8. 多边形…...

python学opencv|读取图像(六十)先后使用cv2.erode()函数和cv2.dilate()函数实现图像处理
【1】引言 前序学习进程中,先后了解了使用cv2.erode()函数和cv2.dilate()函数实现图像腐蚀和膨胀处理的效果,相关文章链接为: python学opencv|读取图像(五十八)使用cv2.erode()函数实现图像腐蚀处理-CSDN博客 pytho…...

AI能帮谷歌SEO做什么?
现在没用过AI写内容的人,应该不多了,用ChatGPT写文章,用MidJourney画图,用各种工具做调研,AI已经成为SEO玩家的“标配”。但AI到底能帮SEO做到什么?省钱?省时间?还是更重要的东西&am…...

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现
SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来(优…...

【机器学习】数据预处理之数据归一化
数据预处理之数据归一化 一、摘要二、数据归一化概念三、数据归一化实现方法3.1 最值归一化方法3.2 均值方差归一化方法 一、摘要 本文主要讲述了数据归一化(Feature Scaling)的重要性及其方法。首先通过肿瘤大小和发现时间的例子,说明了不同…...

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p39630 在科技飞速发展的当下,人工智能代理正经历着深刻的变革,其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行,到如今复杂的自主决策与多智能体协作,人工智能代理…...

非递减子序列(力扣491)
这道题的难点依旧是去重,但是与之前做过的子集类问题的区别就是,这里是求子序列,意味着我们不能先给数组中的元素排序。因为子序列中的元素的相对位置跟原数组中的相对位置是一样的,如果我们改变数组中元素的顺序,子序…...

网站快速收录策略:提升爬虫抓取效率
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/102.html 要实现网站快速收录并提升爬虫抓取效率,可以从以下几个方面入手: 一、优化网站结构与内容 清晰的网站结构 设计简洁明了的网站导航,确保爬虫…...

系统思考—自我超越
“人们往往认为是个人的能力限制了他们,但事实上,是组织的结构和惯性思维限制了他们的潜力。”—彼得圣吉 最近和一家行业隐形冠军交流,他们已经是领域第一,老板却依然要求:核心团队都要自我超越,攻坚克难…...