这一张我们主要讲解一下STM32CUBEMX新版本 片外FLASH+FATFS文件系统。
一、准备工作
这里我们要想配置SPI和文件系统 并验证需要的准备工作如下:
1、MDK for ARM(KEIL5)或者IAR FOR ARM(这个是软件必备开发平台) (必须)
2、一块STM32最小系统开发板 (必须)
3、一块片外FLASH可以在开发板上面或者是自己买的模块
二、具体的操作
1、工程建立
1)、在Pinout&Configuration菜单栏下,配置硬件SPI的基本参数如图
这里配置的是SPI2,还需要软件控制片选增加一个PB12作为输出的片选脚,这里SPI2就配置好了。
2)、在Pinout&Configuration菜单栏下,配置FATFS基本信息
在MiddleWare下FATFS勾选User-define,在底下参数栏里面设置简体中文以及块大小,我们选取的是W25Q128,块的大小是4096。如果是SD卡就不需要更改大小为512。这里文件系统就配置好了。
3)、生成工程配置如图
生成成功后打开工程。
2、工程测试
1)、SPI & FLASH测试
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
SPI2->CR1 |= SPI_CR1_SPE;
}
SPI2初始化代码添加SPI使能代码。
FLASH.C
#define W25Q80 0XEF13
#define W25Q16 0XEF14
#define W25Q32 0XEF15
#define W25Q64 0XEF16
#define W25Q128 0XEF17
#define M25P64_FLASH_ID 0x202017//C22017
#define M25P40_FLASH_ID 0x202013
/* USER CODE BEGIN Includes */
#define sFLASH_CMD_WRITE 0x02 /*!< Write to Memory instruction */
#define sFLASH_CMD_WRSR 0x01 /*!< Write Status Register instruction */
#define sFLASH_CMD_WREN 0x06 /*!< Write enable instruction */
#define sFLASH_CMD_READ 0x03 /*!< Read from Memory instruction */
#define sFLASH_CMD_RDSR 0x05 /*!< Read Status Register instruction */
#define sFLASH_CMD_RDID 0x9F /*!< Read identification */
#define sFLASH_CMD_SE 0x20 /*!< Sector Erase instruction (4k)*/
#define sFLASH_CMD_BE 0xD8 /*!< Block Erase instruction (64k)*/
#define sFLASH_CMD_CE 0xC7 /*!< Chip Erase instruction (Chip Erase)*/
#define sFLASH_WIP_FLAG 0x01 /*!< Write In Progress (WIP) flag */
#define sFLASH_CMD_RDID 0x9F /*!< Read identification */
#define sFLASH_CMD_DeviceID 0xAB
#define sFLASH_CMD_ManufactDeviceID 0x90
#define sFLASH_CMD_JedecDeviceID 0x9F
#define sFLASH_DUMMY_BYTE 0xFF
uint8_t sFlashBuff[4096];
//片选CS拉低
void sFLASH_CS_LOW(void)
{
HAL_GPIO_WritePin(SPI2_CS_GPIO_Port,SPI2_CS_Pin,GPIO_PIN_RESET);
}
//片选CS拉高
void sFLASH_CS_HIGH(void)
{
HAL_GPIO_WritePin(SPI2_CS_GPIO_Port,SPI2_CS_Pin,GPIO_PIN_SET);
}
//FLASH写使能
void sFLASH_WriteEnable(void)
{
/*!< Select the FLASH: Chip Select low */
sFLASH_CS_LOW();
/*!< Send "Write Enable" instruction */
sFLASH_SendByte(sFLASH_CMD_WREN);
/*!< Deselect the FLASH: Chip Select high */
sFLASH_CS_HIGH();
}
//FLASH 发送一个字节
uint8_t sFLASH_SendByte(uint8_t byte)
{
unsigned char dr;
/*!< Loop while DR register in not emplty */
//while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
while((SPI2->SR & SPI_SR_TXE) == 0);
/*!< Send byte through the SPI1 peripheral */
//SPI_I2S_SendData(SPI1, byte);
SPI2->DR = byte;
/*!< Wait to receive a byte */
//while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
while((