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 CPHABit 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 RXNEBit 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免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:STM32入门学习笔记之外置FLASH读写实验(上)-stm32扩展外部flash https://www.yhzz.com.cn/a/4521.html