Зависает запись во Flash на STM32F051

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

Здравствуйте

Как известно, в микроконтроллерах серии 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();
Если кто работал с ней - то подскажите, пожалуйста, где может скрываться ошибка или в какую сторону копать.

Если данная тема уже была и вопрос поднимался - то извиняюсь за невнимательность и прошу направить.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Зависает запись во Flash на STM32F051

Сообщение oleg110592 »

так работало

Код: Выделить всё

#define FLASH_PAGE 15
#define ADR_START     0x08003C00
.....
void FlashWrite(uint32_t Address, uint32_t Data)
{FLASH_Unlock();FLASH_ProgramWord(Address,Data);FLASH_Lock();}
......
  //erase page
  FLASH_Unlock();
  FLASH_ErasePage (FLASH_BASE + FLASH_PAGE * 1024);
  FLASH_Lock();
  //write data
  FlashWrite(ADR_START + 4, Data[1]);
  FlashWrite(ADR_START + 4*2, Data[2]);
  FlashWrite(ADR_START + 4*3, Data[3]);
.....
Реклама
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Re: Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

У меня нет.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Зависает запись во Flash на STM32F051

Сообщение oleg110592 »

Тогда можно попробовать пример FLASH из SPL или из сниппетов http://www.compel.ru/2014/03/19/sbornik ... rammistam/
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Re: Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

Спасибо за советы, но не один из методов не помогает, контроллер виснет. FLASH из SPL и так использую.
Ещё есть подозрение, что нужно копать в сторону настройки тактирования, а именно включить FLITF Clk, а ему в свою очередь нужен PDR режим. Но включение всего этого добра не помогло или неправильно включил, или чего-то ещё не хватает. Но вот чего не хватает - пока что не пойму.

При этом стирание памяти работало и работает нормально.
Реклама
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: Зависает запись во Flash на STM32F051

Сообщение optima »

И у меня такая проблема вылезла на F103C6 при попытке сохранения нужных параметров во флеш!
код такой:
void mainFL(void)//стирание и запись 1 страницы флеш
{
// Разблокировка FLASH
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;

//Стирание одной страницы во FLASH
while((FLASH->SR&FLASH_SR_BSY));//ждем когда можно стирать или писать память.
FLASH->CR |= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы
FLASH->AR = Page_31_0; // Задаем адрес страницы
FLASH->CR |= FLASH_CR_STRT; // Запускаем стирание
while((FLASH->SR&FLASH_SR_BSY)); //Ждем пока страница сотрется.
FLASH->CR &= ~FLASH_CR_PER; //Сбрасываем бит стирания одной страницы обратно
FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование FLASH

while((FLASH->SR&FLASH_SR_BSY));
*(__IO uint16_t*)(Page_31_0 ) = nomer_avto_sot_tmp;
while((FLASH->SR&FLASH_SR_BSY));
*(__IO uint16_t*)(Page_31_1 ) = nomer_avto_des_tmp;
while((FLASH->SR&FLASH_SR_BSY));
*(__IO uint16_t*)(Page_31_2 ) = nomer_avto_ede_tmp;
while((FLASH->SR&FLASH_SR_BSY));
FLASH->CR &= ~FLASH_CR_PG;//Запрещаем программирование FLASH
FLASH->CR |= FLASH_CR_LOCK;//Блокировка FLASH
}
При чем при отладке все работает ОК! Без отладки балалайка, проходит только стирание записи нет!
перемещая точку останова определил что FLASH->CR &= ~FLASH_CR_PER; не сбрасывает или не успевает сбрасывать бит
попытался поставить небольшую паузу не помогло! тогда прописал эту строчку дважды! и о чудо все заработало!
С чем это может быть связано? растолкуйте кто в курсе!
Реклама
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Re: Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

Среда CooCox?
И как выглядит инициализация?
И от чего тактируете?
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: Зависает запись во Flash на STM32F051

Сообщение optima »

Среда IAR
Тактируется HSE кварц 8 Мгц вот инициализация:
Изображение

Наковырял в доке помогите понять

