Эх хорошо выходные,можно заняться любимым делом хоть ))
Почитав Ссылка и разобравшись с флэш памятью для сохранения настроек и т д решил написать заметку.
Конечно не очень удобно для записи например 3 байт стирать все время одну страницу памяти,но как есть.
Решил записывать в последнюю страницу памяти начиная с 0х0801FC00 три переменные с помощью HAL , хотя легко можно было и на регистрах это сделать. Заодно подумал по изучать HAL навороченный.
Запись
FLASH_EraseInitTypeDef Flash_erase;
HAL_StatusTypeDef Return_erase=NULL;
HAL_StatusTypeDef flash_ok = HAL_ERROR;
uint32_t Error=0;
uint16_t Write_flash_yst=0,Write_flash_giz=0,Write_flash_on=0;
Flash_erase.TypeErase=FLASH_TYPEERASE_PAGES;
Flash_erase.PageAddress=0x0801FC00;
Flash_erase.Banks=FLASH_BANK_1;
Flash_erase.NbPages=1;
// erase sector and write ystavok, bank 127 c adress
// 0x0801FC00 - 0x0801FFFF
flash_ok = HAL_ERROR;
while(flash_ok != HAL_OK){
flash_ok = HAL_FLASH_Unlock();
}
if (HAL_FLASHEx_Erase(&Flash_erase, &Error) != HAL_OK)
{
Return_erase=HAL_FLASH_Lock();
}
// write ystav
flash_ok = HAL_ERROR;
while(flash_ok != HAL_OK){
flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC00, Write_flash_yst);
}
// write giz
flash_ok = HAL_ERROR;
while(flash_ok != HAL_OK){
flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC02, Write_flash_giz);
}
// write on_off
flash_ok = HAL_ERROR;
while(flash_ok != HAL_OK){
flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC04, Write_flash_on);
}
flash_ok = HAL_ERROR;
while(flash_ok != HAL_OK){
flash_ok = HAL_FLASH_Lock();
}Чтение попроще
error_read_flash для того,что память не записанная 0xffff . Хотя ячейка же 32 битная,но пихая в переменную 16 бит я просто наверно обрезаю верхние 16 бит или поправите меня.
Но в отладчике проверял все нормально...
uint16_t ystav_m,giz_m,on_m;
// read ystav,giz,on_off
// adress
// ystav= 0x0801FC00
// giz = 0x0801FC02
// on_off = 0x0801FC04
ystav_m = (*(__IO uint32_t*) 0x0801FC00);
giz_m = (*(__IO uint32_t*) 0x0801FC02);
on_m = (*(__IO uint32_t*) 0x0801FC04);
if((ystav_m==0xffff)&&(giz_m==0xffff)&&(on_m==0xffff))
error_read_flash=1;
else
error_read_flash=0;

Хал пробую ради самообразования,пробовать нужно все и потом выбирать самое удобное. Стерты были ячейки даже при установленном бите LOCK.