59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
#include "tos_k.h"
|
|
#include "stm32l4xx.h"
|
|
|
|
#define SECTOR_SIZE 2048 // sector size for stm32l431RCTX
|
|
|
|
int stm32l4_norflash_onchip_read(uint32_t addr, void *buf, size_t len)
|
|
{
|
|
memcpy(buf, (void *)addr, len);
|
|
return 0;
|
|
}
|
|
|
|
int stm32l4_norflash_onchip_write(uint32_t addr, const void *buf, size_t len)
|
|
{
|
|
int i = 0;
|
|
uint8_t *array = (uint8_t *)buf;
|
|
HAL_StatusTypeDef hal_status;
|
|
|
|
HAL_FLASH_Unlock();
|
|
tos_cpu_int_disable();
|
|
|
|
for (i = 0; i < len; i += 8) {
|
|
hal_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,
|
|
addr + i,
|
|
*(uint64_t *)&array[i]);
|
|
if (hal_status != HAL_OK) {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
HAL_FLASH_Lock();
|
|
tos_cpu_int_enable();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int stm32l4_norflash_onchip_erase(uint32_t addr, size_t size)
|
|
{
|
|
uint32_t page_err = 0;
|
|
HAL_StatusTypeDef hal_status;
|
|
FLASH_EraseInitTypeDef erase_para;
|
|
|
|
erase_para.TypeErase = FLASH_TYPEERASE_PAGES;
|
|
erase_para.Banks = FLASH_BANK_1;
|
|
erase_para.Page = addr / SECTOR_SIZE;
|
|
erase_para.NbPages = size / SECTOR_SIZE;
|
|
HAL_FLASH_Unlock();
|
|
tos_cpu_int_disable();
|
|
hal_status = HAL_FLASHEx_Erase(&erase_para, &page_err);
|
|
HAL_FLASH_Lock();
|
|
tos_cpu_int_enable();
|
|
|
|
if (hal_status != HAL_OK) {
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|