Эх хорошо выходные,можно заняться любимым делом хоть ))
Почитав Ссылка и разобравшись с флэш памятью для сохранения настроек и т д решил написать заметку.
Конечно не очень удобно для записи например 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;