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

发布者:TranquilDreamer最新更新时间:2024-09-25 来源: elecfans关键字:STM32  读写实验 手机看文章 扫描二维码
随时随地手机看文章

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

1514131211109876543210
BIDIMODEBIDIOECRCENCRCNEXTDFFRXONLYSSMSSILSBFIRSTSPEBR[2:0]MSTRCPOLCPHA

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

1514131211109876543210
-BSYOVRMODFCRCERRUDRCHSIDETXERXNE






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:接收缓冲非空


关键字:STM32  读写实验 引用地址:STM32入门学习笔记之外置FLASH读写实验(上)

上一篇:STM32入门学习笔记之外置FLASH读写实验(下)
下一篇:在STM32中的func1和func2函数,哪个效率高?

推荐阅读最新更新时间:2026-03-23 10:56

【GD32H757Z海棠派开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验
11.1实验内容 通过本实验主要学习以下内容: SPI简介 GD32H7 SPI简介 SPI NOR FLASH——GD25Q128ESIGR简介 使用GD32H7 SPI接口实现对GD25Q128ESIGR的读写操作 11.2实验原理 11.2.1SPI简介 SPI(Serial Peripheral interface),顾名思义是串行外设接口,和UART不同的是,SPI是同步通讯接口,所以带有时钟线,而UART是异步通讯接口,不需要时钟线。 SPI通常使用4根线,分别为SCK、MOSI、MISO、NSS(CS): SCK:串列时脉,由主机发出 MOSI:主机输出从机输入信号(数据由主机发出) MISO:主机输
[单片机]
【GD32H757Z海棠派开发板使用手册】第十一讲 SPI-SPI NOR <font color='red'>FLASH</font><font color='red'>读写</font><font color='red'>实验</font>
S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC)
使用S3C2440的GPE14--SCL和GPE15--SDA来软件模拟IIC: 由于不清楚如何像51那样位定义,就特意进行了如下定义: #define IIC_SDA_L (rGPEDAT = rGPEDAT & ~(1 15)) #define IIC_SDA_H (rGPEDAT = rGPEDAT | (1 15)) #define IIC_SCL_L (rGPEDAT = rGPEDAT & ~(1 14)) #define IIC_SCL_H (rGPEDAT = rGPEDAT | (1 14)) 初始化: void IIC_Init() { //GPE15--SDA GPE14--SCL rG
[单片机]
S3C2440 测试程序(七) IIC<font color='red'>实验</font>2--<font color='red'>读写</font>EEPROM(软件模拟IIC)
ATmega16L-EEPROM读写操作实验
/*************************************** 读写AVR单片机EEPROM实验。 先向单片机EEPROM写入254,然后读出254, 并在数码管上显示出来 ***************************************/ #include iom16v.h const unsigned char duanma ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; const unsigned char weima ={0xfe,0xfd,
[单片机]
使用 Keil Studio for Visual Studio Code开发 STM32 设备
Keil Studio是 Arm 最新一代的集成开发环境(IDE),将嵌入式开发工具直接集成到了 Visual Studio Code 中。作为 µVision 的后继者,它提供了现代化的特性,包括与业界工具的无缝集成、版本控制支持,以及用于 CI 工作流的命令行接口(CLI)。 Keil Studio 作为 Arm Keil MDK 6的一部分,为基于 Cortex M 的微控制器提供了全面支持,其中包括 STMicroelectronics 广泛的 STM32 产品系列。它将 Arm 编译器的可靠性与成熟度、广泛的器件支持,与 Visual Studio Code 的灵活性和可扩展性有机结合在一起。 快速上手 借
[单片机]
使用 Keil Studio for Visual Studio Code开发 <font color='red'>STM32</font> 设备
深夜!我偷偷的把室友的STM32换成了GD32
一、什么是GD32 GD32是由北京兆易创新开发的国产32位MCU,基于Arm Cortex- M3/M23/M4内核以及RISC-V内核的32位通用微控制器,与STM32相比,CPU主频更高,内存更多,外设更丰富。其众多产品是以STM32芯片为模板,基于STM32的底层寄存器地址进行正向研发,部分产品可以直接PIN TO PIN替代STM32的芯片,部分型号可以直接以STM32的程序做部分修改后直接烧入进GD32中运行,例如GD32E103、GD32F10x、GD32F30x都是和STM32F10x系列是完全PIN TO PIN兼容的,内部地址寄存器完全兼容,唯一区别只是内核不同,但在使用外设时影响不会很大。 一个大胆的想法
[单片机]
STM32输入捕获
输入捕获是处理器捕获外部输入信号的功能,基于定时器抓取输入信号指定触发方式之间的长度。具体有下面三种触发情况: 1、 上升沿触发 2、 下降沿触发 3、 上下都触发 当触发条件发生后,捕获比较寄存器锁定当前的计数值,如果开启了中断或者DMA,就可以通过中断或DMA及时获得数据进行处理。有时可能遇到上一次触发的标志还没清除,下次触发就发生了,此时会将over-capture标志置位,对于可能出现over-capture的情况,建议先读取数据再清除标志,避免在读取标志后及读取数据前这段时间错过over-capture。 配置输入捕获的步骤: 1. 打开定时器和对应输入引脚的时钟 2. 配置引脚为对应的复用功能 3.
[单片机]
STM32驱动WS2811实现渐变色、跑马灯
一、WS2811简介 输出端口耐压12V 芯片内置稳压管,24V以下电源端只需串电阻IC到VDD脚,无需外加稳压管 灰度调节电路(256级灰度可调) 内置信号整形电路,任何一个IC收到信号后经过波形整形后在输出,保证线路波形畸变不会累加 内置上电复位和掉电复位电路 PWM控制端能够实现256级调节,扫描频率不低于400HZ/S 串行接口级联,一根信号线DI完成数据的接收与解码 任意两点传输距离不超过2米无需增加任何电路 当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式下不小于1024点 数据发送速度可达与400Kbps与800Kbps两种模式 二、通讯协议 数据协议采用单线归零码的通讯方式,
[单片机]
<font color='red'>STM32</font>驱动WS2811实现渐变色、跑马灯
让人神往的STM32经验大抵如此
单片机用处这么广,尤其是STM32生态这么火!如何快速上手学习呢? 你要考虑的是,要用STM32实现什么? 为什么使用STM32而不是用8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的内存太小而你要存储的东西太多?还是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 当你需要使用STM32某些功能,而51实现不了的时候,那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等。 寄存器vs库函数 我的观点是:当你debug的时候寄存器很重要,当你需要理解芯片工作
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved