当前位置: 首页 > news >正文

一、在cubemx上配置sd和fatfs示例演示

一、sd和fatfs的配置流程界面

1、选择sd4bits 根据自己的sd卡的硬件插槽进行选择。

在这里插入图片描述

2、fatfs配置由于使用的是sd卡所以直接选择sd选项

在这里插入图片描述

3、程序中对sd卡的初始化需要进行改动,直接使用默认的参数sd卡是挂载不上的。

在这里插入图片描述

4、在sd卡挂载好后,就可以使用文件系统的函数进行操作了。
写入

在这里插入图片描述

读取

在这里插入图片描述
注意:f_open后写和读取要分开操作,即写完后f_close以保持写入的内容,当需要读取时重新打开文件进行读取。

调试结果显示:

在这里插入图片描述

二、sd和fatfs的配置打开dma进行处理的流程界面

在这里插入图片描述

在使用f_write和f_read时会调用disk_write和disk_read。
下图就是其调用关系,f_read同理。
在这里插入图片描述

默认的disk_write和disk_read没用使用到dma,需要自己编辑对应的dma调用函数。
在这里插入图片描述

1、重新编写disk_write和disk_read函数
DRESULT disk_write (BYTE pdrv,		/* Physical drive nmuber to identify the drive */const BYTE *buff,	/* Data to be written */DWORD sector,		/* Sector address in LBA */UINT count        	/* Number of sectors to write */
)
//{
//  DRESULT res;//  res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count);
//  return res;
//}{uint8_t res=0;  if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误		 	 switch(pdrv){case 0://SD卡res=SD_WriteDisk((uint8_t*)buff,sector,count);while(res)//写出错{MX_SDIO_SD_Init();	//重新初始化SD卡res=SD_WriteDisk((uint8_t*)buff,sector,count);	//printf("sd wr error:%d\r\n",res);}res=0;break;default:res=1; }if(res == 0x00)return RES_OK;	 else return RES_ERROR;	
} DRESULT disk_read (BYTE pdrv,		/* Physical drive nmuber to identify the drive */BYTE *buff,		/* Data buffer to store read data */DWORD sector,	        /* Sector address in LBA */UINT count		/* Number of sectors to read */
)
//{
//  DRESULT res;//  res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
//  return res;
//}
{uint8_t res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误		 	 switch(pdrv){case 0://SD卡res=SD_ReadDisk(buff,sector,count);	 while(res)//读出错{MX_SDIO_SD_Init();	//重新初始化SD卡res=SD_ReadDisk(buff,sector,count);	//printf("sd rd error:%d\r\n",res);}res=0;break;default:res=1; }if(res==0x00)return RES_OK;	 else return RES_ERROR;	   
}
2、编写写sd卡的写入操作函数
//获取SD运行状态
uint8_t SD_GetCardState(void)
{return((HAL_SD_GetCardState(&hsd)==HAL_SD_CARD_TRANSFER )?SD_TRANSFER_OK:SD_TRANSFER_BUSY);
}//写SD卡
//buf:写数据缓存区
//sector:扇区地址
//blocksize:扇区大小(一般都是512字节)
//cnt:扇区个数	
//返回值:错误状态;0,正常;其他,错误代码;	
uint8_t SD_WriteBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt)
{uint8_t err=0; uint32_t timeout=100000000;err=HAL_SD_WriteBlocks_DMA(&hsd,(uint8_t*)buf,sector,cnt);//通过DMA写SD卡n个扇区if(err==0){//等待SD卡写完while(SD_GetCardState()!=SD_TRANSFER_OK){if(timeout-- == 0){	err=SD_TRANSFER_BUSY;}} }return err;
}//写SD卡操作
//buf:写数据缓存区
//sector:扇区地址
//cnt:扇区个数	
//返回值:错误状态;0,正常;其他,错误代码;	
uint8_t SD_WriteDisk(uint8_t *buf,uint32_t sector,uint32_t cnt)
{   uint8_t sta=HAL_OK;long long lsector=sector;sta=SD_WriteBlocks_DMA((uint32_t*)buf,lsector,512,cnt);//多个sector的写操作return sta;
} 
3、编写写sd卡的读取操作函数
//通过DMA读取SD卡一个扇区
//buf:读数据缓存区
//sector:扇区地址
//blocksize:扇区大小(一般都是512字节)
//cnt:扇区个数	
//返回值:错误状态;0,正常;其他,错误代码;
uint8_t SD_ReadBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt)
{uint8_t err=0;uint32_t timeout=100000000;err=HAL_SD_ReadBlocks_DMA(&hsd,(uint8_t*)buf,sector,cnt);//通过DMA读取SD卡n个扇区if(err==0){//等待SD卡读完while(SD_GetCardState()!=SD_TRANSFER_OK){if(timeout-- == 0){	err=SD_TRANSFER_BUSY;}} }return err;
}//读SD卡
//buf:读数据缓存区
//sector:扇区地址
//cnt:扇区个数	
//返回值:错误状态;0,正常;其他,错误代码;
uint8_t SD_ReadDisk(uint8_t* buf,uint32_t sector,uint32_t cnt)
{uint8_t sta=HAL_OK;long long lsector=sector;sta=SD_ReadBlocks_DMA((uint32_t*)buf,lsector, 512,cnt);return sta;
}  

