0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32入门学习笔记之外置FLASH读写实验(上)

jf_78858299 来源:滑小稽笔记 作者:电子技术园地 2023-02-16 14:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

15.1 FLASH

Flash,全名叫做Flash EEPROM Memory,即平时所说的“闪存”,它结合了ROM和RAM的长处,不仅可以反复擦除,还可以快速读取数据,STM32运行的程序其实就是存放在Flash当中,但是由于STM32的Flash一般1M左右,只能存储程序大小的数据,所以往往需要外扩Flash来存储数据,比如LCD界面当中的汉字字库,以及文件系统中读取的文件内容。

但是一般Flash的擦除次数有限制,STM32F1系列最新的文档指出,片内的FLASH擦写次数大约在1W次左右,所以一般Flash用于擦除次数不多,但是数据量很大的场合。

这个Flash读写实验我们用到的芯片是W25Q128,这是一款采用SPI协议进行读写的Flash芯片,存储容量为128Mbit,合计16Mbyte,工作电压2.7V~3.6V。这个实验我们采用STM32内置的SPI模块来进行对芯片的读写操作,STM32F1的SPI功能很强大,SPI时钟最高可以到18MHz,支持DMA,可以配置为SPI协议或者I2S协议。

15.2 硬件SPI模块

通过之前51单片机开发我们可以知道,SPI协议一共需要四根线来完成数据通信,即片选CS,总线时钟SCK,主机输入从机输出MISO和主机输出从机输入MOSI四根数据线。STM32的内部SPI模块结构框图如下图所示。

图片

从上面的结构框图我们可以发现,硬件SPI的优势就在于开发者不需要考虑SPI的详细参数以及时序,只需要配置内部的寄存器,设置速率,电平就可以实现SPI通信。

15.3 相关寄存器

15.3.1 SPI控制寄存器1:SPIx_CR1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
BIDIMODE BIDIOE CRCEN CRCNEXT DFF RXONLY SSM SSI LSBFIRST SPE BR[2:0] MSTR CPOL CPHA

Bit 15:双向数据模式使能

0:选择双线双向模式

1:选择单线双向模式

Bit 14:双向模式下的输出使能

0:输出禁止(只收模式)

1:输出使能(只发模式)

Bit 13:硬件CRC校验使能

0:禁止CRC计算

1:启动CRC计算

Bit 12:下一个发送CRC

0:下一个发送的值来自发送缓冲区

1:下一个发送的值来自发送CRC寄存器

Bit 11:数据帧格式

0:使用8位数据帧格式进行发送/接收

1:使用16位数据帧格式进行发送/接收

Bit 10:只接收

0:全双工(发送和接收)

1:禁止输出(只接收模式)

Bit 9:软件从设备管理

0:禁止软件从设备管理

1:启用软件从设备管理

Bit 8:内部从设备选择

注:该位只在SSM位为1时有意义。它决定了NSS上的电平,在NSS引脚上的I/O操作无效

Bit 7:帧格式

0:先发送MSB

1:先发送LSB

Bit 6:SPI使能

0:禁止SPI设备

1:开启SPI设备

Bit 5~Bit 3:波特率控制

000:f PCLK /2

001:f PCLK /4

010:f PCLK /8

011:f PCLK /16

100:f PCLK /32

101:f PCLK /64

110:f PCLK /128

111:f PCLK /256

Bit 2:主设备选择

0:配置为从设备

1:配置为主设备

Bit 1:时钟极性

0:空闲状态时,SCK保持低电平

1:空闲状态时,SCK保持高电平

Bit 0:时钟相位

0:数据采样从第一个时钟边沿开始

1:数据采样从第二个时钟边沿开始

15.3.2 SPI状态寄存器:SPIx_SR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- BSY OVR MODF CRCERR UDR CHSIDE TXE RXNE

Bit 7:忙标志

0:SPI不忙

1:SPI正忙于通信,或者发送缓冲非空

Bit 6:溢出标志

0:没有出现溢出错误

1:出现溢出错误

Bit 5:模式错误(在SPI模式下不使用)

0:没有出现模式错误

1:出现模式错误

Bit 4:CRC错误标志(在SPI模式下不使用)

0:收到的CRC值和SPI_RXCRCR寄存器中的值匹配

1:收到的CRC值和SPI_RXCRCR寄存器中的值不匹配

Bit 3:下溢标志位(在SPI模式下不使用)

0:未发生下溢

1:发生下溢

Bit 2:声道(在SPI模式下不使用)

0:需要传输或者接收左声道

1:需要传输或者接收右声道

Bit 1:发送缓冲为空

0:发送缓冲非空

1:发送缓冲为空

Bit 0:接收缓冲非空

0:接收缓冲为空

1:接收缓冲非空

15.4 实验例程

功能:在Flash中写入一段字符串,而后读出来并显示在TFTLCD上。

(1)创建w25q128.h并输入以下代码。

/*********************************************************************************************************
                FLASH    驱    动    文    件
*********************************************************************************************************/
#ifndef _W25Q128_H_
#define _W25Q128_H_


