mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 *******************************************************************************
AnnaBridge 189:f392fc9709a3 3 * Copyright (c) 2018, STMicroelectronics
AnnaBridge 189:f392fc9709a3 4 * All rights reserved.
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Redistribution and use in source and binary forms, with or without
AnnaBridge 189:f392fc9709a3 7 * modification, are permitted provided that the following conditions are met:
AnnaBridge 189:f392fc9709a3 8 *
AnnaBridge 189:f392fc9709a3 9 * 1. Redistributions of source code must retain the above copyright notice,
AnnaBridge 189:f392fc9709a3 10 * this list of conditions and the following disclaimer.
AnnaBridge 189:f392fc9709a3 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 189:f392fc9709a3 12 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 189:f392fc9709a3 13 * and/or other materials provided with the distribution.
AnnaBridge 189:f392fc9709a3 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
AnnaBridge 189:f392fc9709a3 15 * may be used to endorse or promote products derived from this software
AnnaBridge 189:f392fc9709a3 16 * without specific prior written permission.
AnnaBridge 189:f392fc9709a3 17 *
AnnaBridge 189:f392fc9709a3 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AnnaBridge 189:f392fc9709a3 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
AnnaBridge 189:f392fc9709a3 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 189:f392fc9709a3 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
AnnaBridge 189:f392fc9709a3 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
AnnaBridge 189:f392fc9709a3 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
AnnaBridge 189:f392fc9709a3 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
AnnaBridge 189:f392fc9709a3 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
AnnaBridge 189:f392fc9709a3 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
AnnaBridge 189:f392fc9709a3 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 189:f392fc9709a3 28 *******************************************************************************
AnnaBridge 189:f392fc9709a3 29 */
AnnaBridge 189:f392fc9709a3 30
AnnaBridge 189:f392fc9709a3 31 #if DEVICE_FLASH
AnnaBridge 189:f392fc9709a3 32 #include "flash_api.h"
AnnaBridge 189:f392fc9709a3 33 #include "flash_data.h"
AnnaBridge 189:f392fc9709a3 34 #include "platform/mbed_critical.h"
AnnaBridge 189:f392fc9709a3 35
AnnaBridge 189:f392fc9709a3 36 static uint32_t GetSector(uint32_t Address);
AnnaBridge 189:f392fc9709a3 37 static uint32_t GetSectorSize(uint32_t Sector);
AnnaBridge 189:f392fc9709a3 38
AnnaBridge 189:f392fc9709a3 39 int32_t flash_init(flash_t *obj)
AnnaBridge 189:f392fc9709a3 40 {
AnnaBridge 189:f392fc9709a3 41 /* Clear pending flags (if any) */
AnnaBridge 189:f392fc9709a3 42 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR);
AnnaBridge 189:f392fc9709a3 43 return 0;
AnnaBridge 189:f392fc9709a3 44 }
AnnaBridge 189:f392fc9709a3 45
AnnaBridge 189:f392fc9709a3 46 int32_t flash_free(flash_t *obj)
AnnaBridge 189:f392fc9709a3 47 {
AnnaBridge 189:f392fc9709a3 48 return 0;
AnnaBridge 189:f392fc9709a3 49 }
AnnaBridge 189:f392fc9709a3 50
AnnaBridge 189:f392fc9709a3 51
AnnaBridge 189:f392fc9709a3 52 int32_t flash_erase_sector(flash_t *obj, uint32_t address)
AnnaBridge 189:f392fc9709a3 53 {
AnnaBridge 189:f392fc9709a3 54 /* Variable used for Erase procedure */
AnnaBridge 189:f392fc9709a3 55 FLASH_EraseInitTypeDef EraseInitStruct;
AnnaBridge 189:f392fc9709a3 56 uint32_t SectorId;
AnnaBridge 189:f392fc9709a3 57 uint32_t SectorError = 0;
AnnaBridge 189:f392fc9709a3 58 int32_t status = 0;
AnnaBridge 189:f392fc9709a3 59
AnnaBridge 189:f392fc9709a3 60 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
AnnaBridge 189:f392fc9709a3 61 return -1;
AnnaBridge 189:f392fc9709a3 62 }
AnnaBridge 189:f392fc9709a3 63
AnnaBridge 189:f392fc9709a3 64 if (HAL_FLASH_Unlock() != HAL_OK) {
AnnaBridge 189:f392fc9709a3 65 return -1;
AnnaBridge 189:f392fc9709a3 66 }
AnnaBridge 189:f392fc9709a3 67
AnnaBridge 189:f392fc9709a3 68 /* Get the 1st sector to erase */
AnnaBridge 189:f392fc9709a3 69 SectorId = GetSector(address);
AnnaBridge 189:f392fc9709a3 70
AnnaBridge 189:f392fc9709a3 71 /* Fill EraseInit structure */
AnnaBridge 189:f392fc9709a3 72 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
AnnaBridge 189:f392fc9709a3 73 EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
AnnaBridge 189:f392fc9709a3 74 EraseInitStruct.Sector = SectorId;
AnnaBridge 189:f392fc9709a3 75 EraseInitStruct.NbSectors = 1;
AnnaBridge 189:f392fc9709a3 76
AnnaBridge 189:f392fc9709a3 77 if (address < ADDR_FLASH_SECTOR_0_BANK2) {
AnnaBridge 189:f392fc9709a3 78 EraseInitStruct.Banks = FLASH_BANK_1;
AnnaBridge 189:f392fc9709a3 79 if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {
AnnaBridge 189:f392fc9709a3 80 status = -1;
AnnaBridge 189:f392fc9709a3 81 }
AnnaBridge 189:f392fc9709a3 82 /* Mass erase of second bank */
AnnaBridge 189:f392fc9709a3 83 EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
AnnaBridge 189:f392fc9709a3 84 EraseInitStruct.Banks = FLASH_BANK_2;
AnnaBridge 189:f392fc9709a3 85 if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {
AnnaBridge 189:f392fc9709a3 86 status = -1;
AnnaBridge 189:f392fc9709a3 87 }
AnnaBridge 189:f392fc9709a3 88 } else {
AnnaBridge 189:f392fc9709a3 89 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
AnnaBridge 189:f392fc9709a3 90 EraseInitStruct.Banks = FLASH_BANK_2;
AnnaBridge 189:f392fc9709a3 91 if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {
AnnaBridge 189:f392fc9709a3 92 status = -1;
AnnaBridge 189:f392fc9709a3 93 }
AnnaBridge 189:f392fc9709a3 94 }
AnnaBridge 189:f392fc9709a3 95
AnnaBridge 189:f392fc9709a3 96 HAL_FLASH_Lock();
AnnaBridge 189:f392fc9709a3 97
AnnaBridge 189:f392fc9709a3 98 return status;
AnnaBridge 189:f392fc9709a3 99 }
AnnaBridge 189:f392fc9709a3 100
AnnaBridge 189:f392fc9709a3 101 int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
AnnaBridge 189:f392fc9709a3 102 uint32_t size)
AnnaBridge 189:f392fc9709a3 103 {
AnnaBridge 189:f392fc9709a3 104 uint32_t StartAddress = 0;
AnnaBridge 189:f392fc9709a3 105 int32_t status = 0;
AnnaBridge 189:f392fc9709a3 106
AnnaBridge 189:f392fc9709a3 107 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
AnnaBridge 189:f392fc9709a3 108 return -1;
AnnaBridge 189:f392fc9709a3 109 }
AnnaBridge 189:f392fc9709a3 110
AnnaBridge 189:f392fc9709a3 111 if ((size % 32) != 0) {
AnnaBridge 189:f392fc9709a3 112 /* H7 flash devices can only be programmed 256bits/32 bytes at a time */
AnnaBridge 189:f392fc9709a3 113 return -1;
AnnaBridge 189:f392fc9709a3 114 }
AnnaBridge 189:f392fc9709a3 115
AnnaBridge 189:f392fc9709a3 116 if (HAL_FLASH_Unlock() != HAL_OK) {
AnnaBridge 189:f392fc9709a3 117 return -1;
AnnaBridge 189:f392fc9709a3 118 }
AnnaBridge 189:f392fc9709a3 119
AnnaBridge 189:f392fc9709a3 120 StartAddress = address;
AnnaBridge 189:f392fc9709a3 121 while ((address < (StartAddress + size)) && (status == 0)) {
AnnaBridge 189:f392fc9709a3 122 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, address, (uint32_t)data) == HAL_OK) {
AnnaBridge 189:f392fc9709a3 123 address = address + 32;
AnnaBridge 189:f392fc9709a3 124 data = data + 32;
AnnaBridge 189:f392fc9709a3 125 } else {
AnnaBridge 189:f392fc9709a3 126 status = -1;
AnnaBridge 189:f392fc9709a3 127 }
AnnaBridge 189:f392fc9709a3 128 }
AnnaBridge 189:f392fc9709a3 129
AnnaBridge 189:f392fc9709a3 130 HAL_FLASH_Lock();
AnnaBridge 189:f392fc9709a3 131
AnnaBridge 189:f392fc9709a3 132 return status;
AnnaBridge 189:f392fc9709a3 133 }
AnnaBridge 189:f392fc9709a3 134
AnnaBridge 189:f392fc9709a3 135 uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
AnnaBridge 189:f392fc9709a3 136 {
AnnaBridge 189:f392fc9709a3 137 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
AnnaBridge 189:f392fc9709a3 138 return MBED_FLASH_INVALID_SIZE;
AnnaBridge 189:f392fc9709a3 139 }
AnnaBridge 189:f392fc9709a3 140 return (GetSectorSize(GetSector(address)));
AnnaBridge 189:f392fc9709a3 141 }
AnnaBridge 189:f392fc9709a3 142
AnnaBridge 189:f392fc9709a3 143 uint32_t flash_get_page_size(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 144 {
AnnaBridge 189:f392fc9709a3 145 return (32);
AnnaBridge 189:f392fc9709a3 146 }
AnnaBridge 189:f392fc9709a3 147
AnnaBridge 189:f392fc9709a3 148 uint32_t flash_get_start_address(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 149 {
AnnaBridge 189:f392fc9709a3 150 return FLASH_BASE;
AnnaBridge 189:f392fc9709a3 151 }
AnnaBridge 189:f392fc9709a3 152
AnnaBridge 189:f392fc9709a3 153 uint32_t flash_get_size(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 154 {
AnnaBridge 189:f392fc9709a3 155 return FLASH_SIZE;
AnnaBridge 189:f392fc9709a3 156 }
AnnaBridge 189:f392fc9709a3 157
AnnaBridge 189:f392fc9709a3 158 /**
AnnaBridge 189:f392fc9709a3 159 * @brief Gets the sector of a given address
AnnaBridge 189:f392fc9709a3 160 * @param Address: Flash address
AnnaBridge 189:f392fc9709a3 161 * @retval The sector of a given address
AnnaBridge 189:f392fc9709a3 162 */
AnnaBridge 189:f392fc9709a3 163 static uint32_t GetSector(uint32_t Address)
AnnaBridge 189:f392fc9709a3 164 {
AnnaBridge 189:f392fc9709a3 165 uint32_t sector = 0;
AnnaBridge 189:f392fc9709a3 166
AnnaBridge 189:f392fc9709a3 167 if (((Address < ADDR_FLASH_SECTOR_1_BANK1) && (Address >= ADDR_FLASH_SECTOR_0_BANK1)) || \
AnnaBridge 189:f392fc9709a3 168 ((Address < ADDR_FLASH_SECTOR_1_BANK2) && (Address >= ADDR_FLASH_SECTOR_0_BANK2))) {
AnnaBridge 189:f392fc9709a3 169 sector = FLASH_SECTOR_0;
AnnaBridge 189:f392fc9709a3 170 } else if (((Address < ADDR_FLASH_SECTOR_2_BANK1) && (Address >= ADDR_FLASH_SECTOR_1_BANK1)) || \
AnnaBridge 189:f392fc9709a3 171 ((Address < ADDR_FLASH_SECTOR_2_BANK2) && (Address >= ADDR_FLASH_SECTOR_1_BANK2))) {
AnnaBridge 189:f392fc9709a3 172 sector = FLASH_SECTOR_1;
AnnaBridge 189:f392fc9709a3 173 } else if (((Address < ADDR_FLASH_SECTOR_3_BANK1) && (Address >= ADDR_FLASH_SECTOR_2_BANK1)) || \
AnnaBridge 189:f392fc9709a3 174 ((Address < ADDR_FLASH_SECTOR_3_BANK2) && (Address >= ADDR_FLASH_SECTOR_2_BANK2))) {
AnnaBridge 189:f392fc9709a3 175 sector = FLASH_SECTOR_2;
AnnaBridge 189:f392fc9709a3 176 } else if (((Address < ADDR_FLASH_SECTOR_4_BANK1) && (Address >= ADDR_FLASH_SECTOR_3_BANK1)) || \
AnnaBridge 189:f392fc9709a3 177 ((Address < ADDR_FLASH_SECTOR_4_BANK2) && (Address >= ADDR_FLASH_SECTOR_3_BANK2))) {
AnnaBridge 189:f392fc9709a3 178 sector = FLASH_SECTOR_3;
AnnaBridge 189:f392fc9709a3 179 } else if (((Address < ADDR_FLASH_SECTOR_5_BANK1) && (Address >= ADDR_FLASH_SECTOR_4_BANK1)) || \
AnnaBridge 189:f392fc9709a3 180 ((Address < ADDR_FLASH_SECTOR_5_BANK2) && (Address >= ADDR_FLASH_SECTOR_4_BANK2))) {
AnnaBridge 189:f392fc9709a3 181 sector = FLASH_SECTOR_4;
AnnaBridge 189:f392fc9709a3 182 } else if (((Address < ADDR_FLASH_SECTOR_6_BANK1) && (Address >= ADDR_FLASH_SECTOR_5_BANK1)) || \
AnnaBridge 189:f392fc9709a3 183 ((Address < ADDR_FLASH_SECTOR_6_BANK2) && (Address >= ADDR_FLASH_SECTOR_5_BANK2))) {
AnnaBridge 189:f392fc9709a3 184 sector = FLASH_SECTOR_5;
AnnaBridge 189:f392fc9709a3 185 } else if (((Address < ADDR_FLASH_SECTOR_7_BANK1) && (Address >= ADDR_FLASH_SECTOR_6_BANK1)) || \
AnnaBridge 189:f392fc9709a3 186 ((Address < ADDR_FLASH_SECTOR_7_BANK2) && (Address >= ADDR_FLASH_SECTOR_6_BANK2))) {
AnnaBridge 189:f392fc9709a3 187 sector = FLASH_SECTOR_6;
AnnaBridge 189:f392fc9709a3 188 } else {
AnnaBridge 189:f392fc9709a3 189 sector = FLASH_SECTOR_7;
AnnaBridge 189:f392fc9709a3 190 }
AnnaBridge 189:f392fc9709a3 191
AnnaBridge 189:f392fc9709a3 192 return sector;
AnnaBridge 189:f392fc9709a3 193 }
AnnaBridge 189:f392fc9709a3 194
AnnaBridge 189:f392fc9709a3 195 /**
AnnaBridge 189:f392fc9709a3 196 * @brief Gets sector Size
AnnaBridge 189:f392fc9709a3 197 * @param None
AnnaBridge 189:f392fc9709a3 198 * @retval The size of a given sector
AnnaBridge 189:f392fc9709a3 199 */
AnnaBridge 189:f392fc9709a3 200 static uint32_t GetSectorSize(uint32_t Sector)
AnnaBridge 189:f392fc9709a3 201 {
AnnaBridge 189:f392fc9709a3 202 return (uint32_t)(128 * 1024); // 128 KB
AnnaBridge 189:f392fc9709a3 203 }
AnnaBridge 189:f392fc9709a3 204
AnnaBridge 189:f392fc9709a3 205 uint8_t flash_get_erase_value(const flash_t *obj)
AnnaBridge 189:f392fc9709a3 206 {
AnnaBridge 189:f392fc9709a3 207 (void)obj;
AnnaBridge 189:f392fc9709a3 208
AnnaBridge 189:f392fc9709a3 209 return 0xFF;
AnnaBridge 189:f392fc9709a3 210 }
AnnaBridge 189:f392fc9709a3 211
AnnaBridge 189:f392fc9709a3 212 #endif