first commit for chrg

This commit is contained in:
wmano
2025-08-16 22:58:22 +08:00
commit 52a3ed5862
2306 changed files with 1021208 additions and 0 deletions
+341
View File
@@ -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;
}