Как известно, в микроконтроллерах серии STM32 нет внутренней eeprom, но есть много flash, которую можно использовать в своих корыстных целях для хранения данных программы, конечно не без своих неприятных особенностей.
Сейчас реализую проект, где как раз одной из задач стоит - хранение во внутренней памяти пользовательских настроек, но столкнулся с проблемой зависания контроллера при попытки записи.
В проекте применён контроллер STM32F051C8T6. Тактирование от внутреннего генератора. Для облегчения работы использую STL.
Инициализация, пока что сделана на скорую руку:
Код: Выделить всё
// Тактирование
RCC_DeInit(); // сброс настроек тактового генератора
RCC_HSEConfig(RCC_HSE_OFF); // отключение внешнего тактового генератора
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF | RCC_AHBPeriph_SRAM, ENABLE);
RCC_HSICmd(ENABLE);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_4); // тактирование от HSI с делителем 2 * 4 = 16МГц
RCC_PLLCmd(ENABLE); // Включаем PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // устанавливаем значение
// RTC
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// Enable the PWR clock
PWR_BackupAccessCmd(ENABLE);// Allow access to RTC
RCC_LSEConfig(RCC_LSE_ON);// Enable the LSE OSC
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} // Wait till LSE is ready
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);// Select the RTC Clock Source
RCC_RTCCLKCmd(ENABLE);// Enable the RTC Clock
RTC_WaitForSynchro();// Wait for RTC APB registers synchronisation
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitStructure.RTC_SynchPrediv = 0x7FFF;
RTC_Init(&RTC_InitStructure);
Сама запись выглядит следующем образом:
Код: Выделить всё
#define FLASH_USER_START_ADDR ((unsigned long)0x08007000)
FLASH_Unlock();
FLASH_ErasePage(FLASH_USER_START_ADDR+1);
FLASH_ProgramWord(FLASH_USER_START_ADDR+1,0x0800F801);
FLASH_Lock();
Если данная тема уже была и вопрос поднимался - то извиняюсь за невнимательность и прошу направить.