相关文章:

一、在cubemx上配置sd和fatfs示例演示

一、sd和fatfs的配置流程界面 1、选择sd4bits 根据自己的sd卡的硬件插槽进行选择。 2、fatfs配置由于使用的是sd卡所以直接选择sd选项 3、程序中对sd卡的初始化需要进行改动,直接使用默认的参数sd卡是挂载不上的。 4、在sd卡挂载好后,就可以使用文件系统…...

C++ 语言特性02 - 命名空间

一:概述 现代C中的命名空间是什么? C中的命名空间允许用户在命名空间范围内对类、方法、变量和函数等实体进行分组,而不是在全局范围内使用。这可以防止大型项目中的类、方法、函数和变量之间发生命名冲突。命名空间将开发人员编写的代码组织…...

drools规则引擎 规则配置文件drl语法使用案例

前提:环境搭建,参考博文springboot整合drools规则引擎 示例入门-CSDN博客案例1,商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分订单pojo编写 package cn.beijing.model;import lom…...

C++编程:高性能通信组件Capnproto与Protobuf的对比分析

文章目录 0. 概要1. 测试环境2. 测试方法3. 测试结果及分析3.1 延迟测试3.2 吞吐量测试3.3 稳定性测试3.4 一对二测试记录3.5 二对一测试记录3.6 Inter-process 单个点开销分析 4. CapnProto 与 Protobuf 的对比测试总结 0. 概要 本文主要探讨了两种高性能通信组件&#xff1a…...

【Python读书数据,并计算数据的相关系数、方差,均方根误差】

为了处理Python中的读书数据(假设这里指的是一系列关于书籍阅读量或评分的数据),并计算这些数据的相关系数、方差以及均方根误差(RMSE),我们首先需要明确数据的结构。这里,我将假设我们有一组关…...

垃圾收集器G1ZGC详解

G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域(Region),JVM目…...

AI芯片:高性能卷积计算中的数据复用

随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中需要优化的重点之一&a…...

gitlab修改默认访问端口

GitLab 自带了一个 Nginx 服务器实例,用于处理 HTTP 和 HTTPS 请求。这个内置的 Nginx 服务器被配置为与 GitLab 应用程序实例一起工作,并且它负责处理所有前端的网络通信。 通过yum或者apt安装Gitlab时,nginx通常是被自带安装并配置好的。 …...

python——异常

Python 中的异常及继承关系 在 Python 中,异常用于表示程序在运行过程中遇到的错误,所有异常类最终都继承自 BaseException。通过异常处理,我们可以捕获和处理这些错误,避免程序崩溃。 Python 异常继承关系图 BaseException-- …...

【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统

使用TensorFlow.js在浏览器中进行情感分析是一个非常实用的应用场景。TensorFlow.js 是一个用于在JavaScript环境中训练和部署机器学习模型的库,使得开发者能够在客户端直接运行复杂的机器学习任务。对于情感分析,我们可以使用预先训练好的模型来识别文本…...

Python——扩展数据类型

Python 的扩展数据类型是对内置数据类型的增强,旨在解决特定需求,提供更高级的功能。我们来看一些常见的扩展数据类型及其原理、用途,并通过示例逐步讲解。 1. collections.namedtuple namedtuple 是增强的元组,允许用名称访问元…...

JavaScript 详解——Vue基础

第一章 JavaScript简介 为什么学习javascript ? JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一: HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术,打造了一套智能化的生产和供应链管理系统,实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析,优化生产计划和资源配置&#…...

Git——命令集合

Git命令集合 1. 基本操作 1.1 创建版本库 初始化本地仓库:git init添加文件到仓库:git add | git add file file2… | git add.提交文件到本地仓库:git commit -m “message” 1.2 版本回退 查看状态: git status查看全部修改…...

python 数据可视化折线图练习(下:代码演示)

