mirror of https://github.com/FOME-Tech/fome-fw.git
H7 flash supports both banks!
This commit is contained in:
parent
cef93b1c48
commit
ee89ab88d6
|
@ -15,18 +15,13 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// Use bank 2 on H7
|
// Use bank 2 on H7
|
||||||
// TODO: Support bank 1 as well for the bootloader to work properly!
|
#define FLASH_CR ((ctlr) ? FLASH->CR2 : FLASH->CR1)
|
||||||
#define FLASH_CR FLASH->CR2
|
#define FLASH_SR ((ctlr) ? FLASH->SR2 : FLASH->SR1)
|
||||||
#define FLASH_SR FLASH->SR2
|
#define FLASH_KEYR ((ctlr) ? FLASH->KEYR2 : FLASH->KEYR1)
|
||||||
#define FLASH_KEYR FLASH->KEYR2
|
|
||||||
|
|
||||||
// I have no idea why ST changed the register name from STRT -> START
|
// I have no idea why ST changed the register name from STRT -> START
|
||||||
#define FLASH_CR_STRT FLASH_CR_START
|
#define FLASH_CR_STRT FLASH_CR_START
|
||||||
|
|
||||||
#undef FLASH_BASE
|
|
||||||
// This is the start of the second bank, since H7 sector numbers are bank relative
|
|
||||||
#define FLASH_BASE 0x08100000
|
|
||||||
|
|
||||||
// QW bit supercedes the older BSY bit
|
// QW bit supercedes the older BSY bit
|
||||||
#define intFlashWaitWhileBusy() do { __DSB(); } while (FLASH_SR & FLASH_SR_QW);
|
#define intFlashWaitWhileBusy() do { __DSB(); } while (FLASH_SR & FLASH_SR_QW);
|
||||||
|
|
||||||
|
@ -39,12 +34,12 @@ flashaddr_t intFlashSectorBegin(flashsector_t sector) {
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intFlashClearErrors(void)
|
static void intFlashClearErrors(uint8_t ctlr)
|
||||||
{
|
{
|
||||||
FLASH->CCR2 = 0xffffffff;
|
ctlr ? FLASH->CCR2 : FLASH->CCR1 = 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int intFlashCheckErrors(void)
|
static int intFlashCheckErrors(uint8_t ctlr)
|
||||||
{
|
{
|
||||||
uint32_t sr = FLASH_SR;
|
uint32_t sr = FLASH_SR;
|
||||||
|
|
||||||
|
@ -79,7 +74,7 @@ static int intFlashCheckErrors(void)
|
||||||
* @return HAL_SUCCESS Unlock was successful.
|
* @return HAL_SUCCESS Unlock was successful.
|
||||||
* @return HAL_FAILED Unlock failed.
|
* @return HAL_FAILED Unlock failed.
|
||||||
*/
|
*/
|
||||||
static bool intFlashUnlock(void) {
|
static bool intFlashUnlock(size_t ctlr) {
|
||||||
/* Check if unlock is really needed */
|
/* Check if unlock is really needed */
|
||||||
if (!(FLASH_CR & FLASH_CR_LOCK))
|
if (!(FLASH_CR & FLASH_CR_LOCK))
|
||||||
return HAL_SUCCESS;
|
return HAL_SUCCESS;
|
||||||
|
@ -101,17 +96,28 @@ static bool intFlashUnlock(void) {
|
||||||
|
|
||||||
int intFlashSectorErase(flashsector_t sector) {
|
int intFlashSectorErase(flashsector_t sector) {
|
||||||
int ret;
|
int ret;
|
||||||
uint8_t sectorRegIdx = sector;
|
uint8_t sectorRegIdx;
|
||||||
|
|
||||||
|
uint8_t ctlr;
|
||||||
|
|
||||||
|
if (sector >= 8) {
|
||||||
|
// Use second bank's controller: convert to sector within the bank
|
||||||
|
ctlr = 1;
|
||||||
|
sectorRegIdx = sector - 8;
|
||||||
|
} else {
|
||||||
|
ctlr = 0;
|
||||||
|
sectorRegIdx = sector;
|
||||||
|
}
|
||||||
|
|
||||||
/* Unlock flash for write access */
|
/* Unlock flash for write access */
|
||||||
if (intFlashUnlock() == HAL_FAILED)
|
if (intFlashUnlock(ctlr) == HAL_FAILED)
|
||||||
return FLASH_RETURN_NO_PERMISSION;
|
return FLASH_RETURN_NO_PERMISSION;
|
||||||
|
|
||||||
/* Wait for any busy flags. */
|
/* Wait for any busy flags. */
|
||||||
intFlashWaitWhileBusy();
|
intFlashWaitWhileBusy();
|
||||||
|
|
||||||
/* Clearing error status bits.*/
|
/* Clearing error status bits.*/
|
||||||
intFlashClearErrors();
|
intFlashClearErrors(ctlr);
|
||||||
|
|
||||||
/* Setup parallelism before any program/erase */
|
/* Setup parallelism before any program/erase */
|
||||||
FLASH_CR &= ~FLASH_CR_PSIZE_MASK;
|
FLASH_CR &= ~FLASH_CR_PSIZE_MASK;
|
||||||
|
@ -141,10 +147,9 @@ int intFlashSectorErase(flashsector_t sector) {
|
||||||
FLASH_CR &= ~FLASH_CR_SER;
|
FLASH_CR &= ~FLASH_CR_SER;
|
||||||
|
|
||||||
/* Lock flash again */
|
/* Lock flash again */
|
||||||
intFlashLock()
|
intFlashLock();
|
||||||
;
|
|
||||||
|
|
||||||
ret = intFlashCheckErrors();
|
ret = intFlashCheckErrors(ctlr);
|
||||||
if (ret != FLASH_RETURN_SUCCESS)
|
if (ret != FLASH_RETURN_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -157,8 +162,12 @@ int intFlashSectorErase(flashsector_t sector) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int intFlashWrite(flashaddr_t address, const char* buffer, size_t size) {
|
int intFlashWrite(flashaddr_t address, const char* buffer, size_t size) {
|
||||||
|
// Select the appropriate controller for this address
|
||||||
|
flashsector_t sector = intFlashSectorAt(address);
|
||||||
|
uint8_t ctlr = sector >= 8;
|
||||||
|
|
||||||
/* Unlock flash for write access */
|
/* Unlock flash for write access */
|
||||||
if (intFlashUnlock() == HAL_FAILED)
|
if (intFlashUnlock(ctlr) == HAL_FAILED)
|
||||||
return FLASH_RETURN_NO_PERMISSION;
|
return FLASH_RETURN_NO_PERMISSION;
|
||||||
|
|
||||||
/* Wait for any busy flags */
|
/* Wait for any busy flags */
|
||||||
|
|
Loading…
Reference in New Issue