mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 *******************************************************************************
be_bryan 0:b74591d5ab33 3 * Copyright (c) 2017, STMicroelectronics
be_bryan 0:b74591d5ab33 4 * All rights reserved.
be_bryan 0:b74591d5ab33 5 *
be_bryan 0:b74591d5ab33 6 * Redistribution and use in source and binary forms, with or without
be_bryan 0:b74591d5ab33 7 * modification, are permitted provided that the following conditions are met:
be_bryan 0:b74591d5ab33 8 *
be_bryan 0:b74591d5ab33 9 * 1. Redistributions of source code must retain the above copyright notice,
be_bryan 0:b74591d5ab33 10 * this list of conditions and the following disclaimer.
be_bryan 0:b74591d5ab33 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
be_bryan 0:b74591d5ab33 12 * this list of conditions and the following disclaimer in the documentation
be_bryan 0:b74591d5ab33 13 * and/or other materials provided with the distribution.
be_bryan 0:b74591d5ab33 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
be_bryan 0:b74591d5ab33 15 * may be used to endorse or promote products derived from this software
be_bryan 0:b74591d5ab33 16 * without specific prior written permission.
be_bryan 0:b74591d5ab33 17 *
be_bryan 0:b74591d5ab33 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
be_bryan 0:b74591d5ab33 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
be_bryan 0:b74591d5ab33 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
be_bryan 0:b74591d5ab33 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
be_bryan 0:b74591d5ab33 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
be_bryan 0:b74591d5ab33 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
be_bryan 0:b74591d5ab33 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
be_bryan 0:b74591d5ab33 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
be_bryan 0:b74591d5ab33 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
be_bryan 0:b74591d5ab33 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
be_bryan 0:b74591d5ab33 28 *******************************************************************************
be_bryan 0:b74591d5ab33 29 */
be_bryan 0:b74591d5ab33 30
be_bryan 0:b74591d5ab33 31 #if DEVICE_FLASH
be_bryan 0:b74591d5ab33 32 #include "flash_api.h"
be_bryan 0:b74591d5ab33 33 #include "flash_data.h"
be_bryan 0:b74591d5ab33 34 #include "platform/mbed_critical.h"
be_bryan 0:b74591d5ab33 35
be_bryan 0:b74591d5ab33 36 static uint32_t GetSector(uint32_t Address);
be_bryan 0:b74591d5ab33 37 static uint32_t GetSectorSize(uint32_t Sector);
be_bryan 0:b74591d5ab33 38
be_bryan 0:b74591d5ab33 39 int32_t flash_init(flash_t *obj)
be_bryan 0:b74591d5ab33 40 {
be_bryan 0:b74591d5ab33 41 return 0;
be_bryan 0:b74591d5ab33 42 }
be_bryan 0:b74591d5ab33 43 int32_t flash_free(flash_t *obj)
be_bryan 0:b74591d5ab33 44 {
be_bryan 0:b74591d5ab33 45 return 0;
be_bryan 0:b74591d5ab33 46 }
be_bryan 0:b74591d5ab33 47
be_bryan 0:b74591d5ab33 48 static int32_t flash_unlock(void)
be_bryan 0:b74591d5ab33 49 {
be_bryan 0:b74591d5ab33 50 /* Allow Access to Flash control registers and user Falsh */
be_bryan 0:b74591d5ab33 51 if (HAL_FLASH_Unlock()) {
be_bryan 0:b74591d5ab33 52 return -1;
be_bryan 0:b74591d5ab33 53 } else {
be_bryan 0:b74591d5ab33 54 return 0;
be_bryan 0:b74591d5ab33 55 }
be_bryan 0:b74591d5ab33 56 }
be_bryan 0:b74591d5ab33 57
be_bryan 0:b74591d5ab33 58 static int32_t flash_lock(void)
be_bryan 0:b74591d5ab33 59 {
be_bryan 0:b74591d5ab33 60 /* Disable the Flash option control register access (recommended to protect
be_bryan 0:b74591d5ab33 61 the option Bytes against possible unwanted operations) */
be_bryan 0:b74591d5ab33 62 if (HAL_FLASH_Lock()) {
be_bryan 0:b74591d5ab33 63 return -1;
be_bryan 0:b74591d5ab33 64 } else {
be_bryan 0:b74591d5ab33 65 return 0;
be_bryan 0:b74591d5ab33 66 }
be_bryan 0:b74591d5ab33 67 }
be_bryan 0:b74591d5ab33 68
be_bryan 0:b74591d5ab33 69 int32_t flash_erase_sector(flash_t *obj, uint32_t address)
be_bryan 0:b74591d5ab33 70 {
be_bryan 0:b74591d5ab33 71 /* Variable used for Erase procedure */
be_bryan 0:b74591d5ab33 72 FLASH_EraseInitTypeDef EraseInitStruct;
be_bryan 0:b74591d5ab33 73 FLASH_OBProgramInitTypeDef OBInit;
be_bryan 0:b74591d5ab33 74 uint32_t SectorId;
be_bryan 0:b74591d5ab33 75 uint32_t SectorError = 0;
be_bryan 0:b74591d5ab33 76 int32_t status = 0;
be_bryan 0:b74591d5ab33 77
be_bryan 0:b74591d5ab33 78 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
be_bryan 0:b74591d5ab33 79 return -1;
be_bryan 0:b74591d5ab33 80 }
be_bryan 0:b74591d5ab33 81
be_bryan 0:b74591d5ab33 82 if (flash_unlock() != HAL_OK) {
be_bryan 0:b74591d5ab33 83 return -1;
be_bryan 0:b74591d5ab33 84 }
be_bryan 0:b74591d5ab33 85
be_bryan 0:b74591d5ab33 86 /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
be_bryan 0:b74591d5ab33 87 you have to make sure that these data are rewritten before they are accessed during code
be_bryan 0:b74591d5ab33 88 execution. If this cannot be done safely, it is recommended to flush the caches by setting the
be_bryan 0:b74591d5ab33 89 DCRST and ICRST bits in the FLASH_CR register. */
be_bryan 0:b74591d5ab33 90 __HAL_FLASH_ART_DISABLE();
be_bryan 0:b74591d5ab33 91 __HAL_FLASH_ART_RESET();
be_bryan 0:b74591d5ab33 92 __HAL_FLASH_ART_ENABLE();
be_bryan 0:b74591d5ab33 93
be_bryan 0:b74591d5ab33 94 /* Get the 1st sector to erase */
be_bryan 0:b74591d5ab33 95 SectorId = GetSector(address);
be_bryan 0:b74591d5ab33 96
be_bryan 0:b74591d5ab33 97 /* Allow Access to option bytes sector */
be_bryan 0:b74591d5ab33 98 HAL_FLASH_OB_Unlock();
be_bryan 0:b74591d5ab33 99 /* Get the Dual bank configuration status */
be_bryan 0:b74591d5ab33 100 HAL_FLASHEx_OBGetConfig(&OBInit);
be_bryan 0:b74591d5ab33 101 /* Allow Access to option bytes sector */
be_bryan 0:b74591d5ab33 102 HAL_FLASH_OB_Lock();
be_bryan 0:b74591d5ab33 103
be_bryan 0:b74591d5ab33 104 #if defined (FLASH_OPTCR_nDBANK)
be_bryan 0:b74591d5ab33 105 /* On targets that support dynamic single or dual bank configuration
be_bryan 0:b74591d5ab33 106 * Check that we're in SINGLE Bank mode, only supported mode now.
be_bryan 0:b74591d5ab33 107 */
be_bryan 0:b74591d5ab33 108 if((OBInit.USERConfig & OB_NDBANK_SINGLE_BANK) != OB_NDBANK_SINGLE_BANK) {
be_bryan 0:b74591d5ab33 109 /* We don't support the DUAL BANK MODE for now, so return error */
be_bryan 0:b74591d5ab33 110 return -1;
be_bryan 0:b74591d5ab33 111 }
be_bryan 0:b74591d5ab33 112 #endif
be_bryan 0:b74591d5ab33 113
be_bryan 0:b74591d5ab33 114 /* Fill EraseInit structure*/
be_bryan 0:b74591d5ab33 115 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
be_bryan 0:b74591d5ab33 116 EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
be_bryan 0:b74591d5ab33 117 EraseInitStruct.Sector = SectorId;
be_bryan 0:b74591d5ab33 118 EraseInitStruct.NbSectors = 1;
be_bryan 0:b74591d5ab33 119
be_bryan 0:b74591d5ab33 120 if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
be_bryan 0:b74591d5ab33 121 status = -1;
be_bryan 0:b74591d5ab33 122 }
be_bryan 0:b74591d5ab33 123
be_bryan 0:b74591d5ab33 124 flash_lock();
be_bryan 0:b74591d5ab33 125
be_bryan 0:b74591d5ab33 126 return status;
be_bryan 0:b74591d5ab33 127 }
be_bryan 0:b74591d5ab33 128
be_bryan 0:b74591d5ab33 129 int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
be_bryan 0:b74591d5ab33 130 uint32_t size)
be_bryan 0:b74591d5ab33 131 {
be_bryan 0:b74591d5ab33 132 int32_t status = 0;
be_bryan 0:b74591d5ab33 133
be_bryan 0:b74591d5ab33 134 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
be_bryan 0:b74591d5ab33 135 return -1;
be_bryan 0:b74591d5ab33 136 }
be_bryan 0:b74591d5ab33 137
be_bryan 0:b74591d5ab33 138 if (flash_unlock() != HAL_OK) {
be_bryan 0:b74591d5ab33 139 return -1;
be_bryan 0:b74591d5ab33 140 }
be_bryan 0:b74591d5ab33 141
be_bryan 0:b74591d5ab33 142 /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
be_bryan 0:b74591d5ab33 143 you have to make sure that these data are rewritten before they are accessed during code
be_bryan 0:b74591d5ab33 144 execution. If this cannot be done safely, it is recommended to flush the caches by setting the
be_bryan 0:b74591d5ab33 145 DCRST and ICRST bits in the FLASH_CR register. */
be_bryan 0:b74591d5ab33 146 __HAL_FLASH_ART_DISABLE();
be_bryan 0:b74591d5ab33 147 __HAL_FLASH_ART_RESET();
be_bryan 0:b74591d5ab33 148 __HAL_FLASH_ART_ENABLE();
be_bryan 0:b74591d5ab33 149
be_bryan 0:b74591d5ab33 150 while ((size > 0) && (status == 0)) {
be_bryan 0:b74591d5ab33 151 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE,
be_bryan 0:b74591d5ab33 152 address, (uint64_t)*data) != HAL_OK) {
be_bryan 0:b74591d5ab33 153 status = -1;
be_bryan 0:b74591d5ab33 154 } else {
be_bryan 0:b74591d5ab33 155 size--;
be_bryan 0:b74591d5ab33 156 address++;
be_bryan 0:b74591d5ab33 157 data++;
be_bryan 0:b74591d5ab33 158 }
be_bryan 0:b74591d5ab33 159 }
be_bryan 0:b74591d5ab33 160
be_bryan 0:b74591d5ab33 161 flash_lock();
be_bryan 0:b74591d5ab33 162
be_bryan 0:b74591d5ab33 163 return status;
be_bryan 0:b74591d5ab33 164 }
be_bryan 0:b74591d5ab33 165
be_bryan 0:b74591d5ab33 166 uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
be_bryan 0:b74591d5ab33 167 {
be_bryan 0:b74591d5ab33 168 if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
be_bryan 0:b74591d5ab33 169 return MBED_FLASH_INVALID_SIZE;
be_bryan 0:b74591d5ab33 170 }
be_bryan 0:b74591d5ab33 171
be_bryan 0:b74591d5ab33 172 return (GetSectorSize(GetSector(address)));
be_bryan 0:b74591d5ab33 173 }
be_bryan 0:b74591d5ab33 174
be_bryan 0:b74591d5ab33 175 uint32_t flash_get_page_size(const flash_t *obj)
be_bryan 0:b74591d5ab33 176 {
be_bryan 0:b74591d5ab33 177 // Flash of STM32F7 devices can be programed 1 byte at a time
be_bryan 0:b74591d5ab33 178 return (1);
be_bryan 0:b74591d5ab33 179 }
be_bryan 0:b74591d5ab33 180
be_bryan 0:b74591d5ab33 181 uint32_t flash_get_start_address(const flash_t *obj)
be_bryan 0:b74591d5ab33 182 {
be_bryan 0:b74591d5ab33 183 return FLASH_BASE;
be_bryan 0:b74591d5ab33 184 }
be_bryan 0:b74591d5ab33 185 uint32_t flash_get_size(const flash_t *obj)
be_bryan 0:b74591d5ab33 186 {
be_bryan 0:b74591d5ab33 187 return FLASH_SIZE;
be_bryan 0:b74591d5ab33 188 }
be_bryan 0:b74591d5ab33 189
be_bryan 0:b74591d5ab33 190 /**
be_bryan 0:b74591d5ab33 191 * @brief Gets the sector of a given address
be_bryan 0:b74591d5ab33 192 * @param None
be_bryan 0:b74591d5ab33 193 * @retval The sector of a given address
be_bryan 0:b74591d5ab33 194 */
be_bryan 0:b74591d5ab33 195 static uint32_t GetSector(uint32_t address)
be_bryan 0:b74591d5ab33 196 {
be_bryan 0:b74591d5ab33 197 uint32_t sector = 0;
be_bryan 0:b74591d5ab33 198 uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
be_bryan 0:b74591d5ab33 199
be_bryan 0:b74591d5ab33 200 if (address < ADDR_FLASH_SECTOR_4) {
be_bryan 0:b74591d5ab33 201 // 32k sectorsize
be_bryan 0:b74591d5ab33 202 sector += tmp >>15;
be_bryan 0:b74591d5ab33 203 } else if (address < ADDR_FLASH_SECTOR_5) {
be_bryan 0:b74591d5ab33 204 //64k sector size
be_bryan 0:b74591d5ab33 205 sector += FLASH_SECTOR_4;
be_bryan 0:b74591d5ab33 206 } else {
be_bryan 0:b74591d5ab33 207 sector += 4 + (tmp >>18);
be_bryan 0:b74591d5ab33 208 }
be_bryan 0:b74591d5ab33 209
be_bryan 0:b74591d5ab33 210 return sector;
be_bryan 0:b74591d5ab33 211 }
be_bryan 0:b74591d5ab33 212
be_bryan 0:b74591d5ab33 213 /**
be_bryan 0:b74591d5ab33 214 * @brief Gets sector Size
be_bryan 0:b74591d5ab33 215 * @param None
be_bryan 0:b74591d5ab33 216 * @retval The size of a given sector
be_bryan 0:b74591d5ab33 217 */
be_bryan 0:b74591d5ab33 218 static uint32_t GetSectorSize(uint32_t Sector)
be_bryan 0:b74591d5ab33 219 {
be_bryan 0:b74591d5ab33 220 uint32_t sectorsize = 0x00;
be_bryan 0:b74591d5ab33 221 if ((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) ||\
be_bryan 0:b74591d5ab33 222 (Sector == FLASH_SECTOR_2) || (Sector == FLASH_SECTOR_3)) {
be_bryan 0:b74591d5ab33 223 sectorsize = 32 * 1024;
be_bryan 0:b74591d5ab33 224 } else if (Sector == FLASH_SECTOR_4) {
be_bryan 0:b74591d5ab33 225 sectorsize = 128 * 1024;
be_bryan 0:b74591d5ab33 226 } else {
be_bryan 0:b74591d5ab33 227 sectorsize = 256 * 1024;
be_bryan 0:b74591d5ab33 228 }
be_bryan 0:b74591d5ab33 229
be_bryan 0:b74591d5ab33 230 return sectorsize;
be_bryan 0:b74591d5ab33 231 }
be_bryan 0:b74591d5ab33 232
be_bryan 0:b74591d5ab33 233 #endif