目录
环境1. 资料2. 代码
环境
Keil : μVision V5.31.0.0Toolchain: MDK-ARM Plus Version: 5.31.0.0STM32 CubeMx: Version 6.1
1. 资料
这里使用的芯片Flash大小为 32 Kbyte,Page 大小为 1 Kbyte, Sector 大小为 4 个 Page。
2. 代码
#define HAL_FLASH_PAGE_COUNT 1
#define HAL_FLASH_PAGE_START (32 - HAL_FLASH_PAGE_COUNT)
#define HAL_FLASH_PAGE_SIZE (1024)
#define HAL_FLASH_SIZE (HAL_FLASH_PAGE_COUNT * HAL_FLASH_PAGE_SIZE)
#define HAL_FLASH_PAGE_ADDR (FLASH_BANK1_END - HAL_FLASH_SIZE)
#define HAL_FLASH_WORD_SIZE (10)
void hal_falsh_write(uint16_t index
, const uint16_t data
[], uint16_t size
)
{
uint16_t n
= 0, flash_cache
[HAL_FLASH_WORD_SIZE
];
assert_param(index
< HAL_FLASH_WORD_SIZE
);
for( n
= 0; n
< HAL_FLASH_WORD_SIZE
; n
++)
{
flash_cache
[n
] = *(__IO uint16_t
*)(HAL_FLASH_PAGE_ADDR
+ n
* 2);
}
for( n
= 0; n
< size
; n
++)
{
flash_cache
[index
+ n
] = data
[n
];
}
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef f
;
f
.TypeErase
= FLASH_TYPEERASE_PAGES
;
f
.PageAddress
= HAL_FLASH_PAGE_ADDR
;
f
.NbPages
= 1;
uint32_t PageError
= 0;
HAL_IWDG_Refresh(&hiwdg
);
HAL_FLASHEx_Erase(&f
, &PageError
);
for(n
= 0; n
< HAL_FLASH_WORD_SIZE
; n
++)
{
HAL_IWDG_Refresh(&hiwdg
);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD
, HAL_FLASH_PAGE_ADDR
+ (n
* 2), flash_cache
[n
]);
}
HAL_FLASH_Lock();
}
void hal_falsh_write_addr(uint32_t addr
, uint16_t data
)
{
FLASH_EraseInitTypeDef f
;
assert_param((HAL_FLASH_PAGE_ADDR
+ addr
) < FLASH_BANK1_END
);
HAL_FLASH_Unlock();
f
.TypeErase
= FLASH_TYPEERASE_PAGES
;
f
.PageAddress
= HAL_FLASH_PAGE_ADDR
;
f
.NbPages
= 1;
uint32_t PageError
= 0;
HAL_FLASHEx_Erase(&f
, &PageError
);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD
, HAL_FLASH_PAGE_ADDR
+ addr
, data
);
HAL_FLASH_Lock();
}
uint16_t
hal_falsh_read(uint16_t index
, uint16_t
*data
, uint16_t size
)
{
uint16_t n
= 0;
assert_param(index
< HAL_FLASH_WORD_SIZE
);
for(n
= 0; n
< size
; n
++) {
*data
= *(__IO uint16_t
*)(HAL_FLASH_PAGE_ADDR
+ (index
+ n
) * 2);
data
++;
}
return n
;
}