Note: 1 These options should be used in accordance with the Flash memory access time. The wait
states represent the ratio of the SYSCLK (system clock) period to the Flash memory access
time:
zero wait state, if 0 < SYSCLK <= 24 MHz
one wait state, if 24 MHz < SYSCLK <= 48 MHz
two wait states, if 48 MHz < SYSCLK <= 72 MHz
Вложения
INIT.jpg
(179.63 КБ) 721 скачивание
Последний раз редактировалось optima Пн июл 28, 2014 21:04:18, всего редактировалось 1 раз.
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Re: Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

Вопрос решен.
Ошибка была, как и оказалась - с моей стороны. И была она не в инициализации.
Т.к. с stm32 работаю не очень давно, то о многих аспектах ещё не знаю. Так и тут аспект в том, что нужно адресоваться кратно разрядности ячейки памяти - 4 байта.
Всем кто отозвался спасибо.
Аватара пользователя
mial
Друг Кота
Сообщения: 3254
Зарегистрирован: Ср янв 06, 2010 23:31:56
Откуда: Боровичи, Новг. обл.

Re: Зависает запись во Flash на STM32F051

Сообщение mial »

Alex_EXE писал(а): кратно разрядности ячейки памяти - 4 байта.
Я адресовал по 2 байта, и писал соответсвенно 16 битное число, так как больше и не нужно было. Проблем ни каких не было. Все четко писалось, стиралось, и читалось. Причем если для записи ставить последнюю страницу флеша, то даже после программирования улинком данные сохранялись. Так как при перепрограммировании он затирает только ту часть флеша что нужна под программу.
Прототипы печатных плат на заказ https://radiokot.ru/forum/viewtopic.php?f=54&t=122701
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Re: Зависает запись во Flash на STM32F051

Сообщение optima »

Но адресуешь же uint32_t а не uint16_t, а записать да можно минимум 16 бит.
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

Re: Зависает запись во Flash на STM32F051

Сообщение Alex_EXE »

Сейчас в срочном порядке доделываю проект, на более гибкое и рациональное использование памяти перейду позже, во время оптимизации. Самое главное - что проблему обнаружил и решил.
За информацию, что можно писать по 2 байта - спасибо, обязательно проверю и перейду на неё, там, где это нужно.
На счёт записи в последнею страницу - это и так. Кстати, среда с моим китайским st-link'ом тоже позволяют стирать только ту область памяти, где расположена программа.
polyname
Прорезались зубы
Сообщения: 249
Зарегистрирован: Пт май 18, 2012 23:12:23

Re: Зависает запись во Flash на STM32F051

Сообщение polyname »

у меня работает так:


стирание:

Код: Выделить всё

		FLASH_Unlock();
		FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
		FLASH_ErasePage(CONFIG_START_ADDR);
		FLASH_Lock();
запись:

Код: Выделить всё

		U32 *source_addr = (void *)&config;
		U32 *dest_addr   = (void *)CONFIG_RECORD(config_record);
		FLASH_Unlock();
		FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
		for (U16 i=0; i<CONFIG_WORDS; i++) {
			FLASH_ProgramWord((U32)dest_addr, *source_addr);
			source_addr++;
			dest_addr++;
		}
		FLASH_Lock();
Аватара пользователя
Nosaer
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб янв 17, 2015 06:37:10

Re: Зависает запись во Flash на STM32F051

Сообщение Nosaer »

Извиняюсь, что дергаю старую тему, но:
При попытке записи или стирания получаю кучу ошибок:
ANV_AMP_MTR\ANV_AMP_MTR.axf: Error: L6407E: Sections of aggregate size 0x40 bytes could not fit into .ANY selector(s).
ANV_AMP_MTR\ANV_AMP_MTR.axf: Error: L6406E: No space in execution regions with .ANY selector matching iusefp.o(.text).

Код: Выделить всё

HAL_FLASH_Unlock();
        
        FLASH_EraseInitTypeDef EraseInitStruct;
        EraseInitStruct.PageAddress = 0x08010000;
        EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
        EraseInitStruct.NbPages = 1;
        uint32_t SectorError = 0;

        if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) 
            {     
                    HAL_FLASH_Lock();
            }

        HAL_FLASH_Unlock();
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08010000, AHReady);
        HAL_FLASH_Lock();
Пробовал менять адрес, ничего не помогает
Ответить

Вернуться в «ARM»