这是一个卑微电子信息学员的开始

学习stm32

寒假开始了,卑微电子信息学员开始了stm32的学习过程。

SPI flash的注意事项

一. 擦除操作

  1. 以W25X16为例,最小Sector Erase 4KB(4096B),最大擦除全部文件,而做U盘时,每次的传输文件写入的大小为512B;
  2. 擦除需要时间,函数执行完毕不等于擦除操作完毕,当擦除操作未执行完整就进行其他操作会发生错误;

二. 写入操作

  1. 以W25X16为例,单次写入最大256B,当给出的长度超过256B时,会从开头开始覆盖先前写入的内容;
  2. 写入需要时间,函数执行完毕不等于写入操作完毕,当擦除操作未执行完整就进行其他操作会发生错误;

三.读数据操作

  1. 以W25X16为例,读数据的长度没有限制,只要你给函数的指针指向的空间有足够大的空间,就可以完成读数据操作;
  2. 读数据在任何时间都可以进行,速度远大于写或者擦除的速度,不用担心发生出错,是一个比较令人安心的函数;

容易遇到的问题

一.擦除的空间大于写入的空间

  1. 以W25X16为例,单次擦除至少4K,而写入是512B,众所周知,在进行SPI写入操作前,要进行写入操作的地址必须是被擦除过的地址,不然会无法写入;
  2. 就我个人而言,有两种思路:方法一.在每次写入前先读4KB的内容将其储存到一个数组中,再进行4KB的擦除,然后将要写入SPI的内容写到数组中,在将数组中的内容写入flash---------------------------------------------------我是分割线------------------------方法二 .在写入前先读4KB的内容将其储存到一个数组中,再进行4KB的擦除,然后将要写入SPI的内容写到数组中,不立即将数组中的内容跟新到flash,进行下一次写入操作,然后判断第二次写入的地址(512B)是否在前一次擦除的地址(4KB)内,如果在,将它赋值给数组,反之,将数组的内容更新到flash,再读4KB,擦除4KB进行循环

二.单次写入的内容只有256B而U盘单次写入512B

  1. 以W25X16为例,单次写入最大256B,想要写入更多的内容,之可以进行多次写入操作,这个比较简单,不多解释;

三.擦除操作的地址

  1. 以W25X16为例,擦除操作(4KB的)需要传入3BYTE的地址,但其实因为扇区的地址大小为4KB,不是任何的地址都可以作为扇区地址使用,必须是4KB(4096即0x1000)的整数倍;
  2. 给一个简单计算扇区首地址的简单是算法:(STORAGE_BLK_SIZ*blk_addr)&0xFFFFF000 其中STORAGE_BLK_SIZ定义为512,blk_addr为uint16_t类型的变量,表示当前的扇区号;

四.SPI函数

  1. SPi函数较上一次的函数做了一些改变,在地址的方面可以直接传输uint32_t的数据,更加方便计算,在函数的结尾都增加了检验该操作是否完成的语句,使该操作真正执行完才会进入下一个操作;

五.读操作

  1. 如果选用第一种方案,这个不用注意,该读什么读什么,但是,如果选用了第二种方案,读函数需要判断当前读的数据是在数组中还是在flash中,会麻烦一点,代码在最后面;

我用了第二种方案

因为第一种方案我开始也写了,但是因为实在效率低下,开始的时候应为在Cube中传输速度设定的太慢,导致格式化时间过长,格式化失败;后来提高传输速度勉强格式化成功,方法二的效率大约是方法一的8倍,所以我推荐在算法方面比较优秀的程序员选择第二中算法;
先给出经过改进后的SPIflash函数:




和上次一样,有需要源代码的可以留言(我不知道怎么放代码)
然后是对U盘调用的两个读写函数的修改:


读和写的地址真的很重要,只要错一个地址基本上格式化就不会成功,我被其中的一个地址坑了好久,最后调试的时候很久才发现;
最后,这个代码有一个缺陷就是最后的一个传输的数据会储存在数组中,而不是在flash中,这就会产生掉电数据会损坏的问题,现阶段的解决方法是在main函数中一直判断是否在进行写入操作,如果发现有一段时间没有进行写入操作就将最后的几个数据写入flash,但是这样可能在写入的时候刚好U盘被拔出或者有新的数据传入,会发生冲突,希望有大佬可以帮我解答一下这一关问题,或者有更加好的想法,感激不尽;
本文仅供学习使用,希望可以对您的学习有帮助,大家除夕快乐(在除夕写的)!!

