Add basic flash impl
This commit is contained in:
Родитель
0d4338f0c2
Коммит
67bf6cd0d9
|
@ -1,6 +1,7 @@
|
|||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 32K
|
||||
/* Last 1k is for settings */
|
||||
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 32K - 1K
|
||||
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 4K
|
||||
}
|
||||
INCLUDE ld/gcc_arm.ld
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "hwconfig.h"
|
||||
|
||||
#define RAM_FUNC __attribute__((noinline, long_call, section(".data")))
|
||||
|
||||
// exti.c
|
||||
|
@ -58,3 +60,8 @@ int target_in_irq(void);
|
|||
// init.c
|
||||
bool clk_is_pll(void);
|
||||
void clk_set_pll(int on);
|
||||
|
||||
|
||||
// flash.c
|
||||
void flash_program(void *dst, const void *src, uint32_t len);
|
||||
void flash_erase(void *page_addr);
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
#include "jdstm.h"
|
||||
|
||||
#define WAIT_BUSY() \
|
||||
while (FLASH->SR & FLASH_SR_BSY) \
|
||||
;
|
||||
|
||||
static void unlock() {
|
||||
WAIT_BUSY();
|
||||
if (FLASH->CR & FLASH_CR_LOCK) {
|
||||
FLASH->KEYR = 0x45670123;
|
||||
FLASH->KEYR = 0xCDEF89AB;
|
||||
}
|
||||
}
|
||||
|
||||
static void lock() {
|
||||
FLASH->CR &= ~(FLASH_CR_PG | FLASH_CR_PER);
|
||||
FLASH->CR |= FLASH_CR_LOCK;
|
||||
}
|
||||
|
||||
static void check_eop() {
|
||||
WAIT_BUSY();
|
||||
if (FLASH->SR & FLASH_SR_EOP)
|
||||
FLASH->SR = FLASH_SR_EOP;
|
||||
else
|
||||
jd_panic();
|
||||
}
|
||||
|
||||
void flash_program(void *dst, const void *src, uint32_t len) {
|
||||
if ((((uint32_t)dst) & 1) || (((uint32_t)src) & 1) || (len & 1))
|
||||
jd_panic();
|
||||
|
||||
unlock();
|
||||
FLASH->CR |= FLASH_CR_PG; // enable programming
|
||||
|
||||
while (len--) {
|
||||
*(__IO uint16_t *)(dst) = *(uint16_t *)src;
|
||||
check_eop();
|
||||
dst = (uint16_t *)dst + 1;
|
||||
src = (uint16_t *)src + 1;
|
||||
}
|
||||
|
||||
lock();
|
||||
}
|
||||
|
||||
void flash_erase(void *page_addr) {
|
||||
unlock();
|
||||
FLASH->CR |= FLASH_CR_PER;
|
||||
FLASH->AR = (uint32_t)page_addr;
|
||||
FLASH->CR |= FLASH_CR_STRT;
|
||||
check_eop();
|
||||
lock();
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#if defined(STM32F030x4)
|
||||
#define STM32F030x6 1 // HAL requires that
|
||||
#define FLASH_PAGE_SIZE 1024
|
||||
#define FLASH_PAGES 16
|
||||
#elif defined(STM32F031x6)
|
||||
#define FLASH_PAGE_SIZE 1024
|
||||
#define FLASH_PAGES 32
|
||||
#else
|
||||
#error "define flash size"
|
||||
#endif
|
||||
|
||||
#define FLASH_SIZE (FLASH_PAGE_SIZE * FLASH_PAGES)
|
||||
#define SETTINGS_START (FLASH_SIZE - FLASH_PAGE_SIZE)
|
||||
#define SETTINGS_SIZE FLASH_PAGE_SIZE
|
Загрузка…
Ссылка в новой задаче