#include "sys.h"
/*********************************************************************************************************
                  端    口    定    义
*********************************************************************************************************/
#define  W25QXX_CS  PBout( 12 )                                      //W25QXX的片选信号
/*********************************************************************************************************
                  数    据    定    义
*********************************************************************************************************/
//SPI总线速度设置
#define SPI_SPEED_2       0
#define SPI_SPEED_4       1
#define SPI_SPEED_8       2
#define SPI_SPEED_16      3
#define SPI_SPEED_32     4
#define SPI_SPEED_64     5
#define SPI_SPEED_128     6
#define SPI_SPEED_256     7
//指令表
#define W25X_WriteEnable    0x06
#define W25X_WriteDisable    0x04
#define W25X_ReadStatusReg    0x05
#define W25X_WriteStatusReg    0x01
#define W25X_ReadData      0x03
#define W25X_FastReadData    0x0B
#define W25X_FastReadDual    0x3B
#define W25X_PageProgram    0x02
#define W25X_BlockErase      0xD8
#define W25X_SectorErase    0x20
#define W25X_ChipErase      0xC7
#define W25X_PowerDown      0xB9
#define W25X_ReleasePowerDown  0xAB
#define W25X_DeviceID      0xAB
#define W25X_ManufactDeviceID  0x90
#define W25X_JedecDeviceID    0x9F
/*********************************************************************************************************
                  函    数    列    表
*********************************************************************************************************/
void W25QXX_Init( void ) ;                                        //初始化Flash
void W25QXX_Read( u8* pBuffer, u32 Address, u16 Len ) ;                          //读取Flash
void W25QXX_Write( u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite ) ;                  //写入Flash
void W25QXX_Erase_Chip( void ) ;                                    //整片擦除
void W25QXX_Erase_Sector( u32 Dst_Addr ) ;                                //扇区擦除


#endif
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45335

    浏览量

    663305
  • FlaSh
    +关注

    关注

    10

    文章

    1715

    浏览量

    154666
  • ROM
    ROM
    +关注

    关注

    4

    文章

    578

    浏览量

    88530
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371053
  • EEPROM
    +关注

    关注

    9

    文章

    1129

    浏览量

    85509
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32入门学习笔记之外置FLASH读写实验(下)

    Flash,全名叫做Flash EEPROM Memory,即平时所说的“闪存”,它结合了ROM和RAM的长处,不仅可以反复擦除,还可以快速读取数据,STM32运行的程序其实就是存放在Flas
    的头像 发表于 02-16 14:13 2091次阅读

    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-SD卡读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD卡读写实
    的头像 发表于 05-18 09:36 2553次阅读
    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-SD卡<b class='flag-5'>读写实验</b>

    如何对扩展存储器进行读写实验

    扩展存储器读写实验的目的是什么?怎样去设计一种扩展存储器读写的电路?扩展存储器读写实验的流程有哪些?
    发表于 07-14 07:04

    如何通过对flash读写实stm32的编程操作?

    如何通过对flash读写实stm32的编程操作?
    发表于 10-29 06:19

    接触式IC卡读写实验

    接触式IC卡读写实验 一. 实验目的了解接触式IC 卡的知识,
    发表于 09-22 17:20 5148次阅读
    接触式IC卡<b class='flag-5'>读写实验</b>

    AVR内部EEPROM读写实验

    片内EEPROM读写实险。 1、用内部EEPROM记录CPU启动次数,并在PB口上显示出来。 2、内部1 M晶振,程序采用单任务方式,软件延时。 3、进行此实验
    发表于 06-30 11:25 2799次阅读

    STM32Flash读写一些重要知识

    STM32Flash读写的一些重要知识
    的头像 发表于 03-06 14:54 1.2w次阅读

    STM32_ SPI读写Flash

    STM32_SPI读写Flash
    的头像 发表于 04-08 10:26 6547次阅读
    <b class='flag-5'>STM32</b>_ SPI<b class='flag-5'>读写</b><b class='flag-5'>Flash</b>

    单片机实验汇编--扩展存储器读写实验

    扩展存储器读写实验一.实验要求编制简单程序,对实验提供的外部存贮器(62256)进行读写操作。二.
    发表于 11-23 09:51 19次下载
    单片机<b class='flag-5'>实验</b>汇编--扩展存储器<b class='flag-5'>读写实验</b>

    STM32F103学习笔记——SPI读写Flash(一)

    STM32F103学习笔记——SPI读写Flash(一)  此系列文章是小白学习
    发表于 12-02 12:06 19次下载
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——SPI<b class='flag-5'>读写</b><b class='flag-5'>Flash</b>(一)

    STM32F103学习笔记——SPI读写Flash(三)

      此系列文章是小白学习STM32的一些学习笔记。小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流!目录1.
    发表于 12-22 19:29 11次下载
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——SPI<b class='flag-5'>读写</b><b class='flag-5'>Flash</b>(三)

    STM32F103学习笔记——SPI读写Flash(二)

      此系列文章是小白学习STM32的一些学习笔记。小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流!目录1.软件设计流程2.SPI初
    发表于 12-22 19:30 10次下载
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——SPI<b class='flag-5'>读写</b><b class='flag-5'>Flash</b>(二)

    STM32F103学习笔记——SPI读写Flash(四)

      此系列文章是小白学习STM32的一些学习笔记。小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流!目录1.main函数编写2.下载
    发表于 12-22 19:32 6次下载
    <b class='flag-5'>STM32</b>F103<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——SPI<b class='flag-5'>读写</b><b class='flag-5'>Flash</b>(四)

    外置FLASH读写实验

    Flash,全名叫做Flash EEPROM Memory,即平时所说的“闪存”,它结合了ROM和RAM的长处,不仅可以反复擦除,还可以快速读取数据,STM32运行的程序其实就是存放在Flas
    的头像 发表于 03-01 14:56 5704次阅读

    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-SD卡读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD卡读写实
    的头像 发表于 06-23 10:49 1659次阅读
    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-SD卡<b class='flag-5'>读写实验</b>