Stm32CubeMx 通过SPIflash做一个U盘
这是一个卑微电子信息学员的开始
学习stm32
寒假开始了,卑微电子信息学员开始了stm32的学习过程。
SPI flash的注意事项
一. 擦除操作
- 以W25X16为例,最小Sector Erase 4KB(4096B),最大擦除全部文件,而做U盘时,每次的传输文件写入的大小为512B;
- 擦除需要时间,函数执行完毕不等于擦除操作完毕,当擦除操作未执行完整就进行其他操作会发生错误;
二. 写入操作
- 以W25X16为例,单次写入最大256B,当给出的长度超过256B时,会从开头开始覆盖先前写入的内容;
- 写入需要时间,函数执行完毕不等于写入操作完毕,当擦除操作未执行完整就进行其他操作会发生错误;
三.读数据操作
- 以W25X16为例,读数据的长度没有限制,只要你给函数的指针指向的空间有足够大的空间,就可以完成读数据操作;
- 读数据在任何时间都可以进行,速度远大于写或者擦除的速度,不用担心发生出错,是一个比较令人安心的函数;
容易遇到的问题
一.擦除的空间大于写入的空间
- 以W25X16为例,单次擦除至少4K,而写入是512B,众所周知,在进行SPI写入操作前,要进行写入操作的地址必须是被擦除过的地址,不然会无法写入;
- 就我个人而言,有两种思路:方法一.在每次写入前先读4KB的内容将其储存到一个数组中,再进行4KB的擦除,然后将要写入SPI的内容写到数组中,在将数组中的内容写入flash---------------------------------------------------我是分割线------------------------方法二 .在写入前先读4KB的内容将其储存到一个数组中,再进行4KB的擦除,然后将要写入SPI的内容写到数组中,不立即将数组中的内容跟新到flash,进行下一次写入操作,然后判断第二次写入的地址(512B)是否在前一次擦除的地址(4KB)内,如果在,将它赋值给数组,反之,将数组的内容更新到flash,再读4KB,擦除4KB进行循环
二.单次写入的内容只有256B而U盘单次写入512B
- 以W25X16为例,单次写入最大256B,想要写入更多的内容,之可以进行多次写入操作,这个比较简单,不多解释;
三.擦除操作的地址
- 以W25X16为例,擦除操作(4KB的)需要传入3BYTE的地址,但其实因为扇区的地址大小为4KB,不是任何的地址都可以作为扇区地址使用,必须是4KB(4096即0x1000)的整数倍;
- 给一个简单计算扇区首地址的简单是算法:(STORAGE_BLK_SIZ*blk_addr)&0xFFFFF000 其中STORAGE_BLK_SIZ定义为512,blk_addr为uint16_t类型的变量,表示当前的扇区号;
四.SPI函数
- SPi函数较上一次的函数做了一些改变,在地址的方面可以直接传输uint32_t的数据,更加方便计算,在函数的结尾都增加了检验该操作是否完成的语句,使该操作真正执行完才会进入下一个操作;
五.读操作
- 如果选用第一种方案,这个不用注意,该读什么读什么,但是,如果选用了第二种方案,读函数需要判断当前读的数据是在数组中还是在flash中,会麻烦一点,代码在最后面;
我用了第二种方案
因为第一种方案我开始也写了,但是因为实在效率低下,开始的时候应为在Cube中传输速度设定的太慢,导致格式化时间过长,格式化失败;后来提高传输速度勉强格式化成功,方法二的效率大约是方法一的8倍,所以我推荐在算法方面比较优秀的程序员选择第二中算法;
先给出经过改进后的SPIflash函数:
和上次一样,有需要源代码的可以留言(我不知道怎么放代码)
然后是对U盘调用的两个读写函数的修改:
读和写的地址真的很重要,只要错一个地址基本上格式化就不会成功,我被其中的一个地址坑了好久,最后调试的时候很久才发现;
最后,这个代码有一个缺陷就是最后的一个传输的数据会储存在数组中,而不是在flash中,这就会产生掉电数据会损坏的问题,现阶段的解决方法是在main函数中一直判断是否在进行写入操作,如果发现有一段时间没有进行写入操作就将最后的几个数据写入flash,但是这样可能在写入的时候刚好U盘被拔出或者有新的数据传入,会发生冲突,希望有大佬可以帮我解答一下这一关问题,或者有更加好的想法,感激不尽;
本文仅供学习使用,希望可以对您的学习有帮助,大家除夕快乐(在除夕写的)!!
Stm32CubeMx 通过SPIflash做一个U盘相关推荐
- 给自己的电脑做一个O盘 -隐藏自己私密的东
给自己的电脑做一个O盘 -隐藏自己私密的东西 Post By:2009-7-16 16:26:00 @ECHO OFF MD E:\RECYCLED\UDrives.{25336920-03F9-11 ...
- [STM32F103C8] 做一个U盘
1.下载例程 STM32 实现U盘功能 USB-Mass_Storage https://download.csdn.net/download/plm4662694/9500138 2.修改一下宏定义 ...
- 做一个“盯盘机器人”,实时监控股票价格并通知你!
在量化交易方面,通过计算机程序自动实现股票盯盘与找到买卖信号,应该是很多人都比较向往的吧.但九层之台,起于累土,千里之行,始于足下,只有打下坚实的基础,将各个知识点逐一突破后加以综合运用,才能构建自己 ...
- 试着用U盘做一个微PE启动盘
这次老师让做一个启动盘,之前并没有了解过什么是启动盘,也不知道他是干什么的,更不知道怎么做. 然后就百度了一下,网络上有很多声音,主流一点的就是大白菜和老毛桃.同时骂这两个的也很多,说他们是流氓,会捆 ...
- 从底层分区开始做一个干净的Windows10
从底层分区开始做一个干净的Windows10 文章目录 从底层分区开始做一个干净的Windows10 写在前面 1.前期准备 1.1在BIOS中查询一个数据 1.2去官网上下载制作工具. 1.3制作w ...
- windows 只能同时 启动一个_一个u盘能否刻入win 7、win10等多个系统?该怎么做?...
一个u盘里是否可以刻入win 7.win10等多个系统iso?如果是制作U盘系统(口袋系统)的话,那只能安装一个windows系统,如:通过win to go这个工具来制作U盘系统:如果只是把U盘当成 ...
- 自己动手做一个绿色便携版的谷歌浏览器Chrome,可以放入U盘随意带走的
鉴于很多浏览器流氓而且广告又太多,所以无法自拔的用上了谷歌浏览器,但是经常的换电脑又无法保存自己的浏览器使用习惯和收藏数据,这个时候就想到有绿色的版的谷歌浏览器,但是找了很多网上的资源,软件,都不太满 ...
- 用U盘做一个即插即用的unbuntu20系统
用U盘做一个即插即用的unbuntu20系统 前言 因为常规安装方法会和硬件绑定,所以你在移动硬盘.U盘烧录了一个unbuntu,换一个系统就用不了.会很麻烦.所以这里用VMware做一个随身可带的系 ...
- 服务器能否只做c盘系统,我的云服务器只有一个c盘
我的云服务器只有一个c盘 内容精选 换一换 检查Pkey是否一致.查看弹性云服务器内部分配到的Pkey:cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/* ...
最新文章
- Linux CPU数量判断命令
- 编写优质代码的 6 大关键方法
- 破解网页禁止使用“复制”、“粘贴“
- go语言搭建代理服务器_Go实现Https代理服务
- NFS介绍、NFS服务端配置安装配置、 NFS配置选项、 客户端的配置
- 新手如何使用有三AI系统性跟读AI领域的论文
- 10个奇幻的HTML5和Javascript效果
- pandas describe函数_SQL和Pandas同时掉到河里,你先救谁?
- 两种实现简单cp的方法
- 我的ubunt开发环境 (操作备份)
- valueOf()和toString()详解
- 文本显示变量_易标签使用Excel数据实现批量打印变量数据
- Linux配置本地端口映射
- 深度学习和机器学习的相关资料
- 推荐一款很好用的图床工具picgo
- 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」
- Unity Android Unable to load resource的问题
- 【VHDL语言学习笔记(二)】 4位向量加法器
- 我们造出了打破次元壁的锤子,然后呢?
- Java实现蓝桥杯勇者斗恶龙