Stm32CubeMx 通过SPIflash做一个U盘相关推荐

  1. 给自己的电脑做一个O盘 -隐藏自己私密的东

    给自己的电脑做一个O盘 -隐藏自己私密的东西 Post By:2009-7-16 16:26:00 @ECHO OFF MD E:\RECYCLED\UDrives.{25336920-03F9-11 ...

  2. [STM32F103C8] 做一个U盘

    1.下载例程 STM32 实现U盘功能 USB-Mass_Storage https://download.csdn.net/download/plm4662694/9500138 2.修改一下宏定义 ...

  3. 做一个“盯盘机器人”,实时监控股票价格并通知你!

    在量化交易方面,通过计算机程序自动实现股票盯盘与找到买卖信号,应该是很多人都比较向往的吧.但九层之台,起于累土,千里之行,始于足下,只有打下坚实的基础,将各个知识点逐一突破后加以综合运用,才能构建自己 ...

  4. 试着用U盘做一个微PE启动盘

    这次老师让做一个启动盘,之前并没有了解过什么是启动盘,也不知道他是干什么的,更不知道怎么做. 然后就百度了一下,网络上有很多声音,主流一点的就是大白菜和老毛桃.同时骂这两个的也很多,说他们是流氓,会捆 ...

  5. 从底层分区开始做一个干净的Windows10

    从底层分区开始做一个干净的Windows10 文章目录 从底层分区开始做一个干净的Windows10 写在前面 1.前期准备 1.1在BIOS中查询一个数据 1.2去官网上下载制作工具. 1.3制作w ...

  6. windows 只能同时 启动一个_一个u盘能否刻入win 7、win10等多个系统?该怎么做?...

    一个u盘里是否可以刻入win 7.win10等多个系统iso?如果是制作U盘系统(口袋系统)的话,那只能安装一个windows系统,如:通过win to go这个工具来制作U盘系统:如果只是把U盘当成 ...

  7. 自己动手做一个绿色便携版的谷歌浏览器Chrome,可以放入U盘随意带走的

    鉴于很多浏览器流氓而且广告又太多,所以无法自拔的用上了谷歌浏览器,但是经常的换电脑又无法保存自己的浏览器使用习惯和收藏数据,这个时候就想到有绿色的版的谷歌浏览器,但是找了很多网上的资源,软件,都不太满 ...

  8. 用U盘做一个即插即用的unbuntu20系统

    用U盘做一个即插即用的unbuntu20系统 前言 因为常规安装方法会和硬件绑定,所以你在移动硬盘.U盘烧录了一个unbuntu,换一个系统就用不了.会很麻烦.所以这里用VMware做一个随身可带的系 ...

  9. 服务器能否只做c盘系统,我的云服务器只有一个c盘

    我的云服务器只有一个c盘 内容精选 换一换 检查Pkey是否一致.查看弹性云服务器内部分配到的Pkey:cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/* ...

最新文章

  1. Linux CPU数量判断命令
  2. 编写优质代码的 6 大关键方法
  3. 破解网页禁止使用“复制”、“粘贴“
  4. go语言搭建代理服务器_Go实现Https代理服务
  5. NFS介绍、NFS服务端配置安装配置、 NFS配置选项、 客户端的配置
  6. 新手如何使用有三AI系统性跟读AI领域的论文
  7. 10个奇幻的HTML5和Javascript效果
  8. pandas describe函数_SQL和Pandas同时掉到河里,你先救谁?
  9. 两种实现简单cp的方法
  10. 我的ubunt开发环境 (操作备份)
  11. valueOf()和toString()详解
  12. 文本显示变量_易标签使用Excel数据实现批量打印变量数据
  13. Linux配置本地端口映射
  14. 深度学习和机器学习的相关资料
  15. 推荐一款很好用的图床工具picgo
  16. 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」
  17. Unity Android Unable to load resource的问题
  18. 【VHDL语言学习笔记(二)】 4位向量加法器
  19. 我们造出了打破次元壁的锤子,然后呢?
  20. Java实现蓝桥杯勇者斗恶龙

热门文章

  1. windows中ncdu替代者TreeSize
  2. Adobe Lightroom Classic 入门教程(六)修改照片 --- 镜头配置文件与变换
  3. html 苹果6尺寸,iPhone6/6 Plus的长度多少厘米?宽度多少厘米?
  4. C++入门基础(下)
  5. hx711称重模块调试
  6. Dobot Magician 机器臂-简介
  7. 4.GraphPad常见统计分析方法
  8. cms的全部配置过程及安装包下载,简单,全面
  9. Linux下C++编程基础
  10. 全力以赴提升粮食产能建设责任担当