一、什么是准备Flash

FLASH闪存是属于内存器件的一种,"Flash"。闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存。

闪存的物理特性与常见的内存有根本性的差异:

闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

NOR和NAND是市场上两种主要的非易失闪存技术。

在1984年,东芝公司的发明人舛冈富士雄首先提出了快速闪存存储器(此处简称闪存)的概念。与传统电脑内存不同,闪存的特点是NVM,其记录速度也非常快。

Intel是世界上第一个生产闪存并将其投放市场的公司。1988年,公司推出了一款256K bit闪存芯片。它如同鞋盒一样大小,并被内嵌于一个录音机里。後来,Intel发明的这类闪存被统称为NOR闪存。它结合EPROM和EEPROM两项技术,并拥有一个SRAM接口。

第二种闪存称为NAND闪存。它由日立公司于1989年研制,并被认为是NOR闪存的理想替代者。NAND闪存的写周期比NOR闪存短90%,它的保存与删除处理的速度也相对较快。NAND的存储单元只有NOR的一半,在更小的存储空间中NAND获得了更好的性能。鉴于NAND出色的表现,它常常被应用于诸如CompactFlash、SmartMedia、 SD、 MMC、 xD、 and PC cards、USB sticks等存储卡上。

NAND 闪存的存储单元采用串行结构,存储单元的读写是以页和块为单位来进行(一页包含若干字节,若干页则组成储存块, NAND 的存储块大小为 8 到 32KB ),这种结构最大的优点在于容量可以做得很大,超过 512MB 容量的 NAND 产品相当普遍, NAND 闪存的成本较低,有利于大规模普及。

NAND 闪存的缺点在于读速度较慢,它的I/O端口只有 8 个,比 NOR 要少多了。这区区 8 个 I/O 端口只能以信号轮流传送的方式完成数据的传送,速度要比 NOR 闪存的并行传输模式慢得多。再加上 NAND 闪存的逻辑为电子盘模块结构,内部不存在专门的存储控制器,一旦出现数据坏块将无法修,可靠性较 NOR 闪存要差。

二、创建STM32工程文件

首先打开STM32CUBEMX:

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元

 

配置一下定时器,下方的警告信息可以不需要理会

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_02

 

 打开时钟的配置信息

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_03

 

 

配置时钟频率

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_04

将PC13设置为

 

 

 

设置堆栈大小为4k,生成文件

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_05

 

三、配置keil

将flash.c和flash.h添加到工程中
添加flash.c的时候选第二行

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_06

 

 

/*在main.c中添加flash.h*/

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_07

 

 在main.c中分别添加如下代码

uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
uint8_t i;
uint8_t FlashTest[] = "Hello This is ZhangShiSan Flash Test DEMO";

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_08

 

 

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_09

 

 点击选择options

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_10

 

 

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_11

 

 

 然后将代码烧录进硬件里头

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_12

 

 然后我们进入debug模块,在view下打开memory1窗口

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_13

 

打开watch1窗口

 

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_数据_14

 

 开启变量自动更新Periodic Windows Update

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_闪存_15

 

 将变量FlashWBuff 和 FlashRBuff加入到 Watch1

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_数据_16

 

在memory1中输入要观察的地址0x800c000

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_17

 

 运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样

 

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_18

 

 定义好的句子写到了地址0x0800c000中了

stm32f407 FLASH_EraseSector函数报错 stm32 nor flash_存储单元_19

 

 

四、心得体会

在老师和同学帮助下完成了Flash读写的实验,其中使用了同学的案例程序。Flash的读取和SD卡读取有所不同,虽然过程中遇到了一些问题,但是很快的就得以解决,在本次实验中我学会了如何读取Flash,受益匪浅,提高了我的动手能力。