根据上篇对三国疫情情况数据的罗列,构建折线图完成数据展示。(示例如下) 接下来是具体代码演示 import json from pyecharts.charts import Line from pyecharts.options import TitleOpts , LegendOpts , ToolboxOpts ,VisualMapOpts , T…...

深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用

标题:深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用 引言 Go 语言自 1.18 版本起,引入了对构建信息的标准化处理,这一特性极大地简化了获取程序构建信息的过程。debug/buildinfo 包提供了访问 Go 二进制文件中嵌入…...

Nios II的BSP Editor

1.菜单打开BSP Editor (1) (2) (3) 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件,右键,Nios II -> …...

Android-自适用高度的ViewPager

需求 在项目中,我们常常遇到需要动态调整 ViewPager 的高度,以适应其内容大小的需求。默认情况下,ViewPager 的高度是固定的,无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时,出现不必要的空白区域或…...

代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分

322零钱兑换 力扣题目链接 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c…...

Cesium天空盒子(Skybox)制作(js代码)和显示

介绍 在Cesium中,星空背景是通过天空盒子方式(6张图片)来显示的,原生的图片分辨率太低,本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个),格式为jpg,总共的恒星数目约为…...

机器学习与深度学习在地球物理勘探中的应用:基于电阻率数据预测极化率模型

1. 项目概述与核心价值在花岗岩这类地质条件复杂的地区搞勘探,最头疼的就是地下情况“看不清”。传统的电阻率(ERT)和激发极化(IP)联合反演,就像用一把刻度模糊的尺子去量一块表面坑洼不平的石头——面对高…...

ARMv8 HFGITR_EL2寄存器解析与虚拟化指令陷阱控制

1. AArch64 HFGITR_EL2寄存器架构解析HFGITR_EL2(Hypervisor Fine-Grained Instruction Trap Register)是ARMv8架构中专门用于指令级陷阱控制的系统寄存器,属于虚拟化扩展的重要组成部分。这个64位寄存器通过位映射机制实现对特定AArch64指令…...

SkillVLA:通过技能复用应对双-臂操纵中的组合多样性

26年3月来自新加坡国立、北京中关村学院、上海创新研究院、上海AI实验室、上海交大和复旦的论文“SkillVLA: Tackling Combinatorial Diversity in Dual-Arm Manipulation via Skill Reuse”。 视觉-语言-动作(VLA)模型近期取得的进展,已充分…...

金融合规审核为何人力堆积却仍漏洞百出?2026年RegTech演进与Agent全链路闭环解决方案

在2026年的金融监管环境下,合规审核已不再是简单的“查漏补缺”,而是演变为一场高强度的算力与逻辑博弈。尽管金融机构在合规成本上的投入逐年攀升,甚至不惜以“人海战术”填补流程断点,但监管罚单的数额与频率却并未显著下降。这…...

基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战

1. 项目概述与核心价值大家好,我是Victor Hugo,一名电子工程师。今天我想和大家分享一个我最近完成并参与设计竞赛的项目:一个基于MAX78000 FTHR开发板的医疗紧急呼叫辅助系统。这个项目的核心,不是从零开始造一个新轮子&#xff…...

Windows开机自动全屏打开指定网页?一个快捷方式参数就搞定(Chrome/Edge/Firefox教程)

Windows开机自动全屏展示网页的终极方案每次开机都要手动打开浏览器、输入网址、切换全屏模式?这种重复操作不仅浪费时间,还容易在重要演示时手忙脚乱。想象一下:电脑启动后自动全屏显示你的仪表盘、会议日程或是监控大屏,整个过程…...

超低功耗电池电压监控电路设计:从LM324到LPV324的硬件方案优化

1. 项目概述与核心需求解析在捣鼓各种电池供电的电子设备时,无论是自己做的无线传感器节点、便携式小工具,还是给孩子改装的玩具,有一个问题总是绕不开:你怎么知道电池快没电了?总不能每次都等到设备彻底罢工&#xff…...

AutoWall终极指南:如何在Windows上轻松设置炫酷动态壁纸

AutoWall终极指南:如何在Windows上轻松设置炫酷动态壁纸 【免费下载链接】AutoWall 🌌 Live wallpapers on Windows 7/8/10/11 using open-source wallpaper engine 项目地址: https://gitcode.com/gh_mirrors/au/AutoWall 厌倦了千篇一律的静态桌…...

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

AI算法工程师必学的Python库:这10个库,AI开发必备

对于软件测试从业者来说,随着人工智能技术在测试领域的渗透越来越深——从自动化测试用例生成到缺陷智能预测,从测试结果分析到测试环境智能化调度,掌握AI开发的核心工具链已经成为从功能测试向AI测试开发、智能化测试转型的核心竞争力。Pyth…...