
Internal Flash Read Write and Erase for STM32F767ZI Storing and Reading Configuration Info STM32
main.cpp@0:7c7d15e2f39e, 2019-08-19 (annotated)
- Committer:
- shivanandgowdakr
- Date:
- Mon Aug 19 05:44:35 2019 +0000
- Revision:
- 0:7c7d15e2f39e
Internal Flash Memory Read Write STM32F767ZI.; Storing Data in Internal Flash
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shivanandgowdakr | 0:7c7d15e2f39e | 1 | /* mbed Microcontroller Library |
shivanandgowdakr | 0:7c7d15e2f39e | 2 | * Copyright (c) 2018 ARM Limited |
shivanandgowdakr | 0:7c7d15e2f39e | 3 | * SPDX-License-Identifier: Apache-2.0 |
shivanandgowdakr | 0:7c7d15e2f39e | 4 | */ |
shivanandgowdakr | 0:7c7d15e2f39e | 5 | |
shivanandgowdakr | 0:7c7d15e2f39e | 6 | #include "mbed.h" |
shivanandgowdakr | 0:7c7d15e2f39e | 7 | #include "stats_report.h" |
shivanandgowdakr | 0:7c7d15e2f39e | 8 | |
shivanandgowdakr | 0:7c7d15e2f39e | 9 | DigitalOut led1(LED1); |
shivanandgowdakr | 0:7c7d15e2f39e | 10 | |
shivanandgowdakr | 0:7c7d15e2f39e | 11 | |
shivanandgowdakr | 0:7c7d15e2f39e | 12 | |
shivanandgowdakr | 0:7c7d15e2f39e | 13 | #define FLASH_USER_START_ADDR 0x080C0000 |
shivanandgowdakr | 0:7c7d15e2f39e | 14 | #define FLASH_USER_END_ADDR 0x080FFFFF |
shivanandgowdakr | 0:7c7d15e2f39e | 15 | #define DATA_32 ((uint32_t)0x12345678) |
shivanandgowdakr | 0:7c7d15e2f39e | 16 | |
shivanandgowdakr | 0:7c7d15e2f39e | 17 | uint32_t Address = 0, SectorError = 0; |
shivanandgowdakr | 0:7c7d15e2f39e | 18 | __IO uint32_t data32 = 0 , MemoryProgramStatus = 0; |
shivanandgowdakr | 0:7c7d15e2f39e | 19 | |
shivanandgowdakr | 0:7c7d15e2f39e | 20 | int main() |
shivanandgowdakr | 0:7c7d15e2f39e | 21 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 22 | |
shivanandgowdakr | 0:7c7d15e2f39e | 23 | static FLASH_EraseInitTypeDef EraseInitStruct; |
shivanandgowdakr | 0:7c7d15e2f39e | 24 | HAL_FLASH_Unlock(); |
shivanandgowdakr | 0:7c7d15e2f39e | 25 | |
shivanandgowdakr | 0:7c7d15e2f39e | 26 | /* Erase the user Flash area |
shivanandgowdakr | 0:7c7d15e2f39e | 27 | (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ |
shivanandgowdakr | 0:7c7d15e2f39e | 28 | |
shivanandgowdakr | 0:7c7d15e2f39e | 29 | /* Fill EraseInit structure*/ |
shivanandgowdakr | 0:7c7d15e2f39e | 30 | EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; |
shivanandgowdakr | 0:7c7d15e2f39e | 31 | EraseInitStruct.Banks = FLASH_BANK_1; |
shivanandgowdakr | 0:7c7d15e2f39e | 32 | EraseInitStruct.Sector = FLASH_SECTOR_7; |
shivanandgowdakr | 0:7c7d15e2f39e | 33 | EraseInitStruct.NbSectors = 1; |
shivanandgowdakr | 0:7c7d15e2f39e | 34 | EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; |
shivanandgowdakr | 0:7c7d15e2f39e | 35 | |
shivanandgowdakr | 0:7c7d15e2f39e | 36 | if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) |
shivanandgowdakr | 0:7c7d15e2f39e | 37 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 38 | /* |
shivanandgowdakr | 0:7c7d15e2f39e | 39 | Error occurred while page erase. |
shivanandgowdakr | 0:7c7d15e2f39e | 40 | User can add here some code to deal with this error. |
shivanandgowdakr | 0:7c7d15e2f39e | 41 | PAGEError will contain the faulty page and then to know the code error on this page, |
shivanandgowdakr | 0:7c7d15e2f39e | 42 | user can call function 'HAL_FLASH_GetError()' |
shivanandgowdakr | 0:7c7d15e2f39e | 43 | */ |
shivanandgowdakr | 0:7c7d15e2f39e | 44 | /* Infinite loop */ |
shivanandgowdakr | 0:7c7d15e2f39e | 45 | while (1) |
shivanandgowdakr | 0:7c7d15e2f39e | 46 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 47 | /* Make LED2 blink (100ms on, 2s off) to indicate error in Erase operation */ |
shivanandgowdakr | 0:7c7d15e2f39e | 48 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 49 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 50 | |
shivanandgowdakr | 0:7c7d15e2f39e | 51 | /* Program the user Flash area word by word |
shivanandgowdakr | 0:7c7d15e2f39e | 52 | (area defined by FLASH_USER_START_ADDR = 0x080C 0000 and FLASH_USER_END_ADDR) ***********/ |
shivanandgowdakr | 0:7c7d15e2f39e | 53 | |
shivanandgowdakr | 0:7c7d15e2f39e | 54 | |
shivanandgowdakr | 0:7c7d15e2f39e | 55 | Address = FLASH_USER_START_ADDR; |
shivanandgowdakr | 0:7c7d15e2f39e | 56 | |
shivanandgowdakr | 0:7c7d15e2f39e | 57 | while (Address < FLASH_USER_END_ADDR) |
shivanandgowdakr | 0:7c7d15e2f39e | 58 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 59 | if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK) |
shivanandgowdakr | 0:7c7d15e2f39e | 60 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 61 | Address = Address + 4; |
shivanandgowdakr | 0:7c7d15e2f39e | 62 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 63 | else |
shivanandgowdakr | 0:7c7d15e2f39e | 64 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 65 | /* Error occurred while writing data in Flash memory. |
shivanandgowdakr | 0:7c7d15e2f39e | 66 | User can add here some code to deal with this error */ |
shivanandgowdakr | 0:7c7d15e2f39e | 67 | while (1) |
shivanandgowdakr | 0:7c7d15e2f39e | 68 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 69 | |
shivanandgowdakr | 0:7c7d15e2f39e | 70 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 71 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 72 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 73 | |
shivanandgowdakr | 0:7c7d15e2f39e | 74 | /* Lock the Flash to disable the flash control register access (recommended |
shivanandgowdakr | 0:7c7d15e2f39e | 75 | to protect the FLASH memory against possible unwanted operation) *********/ |
shivanandgowdakr | 0:7c7d15e2f39e | 76 | HAL_FLASH_Lock(); |
shivanandgowdakr | 0:7c7d15e2f39e | 77 | |
shivanandgowdakr | 0:7c7d15e2f39e | 78 | /* Check if the programmed data is OK |
shivanandgowdakr | 0:7c7d15e2f39e | 79 | MemoryProgramStatus = 0: data programmed correctly |
shivanandgowdakr | 0:7c7d15e2f39e | 80 | MemoryProgramStatus != 0: number of words not programmed correctly ******/ |
shivanandgowdakr | 0:7c7d15e2f39e | 81 | Address = FLASH_USER_START_ADDR; |
shivanandgowdakr | 0:7c7d15e2f39e | 82 | MemoryProgramStatus = 0x0; |
shivanandgowdakr | 0:7c7d15e2f39e | 83 | |
shivanandgowdakr | 0:7c7d15e2f39e | 84 | while (Address < FLASH_USER_END_ADDR) |
shivanandgowdakr | 0:7c7d15e2f39e | 85 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 86 | data32 = *(__IO uint32_t *)Address; |
shivanandgowdakr | 0:7c7d15e2f39e | 87 | |
shivanandgowdakr | 0:7c7d15e2f39e | 88 | if (data32 != DATA_32) |
shivanandgowdakr | 0:7c7d15e2f39e | 89 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 90 | MemoryProgramStatus++; |
shivanandgowdakr | 0:7c7d15e2f39e | 91 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 92 | Address = Address + 4; |
shivanandgowdakr | 0:7c7d15e2f39e | 93 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 94 | |
shivanandgowdakr | 0:7c7d15e2f39e | 95 | /*Check if there is an issue to program data*/ |
shivanandgowdakr | 0:7c7d15e2f39e | 96 | if (MemoryProgramStatus == 0) |
shivanandgowdakr | 0:7c7d15e2f39e | 97 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 98 | |
shivanandgowdakr | 0:7c7d15e2f39e | 99 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 100 | else |
shivanandgowdakr | 0:7c7d15e2f39e | 101 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 102 | /* Error detected. LED2 will blink with 1s period */ |
shivanandgowdakr | 0:7c7d15e2f39e | 103 | while (1) |
shivanandgowdakr | 0:7c7d15e2f39e | 104 | { |
shivanandgowdakr | 0:7c7d15e2f39e | 105 | |
shivanandgowdakr | 0:7c7d15e2f39e | 106 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 107 | } |
shivanandgowdakr | 0:7c7d15e2f39e | 108 | |
shivanandgowdakr | 0:7c7d15e2f39e | 109 | |
shivanandgowdakr | 0:7c7d15e2f39e | 110 | HAL_FLASH_Unlock(); |
shivanandgowdakr | 0:7c7d15e2f39e | 111 | |
shivanandgowdakr | 0:7c7d15e2f39e | 112 | |
shivanandgowdakr | 0:7c7d15e2f39e | 113 | } |