prj to mdks
This commit is contained in:
@@ -0,0 +1,341 @@
|
||||
|
||||
#include "bsp_flash.h"
|
||||
|
||||
static uint32_t _Get_STM32SectorIndex(uint32_t addr)
|
||||
{
|
||||
uint32_t sector = 0;
|
||||
|
||||
if ((addr < ADDR_FLASH_SECTOR_1) && (addr >= ADDR_FLASH_SECTOR_0))
|
||||
{
|
||||
sector = FLASH_SECTOR_0;
|
||||
}
|
||||
else if ((addr < ADDR_FLASH_SECTOR_2) && (addr >= ADDR_FLASH_SECTOR_1))
|
||||
{
|
||||
sector = FLASH_SECTOR_1;
|
||||
}
|
||||
else if ((addr < ADDR_FLASH_SECTOR_3) && (addr >= ADDR_FLASH_SECTOR_2))
|
||||
{
|
||||
sector = FLASH_SECTOR_2;
|
||||
}
|
||||
else if ((addr < ADDR_FLASH_SECTOR_4) && (addr >= ADDR_FLASH_SECTOR_3))
|
||||
{
|
||||
sector = FLASH_SECTOR_3;
|
||||
}
|
||||
else if ((addr < ADDR_FLASH_SECTOR_5) && (addr >= ADDR_FLASH_SECTOR_4))
|
||||
{
|
||||
sector = FLASH_SECTOR_4;
|
||||
}
|
||||
#if defined(FLASH_SECTOR_5)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_6) && (addr >= ADDR_FLASH_SECTOR_5))
|
||||
{
|
||||
sector = FLASH_SECTOR_5;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_6)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_7) && (addr >= ADDR_FLASH_SECTOR_6))
|
||||
{
|
||||
sector = FLASH_SECTOR_6;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_7)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_8) && (addr >= ADDR_FLASH_SECTOR_7))
|
||||
{
|
||||
sector = FLASH_SECTOR_7;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_8)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_9) && (addr >= ADDR_FLASH_SECTOR_8))
|
||||
{
|
||||
sector = FLASH_SECTOR_8;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_9)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_10) && (addr >= ADDR_FLASH_SECTOR_9))
|
||||
{
|
||||
sector = FLASH_SECTOR_9;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_10)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_11) && (addr >= ADDR_FLASH_SECTOR_10))
|
||||
{
|
||||
sector = FLASH_SECTOR_10;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_11)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_12) && (addr >= ADDR_FLASH_SECTOR_11))
|
||||
{
|
||||
sector = FLASH_SECTOR_11;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_12)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_13) && (addr >= ADDR_FLASH_SECTOR_12))
|
||||
{
|
||||
sector = FLASH_SECTOR_12;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_13)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_14) && (addr >= ADDR_FLASH_SECTOR_13))
|
||||
{
|
||||
sector = FLASH_SECTOR_13;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_14)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_15) && (addr >= ADDR_FLASH_SECTOR_14))
|
||||
{
|
||||
sector = FLASH_SECTOR_14;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_15)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_16) && (addr >= ADDR_FLASH_SECTOR_15))
|
||||
{
|
||||
sector = FLASH_SECTOR_15;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_16)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_17) && (addr >= ADDR_FLASH_SECTOR_16))
|
||||
{
|
||||
sector = FLASH_SECTOR_16;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_17)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_18) && (addr >= ADDR_FLASH_SECTOR_17))
|
||||
{
|
||||
sector = FLASH_SECTOR_17;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_18)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_19) && (addr >= ADDR_FLASH_SECTOR_18))
|
||||
{
|
||||
sector = FLASH_SECTOR_18;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_19)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_20) && (addr >= ADDR_FLASH_SECTOR_19))
|
||||
{
|
||||
sector = FLASH_SECTOR_19;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_20)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_21) && (addr >= ADDR_FLASH_SECTOR_20))
|
||||
{
|
||||
sector = FLASH_SECTOR_20;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_21)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_22) && (addr >= ADDR_FLASH_SECTOR_21))
|
||||
{
|
||||
sector = FLASH_SECTOR_21;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_22)
|
||||
else if ((addr < ADDR_FLASH_SECTOR_23) && (addr >= ADDR_FLASH_SECTOR_22))
|
||||
{
|
||||
sector = FLASH_SECTOR_22;
|
||||
}
|
||||
#endif
|
||||
#if defined(FLASH_SECTOR_23)
|
||||
else /* (addr < FLASH_END_ADDR) && (addr >= ADDR_FLASH_SECTOR_23) */
|
||||
{
|
||||
sector = FLASH_SECTOR_23;
|
||||
}
|
||||
#endif
|
||||
|
||||
return sector;
|
||||
}
|
||||
|
||||
int read(long offset, uint8_t *buf, size_t size)
|
||||
{
|
||||
size_t i = 0;
|
||||
uint32_t addr = offset;
|
||||
|
||||
if ((addr + size) > OFFSET_ONCHIP_FLASH_END) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < size; i++, buf++, addr++) {
|
||||
*buf = *(uint8_t *) addr;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int write(long offset, const uint8_t *buf, size_t size)
|
||||
{
|
||||
int status = 0;
|
||||
uint32_t addr = offset;
|
||||
uint32_t end_addr = addr + size;
|
||||
|
||||
if (end_addr > OFFSET_ONCHIP_FLASH_END) {
|
||||
printf("%s:%d\r\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (size < 1) {
|
||||
printf("%s:%d\r\n", __func__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t data_len = size * sizeof(uint32_t);
|
||||
uint32_t *data = (uint32_t *)buf;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
/* Clear pending flags (if any) */
|
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
|
||||
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
|
||||
|
||||
for (uint32_t i = 0;
|
||||
(i < data_len) && (addr <= (end_addr - sizeof(uint32_t)));
|
||||
i++)
|
||||
{
|
||||
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
|
||||
be done by word */
|
||||
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, addr, *(uint32_t *)(data + i)) == HAL_OK)
|
||||
{
|
||||
/* Check the written value */
|
||||
if (*(uint32_t *)addr != *(uint32_t *)(data + i))
|
||||
{
|
||||
/* Flash content doesn't match SRAM content */
|
||||
status = -1;
|
||||
break;
|
||||
}
|
||||
/* Increment FLASH destination address */
|
||||
addr += sizeof(uint32_t);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Error occurred while writing data in Flash memory */
|
||||
status = -2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
|
||||
if (status < 0) {
|
||||
printf("%s:%d %d\r\n", __func__, __LINE__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int erase(long offset, size_t size)
|
||||
{
|
||||
uint32_t page_err = 0;
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
FLASH_EraseInitTypeDef erase_init = {0};
|
||||
|
||||
uint32_t addr = offset;
|
||||
uint32_t end_addr = addr + size;
|
||||
|
||||
if (end_addr > OFFSET_ONCHIP_FLASH_END) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
/* Clear pending flags (if any) */
|
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
|
||||
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
|
||||
|
||||
uint8_t sector_count;
|
||||
uint32_t sector_head_num;
|
||||
uint32_t sector_end_num;
|
||||
|
||||
sector_head_num = _Get_STM32SectorIndex( addr );
|
||||
|
||||
sector_end_num = _Get_STM32SectorIndex( end_addr-1 );
|
||||
|
||||
sector_count = sector_end_num - sector_head_num;
|
||||
sector_count ++;
|
||||
|
||||
#if (ENABLE_DB1M_BIT)
|
||||
if (sector_head_num > FLASH_SECTOR_7)
|
||||
sector_head_num += 4;
|
||||
#endif
|
||||
|
||||
erase_init.TypeErase = TYPEERASE_SECTORS;
|
||||
erase_init.Sector = sector_head_num;
|
||||
erase_init.NbSectors = sector_count;
|
||||
erase_init.VoltageRange = VOLTAGE_RANGE_3;
|
||||
|
||||
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
|
||||
you have to make sure that these data are rewritten before they are accessed during code
|
||||
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
|
||||
DCRST and ICRST bits in the FLASH_CR register. */
|
||||
status = HAL_FLASHEx_Erase(&erase_init, &page_err);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
|
||||
if (status != HAL_OK)
|
||||
return -2;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static struct BSP_FLASH *_part_head;
|
||||
|
||||
static void _Flash_Add(struct BSP_FLASH *part)
|
||||
{
|
||||
struct BSP_FLASH *target;
|
||||
|
||||
for (target = _part_head; target != NULL; target = target->next)
|
||||
{
|
||||
if (target == part)
|
||||
return;
|
||||
}
|
||||
|
||||
part->next = _part_head;
|
||||
_part_head = part;
|
||||
}
|
||||
|
||||
void BSP_Flash_Init(struct BSP_FLASH *part, const char *name, uint32_t addr, uint32_t size)
|
||||
{
|
||||
ASSERT(part != NULL);
|
||||
|
||||
memcpy(part->name, name, MAX_NAME_LEN);
|
||||
part->addr = addr;
|
||||
part->len = size;
|
||||
|
||||
_Flash_Add(part);
|
||||
}
|
||||
|
||||
int BSP_Flash_Read(const struct BSP_FLASH *part, uint32_t relative_addr, uint8_t *buff, uint32_t size)
|
||||
{
|
||||
ASSERT(part != NULL);
|
||||
|
||||
return read(part->addr + relative_addr, buff, size);
|
||||
}
|
||||
|
||||
inline int BSP_Flash_Write(const struct BSP_FLASH *part, uint32_t relative_addr, const uint8_t *buff, uint32_t size)
|
||||
{
|
||||
ASSERT(part != NULL);
|
||||
|
||||
return write(part->addr + relative_addr, buff, size);
|
||||
}
|
||||
|
||||
inline int BSP_Flash_Erase(const struct BSP_FLASH *part, uint32_t relative_addr, uint32_t size)
|
||||
{
|
||||
ASSERT(part != NULL);
|
||||
|
||||
return erase(part->addr + relative_addr, size);
|
||||
}
|
||||
|
||||
struct BSP_FLASH *BSP_Flash_GetHandle(const char *part_name)
|
||||
{
|
||||
struct BSP_FLASH *part;
|
||||
|
||||
for (part = _part_head; part != NULL; part = part->next)
|
||||
{
|
||||
if (strncmp(part->name, part_name, MAX_NAME_LEN) == 0)
|
||||
return part;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user