2019-07-19 14:54:54 +01:00

361 lines
15 KiB
C

/**
******************************************************************************
* @file BSP/Src/flash.c
* @author MCD Application Team
* @brief This example code shows how to use Flash SPI features.
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/** @addtogroup STM32F1xx_HAL_Examples
* @{
*/
/** @addtogroup BSP
* @{
*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/
#define FLASH_WriteSector127 0x7F0000 /* End of Sector 0x7FFFFF */
#define FLASH_WriteSector126 0x7E0000 /* End of Sector 0x7EFFFF */
#define FLASH_WriteSector125 0x7D0000 /* End of Sector 0x7DFFFF */
#define FLASH_WriteSector124 0x7C0000 /* End of Sector 0x7CFFFF */
#define FLASH_WriteSector123 0x7B0000 /* End of Sector 0x7BFFFF */
#define FLASH_WriteSector122 0x7A0000 /* End of Sector 0x7AFFFF */
#define FLASH_WriteSector121 0x790000 /* End of Sector 0x79FFFF */
#define FLASH_WriteSector120 0x780000 /* End of Sector 0x78FFFF */
#define FLASH_WriteSector119 0x770000 /* End of Sector 0x77FFFF */
#define FLASH_WriteSector118 0x760000 /* End of Sector 0x76FFFF */
#define FLASH_WriteSector117 0x750000 /* End of Sector 0x75FFFF */
#define FLASH_WriteSector116 0x740000 /* End of Sector 0x74FFFF */
#define FLASH_WriteSector115 0x730000 /* End of Sector 0x73FFFF */
#define FLASH_WriteSector114 0x720000 /* End of Sector 0x72FFFF */
#define FLASH_WriteSector113 0x710000 /* End of Sector 0x71FFFF */
#define FLASH_WriteSector112 0x700000 /* End of Sector 0x70FFFF */
#define FLASH_WriteSector111 0x6F0000 /* End of Sector 0x6FFFFF */
#define FLASH_WriteSector110 0x6E0000 /* End of Sector 0x6EFFFF */
#define FLASH_WriteSector109 0x6D0000 /* End of Sector 0x6DFFFF */
#define FLASH_WriteSector108 0x6C0000 /* End of Sector 0x6CFFFF */
#define FLASH_WriteSector107 0x6B0000 /* End of Sector 0x6BFFFF */
#define FLASH_WriteSector106 0x6A0000 /* End of Sector 0x6AFFFF */
#define FLASH_WriteSector105 0x690000 /* End of Sector 0x69FFFF */
#define FLASH_WriteSector104 0x680000 /* End of Sector 0x68FFFF */
#define FLASH_WriteSector103 0x670000 /* End of Sector 0x67FFFF */
#define FLASH_WriteSector102 0x660000 /* End of Sector 0x66FFFF */
#define FLASH_WriteSector101 0x650000 /* End of Sector 0x65FFFF */
#define FLASH_WriteSector100 0x640000 /* End of Sector 0x64FFFF */
#define FLASH_WriteSector99 0x630000 /* End of Sector 0x63FFFF */
#define FLASH_WriteSector98 0x620000 /* End of Sector 0x62FFFF */
#define FLASH_WriteSector97 0x610000 /* End of Sector 0x61FFFF */
#define FLASH_WriteSector96 0x600000 /* End of Sector 0x60FFFF */
#define FLASH_WriteSector95 0x5F0000 /* End of Sector 0x5FFFFF */
#define FLASH_WriteSector94 0x5E0000 /* End of Sector 0x5EFFFF */
#define FLASH_WriteSector93 0x5D0000 /* End of Sector 0x5DFFFF */
#define FLASH_WriteSector92 0x5C0000 /* End of Sector 0x5CFFFF */
#define FLASH_WriteSector91 0x5B0000 /* End of Sector 0x5BFFFF */
#define FLASH_WriteSector90 0x5A0000 /* End of Sector 0x5AFFFF */
#define FLASH_WriteSector89 0x590000 /* End of Sector 0x59FFFF */
#define FLASH_WriteSector88 0x580000 /* End of Sector 0x58FFFF */
#define FLASH_WriteSector87 0x570000 /* End of Sector 0x57FFFF */
#define FLASH_WriteSector86 0x560000 /* End of Sector 0x56FFFF */
#define FLASH_WriteSector85 0x550000 /* End of Sector 0x55FFFF */
#define FLASH_WriteSector84 0x540000 /* End of Sector 0x54FFFF */
#define FLASH_WriteSector83 0x530000 /* End of Sector 0x53FFFF */
#define FLASH_WriteSector82 0x520000 /* End of Sector 0x52FFFF */
#define FLASH_WriteSector81 0x510000 /* End of Sector 0x51FFFF */
#define FLASH_WriteSector80 0x500000 /* End of Sector 0x50FFFF */
#define FLASH_WriteSector79 0x4F0000 /* End of Sector 0x4FFFFF */
#define FLASH_WriteSector78 0x4E0000 /* End of Sector 0x4EFFFF */
#define FLASH_WriteSector77 0x4D0000 /* End of Sector 0x4DFFFF */
#define FLASH_WriteSector76 0x4C0000 /* End of Sector 0x4CFFFF */
#define FLASH_WriteSector75 0x4B0000 /* End of Sector 0x4BFFFF */
#define FLASH_WriteSector74 0x4A0000 /* End of Sector 0x4AFFFF */
#define FLASH_WriteSector73 0x490000 /* End of Sector 0x49FFFF */
#define FLASH_WriteSector72 0x480000 /* End of Sector 0x48FFFF */
#define FLASH_WriteSector71 0x470000 /* End of Sector 0x47FFFF */
#define FLASH_WriteSector70 0x460000 /* End of Sector 0x46FFFF */
#define FLASH_WriteSector69 0x450000 /* End of Sector 0x45FFFF */
#define FLASH_WriteSector68 0x440000 /* End of Sector 0x44FFFF */
#define FLASH_WriteSector67 0x430000 /* End of Sector 0x43FFFF */
#define FLASH_WriteSector66 0x420000 /* End of Sector 0x42FFFF */
#define FLASH_WriteSector65 0x410000 /* End of Sector 0x41FFFF */
#define FLASH_WriteSector64 0x400000 /* End of Sector 0x40FFFF */
#define FLASH_WriteSector63 0x3F0000 /* End of Sector 0x3FFFFF */
#define FLASH_WriteSector62 0x3E0000 /* End of Sector 0x3EFFFF */
#define FLASH_WriteSector61 0x3D0000 /* End of Sector 0x3DFFFF */
#define FLASH_WriteSector60 0x3C0000 /* End of Sector 0x3CFFFF */
#define FLASH_WriteSector59 0x3B0000 /* End of Sector 0x3BFFFF */
#define FLASH_WriteSector58 0x3A0000 /* End of Sector 0x3AFFFF */
#define FLASH_WriteSector57 0x390000 /* End of Sector 0x39FFFF */
#define FLASH_WriteSector56 0x380000 /* End of Sector 0x38FFFF */
#define FLASH_WriteSector55 0x370000 /* End of Sector 0x37FFFF */
#define FLASH_WriteSector54 0x360000 /* End of Sector 0x36FFFF */
#define FLASH_WriteSector53 0x350000 /* End of Sector 0x35FFFF */
#define FLASH_WriteSector52 0x340000 /* End of Sector 0x34FFFF */
#define FLASH_WriteSector51 0x330000 /* End of Sector 0x33FFFF */
#define FLASH_WriteSector50 0x320000 /* End of Sector 0x32FFFF */
#define FLASH_WriteSector49 0x310000 /* End of Sector 0x31FFFF */
#define FLASH_WriteSector48 0x300000 /* End of Sector 0x30FFFF */
#define FLASH_WriteSector47 0x2F0000 /* End of Sector 0x2FFFFF */
#define FLASH_WriteSector46 0x2E0000 /* End of Sector 0x2EFFFF */
#define FLASH_WriteSector45 0x2D0000 /* End of Sector 0x2DFFFF */
#define FLASH_WriteSector44 0x2C0000 /* End of Sector 0x2CFFFF */
#define FLASH_WriteSector43 0x2B0000 /* End of Sector 0x2BFFFF */
#define FLASH_WriteSector42 0x2A0000 /* End of Sector 0x2AFFFF */
#define FLASH_WriteSector41 0x290000 /* End of Sector 0x29FFFF */
#define FLASH_WriteSector40 0x280000 /* End of Sector 0x28FFFF */
#define FLASH_WriteSector39 0x270000 /* End of Sector 0x27FFFF */
#define FLASH_WriteSector38 0x260000 /* End of Sector 0x26FFFF */
#define FLASH_WriteSector37 0x250000 /* End of Sector 0x25FFFF */
#define FLASH_WriteSector36 0x240000 /* End of Sector 0x24FFFF */
#define FLASH_WriteSector35 0x230000 /* End of Sector 0x23FFFF */
#define FLASH_WriteSector34 0x220000 /* End of Sector 0x22FFFF */
#define FLASH_WriteSector33 0x210000 /* End of Sector 0x21FFFF */
#define FLASH_WriteSector32 0x200000 /* End of Sector 0x20FFFF */
#define FLASH_WriteSector31 0x1F0000 /* End of Sector 0x1FFFFF */
#define FLASH_WriteSector30 0x1E0000 /* End of Sector 0x1EFFFF */
#define FLASH_WriteSector29 0x1D0000 /* End of Sector 0x1DFFFF */
#define FLASH_WriteSector28 0x1C0000 /* End of Sector 0x1CFFFF */
#define FLASH_WriteSector27 0x1B0000 /* End of Sector 0x1BFFFF */
#define FLASH_WriteSector26 0x1A0000 /* End of Sector 0x1AFFFF */
#define FLASH_WriteSector25 0x190000 /* End of Sector 0x19FFFF */
#define FLASH_WriteSector24 0x180000 /* End of Sector 0x18FFFF */
#define FLASH_WriteSector23 0x170000 /* End of Sector 0x17FFFF */
#define FLASH_WriteSector22 0x160000 /* End of Sector 0x16FFFF */
#define FLASH_WriteSector21 0x150000 /* End of Sector 0x15FFFF */
#define FLASH_WriteSector20 0x140000 /* End of Sector 0x14FFFF */
#define FLASH_WriteSector19 0x130000 /* End of Sector 0x13FFFF */
#define FLASH_WriteSector18 0x120000 /* End of Sector 0x12FFFF */
#define FLASH_WriteSector17 0x110000 /* End of Sector 0x11FFFF */
#define FLASH_WriteSector16 0x100000 /* End of Sector 0x10FFFF */
#define FLASH_WriteSector15 0x0F0000 /* End of Sector 0x0FFFFF */
#define FLASH_WriteSector14 0x0E0000 /* End of Sector 0x0EFFFF */
#define FLASH_WriteSector13 0x0D0000 /* End of Sector 0x0DFFFF */
#define FLASH_WriteSector12 0x0C0000 /* End of Sector 0x0CFFFF */
#define FLASH_WriteSector11 0x0B0000 /* End of Sector 0x0BFFFF */
#define FLASH_WriteSector10 0x0A0000 /* End of Sector 0x0AFFFF */
#define FLASH_WriteSector9 0x090000 /* End of Sector 0x09FFFF */
#define FLASH_WriteSector8 0x080000 /* End of Sector 0x08FFFF */
#define FLASH_WriteSector7 0x070000 /* End of Sector 0x07FFFF */
#define FLASH_WriteSector6 0x060000 /* End of Sector 0x06FFFF */
#define FLASH_WriteSector5 0x050000 /* End of Sector 0x05FFFF */
#define FLASH_WriteSector4 0x040000 /* End of Sector 0x04FFFF */
#define FLASH_WriteSector3 0x030000 /* End of Sector 0x03FFFF */
#define FLASH_WriteSector2 0x020000 /* End of Sector 0x02FFFF */
#define FLASH_WriteSector1 0x010000 /* End of Sector 0x01FFFF */
#define FLASH_WriteSector0 0x000000 /* End of Sector 0x00FFFF */
#define FLASH_AddrSector12 0x0C0035 /* Addr inside Sector 12, In case of erase sector at this address Sector 12 shall be erase*/
#define BufferSize (countof(Tx_Buffer)-1)
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/
uint8_t Tx_Buffer[] = "STM32F10x SPI Firmware Library Example: communication with an M25P SPI FLASH";
uint8_t Rx_Buffer[BufferSize];
__IO uint32_t FlashID = 0;
__IO uint8_t Index = 0x0;
volatile TestStatus TransferStatus1 = PASSED, TransferStatus2 = PASSED, TransferStatus3 = PASSED, Test = PASSED;
/* Private functions ---------------------------------------------------------*/
static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
static void Flush_Rx_Buffers(uint8_t* pBuffer, uint16_t BufferLength);
static void Flash_SetHint(void);
/**
* @brief Main program
* @param None
* @retval None
*/
void FLASH_demo(void)
{
/* Set Display for Demo Flash SPI */
Flash_SetHint();
/* Initialize the SPI FLASH driver */
BSP_SERIAL_FLASH_Init();
/* Get SPI Flash ID */
FlashID = BSP_SERIAL_FLASH_ReadID();
/* Check the SPI Flash ID */
if (FlashID == FLASH_SPI_M25P64_ID)
{
/* Initialization OK as BSP_SERIAL_FLASH_ReadID return the righ value */
BSP_LCD_DisplayStringAt(20, 100, (uint8_t*)"FLASH Initialization : OK.", LEFT_MODE);
/* Perform a write in the Flash followed by an erase of the written data */
/* Write Tx_Buffer data to SPI FLASH memory at begining of Sector12*/
BSP_SERIAL_FLASH_WritePage(FLASH_WriteSector12, Tx_Buffer, BufferSize);
/* Erase SPI FLASH Sector12 by giving an Addr inside range of Sector12 Addr */
BSP_SERIAL_FLASH_EraseSector(FLASH_AddrSector12);
/* Read Erase data from SPI FLASH memory, shal be 0xFF */
BSP_SERIAL_FLASH_ReadData(FLASH_WriteSector12, Rx_Buffer, BufferSize);
/* Check the correctness of erasing operation data */
for (Index = 0; Index < BufferSize; Index++)
{
if (Rx_Buffer[Index] != 0xFF)
{
TransferStatus1 = FAILED;
}
}
/* Flush Data inside Rx_Buffer */
Flush_Rx_Buffers(Rx_Buffer, BufferSize);
if(TransferStatus1 == PASSED)
{
BSP_LCD_DisplayStringAt(20, 115, (uint8_t*)"FLASH ERASE : OK.", LEFT_MODE);
}
else
{
BSP_LCD_DisplayStringAt(20, 115, (uint8_t*)"FLASH ERASE : FAILED.", LEFT_MODE);
Test = FAILED;
}
/* Perform a write in the Flash followed by a read of the written data */
/* Write Tx_Buffer data to SPI FLASH memory at Sector0 Addr*/
BSP_SERIAL_FLASH_WritePage(FLASH_WriteSector0, Tx_Buffer, BufferSize);
/* Read data from SPI FLASH memory at Sector0 Addr*/
BSP_SERIAL_FLASH_ReadData(FLASH_WriteSector0, Rx_Buffer, BufferSize);
/* Check the correctness of written data */
TransferStatus2 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
/* Flush Data inside Rx_Buffer */
Flush_Rx_Buffers(Rx_Buffer, BufferSize);
if(TransferStatus2 == PASSED)
{
BSP_LCD_DisplayStringAt(20, 130, (uint8_t*)"FLASH WRITE : OK.", LEFT_MODE);
BSP_LCD_DisplayStringAt(20, 145, (uint8_t*)"FLASH READ : OK.", LEFT_MODE);
}
else
{
BSP_LCD_DisplayStringAt(20, 130, (uint8_t*)"FLASH WRITE : FAILED.", LEFT_MODE);
BSP_LCD_DisplayStringAt(20, 145, (uint8_t*)"FLASH READ : FAILED.", LEFT_MODE);
Test = FAILED;
}
if(Test == PASSED)
{
BSP_LCD_DisplayStringAt(20, 160, (uint8_t*)"FLASH Test : OK.", LEFT_MODE);
}
else
{
BSP_LCD_DisplayStringAt(20, 160, (uint8_t*)"FLASH Test : FAILED.", LEFT_MODE);
}
}
else
{
/* Error Init: Test FAILED */
BSP_LCD_DisplayStringAt(20, 100, (uint8_t*)"FLASH Initialization : FAILED.", LEFT_MODE);
BSP_LCD_DisplayStringAt(20, 115, (uint8_t*)"FLASH Test : FAILED.", LEFT_MODE);
}
while (1)
{
if(CheckForUserInput() > 0)
{
return;
}
}
}
/**
* @brief Display FLASH Demo Hint
* @param None
* @retval None
*/
static void Flash_SetHint(void)
{
/* Clear the LCD */
BSP_LCD_Clear(LCD_COLOR_WHITE);
/* Set LCD Demo description */
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 80);
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_SetFont(&Font24);
BSP_LCD_DisplayStringAt(0, 0, (uint8_t*)"FLASH", CENTER_MODE);
BSP_LCD_SetFont(&Font12);
BSP_LCD_DisplayStringAt(0, 30, (uint8_t*)"This example shows how to write", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, 45, (uint8_t*)"and read data on FLASH SPI", CENTER_MODE);
/* Set the LCD Text Color */
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_DrawRect(10, 90, BSP_LCD_GetXSize() - 20, BSP_LCD_GetYSize()- 100);
BSP_LCD_DrawRect(11, 91, BSP_LCD_GetXSize() - 22, BSP_LCD_GetYSize()- 102);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
}
/**
* @brief Compares two buffers.
* @param pBuffer1, pBuffer2: buffers to be compared.
* @param BufferLength: buffer's length
* @retval PASSED: pBuffer1 identical to pBuffer2
* FAILED: pBuffer1 differs from pBuffer2
*/
static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
while(BufferLength--)
{
if(*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
/**
* @brief Flushes the receive buffers.
* @param None
* @retval None
*/
static void Flush_Rx_Buffers(uint8_t* pBuffer, uint16_t BufferLength)
{
while(BufferLength--)
{
*pBuffer = 0;
pBuffer++;
}
}
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/