Перейти к содержанию
    

STM32f072 проблема записи FLASH (PGERR bit)

Доброго времени суток! Помогите решить проблемку: при записи пользовательских настроек во FLASH, после нескольких итераций устанавливается бит PGERR и все оставшиеся данные ясное дело не пишутся. Память перед записью стираю! Использую SPL. Проверяю и в отладчике и с помощью утилиты: значения ячеек перед записью 0xFF, но всё равно устанавливается PGERR. С чем это может быть связано? МК -  STM32f072С8Т6

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, не дожидаетесь окончания записи, опрашивая флаг FLASH_SR_BSY?

(И после того, как дождались, желательно вставить барьерчик, типа __DSB();, для надёжности).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

Bit 2 PGERR: Programming error
Set by hardware when an address to be programmed contains a value different from '0xFFFF' before programming. Reset by writing 1.
Note: The STRT bit in the FLASH_CR register should be reset before starting a programming operation.

Флеш шьётся по 16 бит за один проход. Сталкивался я с этой же проблемой, пытаясь сохранять конфигурацию в последних страницах флеша на L433. Там ровно аналогичная ситуация. Нельзя просто так взять и сбросить бит во флеше - нужно обязательно стереть страницу и писать ТОЛЬКО в чистые ячейки.

Если такое поведение можно поймать в отладке - попробуйте его поймать и считайте все регистры относящиеся к Flash->xxx и страницу, которая в этот момент пишется (в том числе, тот адрес куда пишется) для проверки.

21 час назад, AHTOXA сказал:

(И после того, как дождались, желательно вставить барьерчик, типа __DSB();, для надёжности).

Не уверен, что в F07x такие сильные отличия, но мне помогли просто дополнительные проверки на выравнивание доступа к записываемой памяти и единовременная запись WORD'ами вместо побайтной. =]

А барьерчик помогает в другом месте %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу вот так, ни разу на ошибки не натыкался. Перед записью не лишним будет все флаги очистить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишу в флеш халом. ни разу проблем не было. во внутрь хала глубоко не заглядывал, ибо всё работает. мой код для stm32f030

#define FLASH_EEPROM_BASE	(0x08000000 + 63 * 0x400)
  
void saveConfig()
{
	uint16_t *p = (uint16_t*)&config;
	uint32_t adr = FLASH_EEPROM_BASE;
	while(HAL_FLASH_Unlock() != HAL_OK)
		vTaskDelay(3);
	FLASH_EraseInitTypeDef erase;
	//erase.Banks = FLASH_BANK_1; //в stm32f030 это поле отсутствует
	erase.NbPages = 1;
	erase.PageAddress = adr;
	erase.TypeErase = FLASH_TYPEERASE_PAGES;
	uint32_t pageError;
	HAL_FLASHEx_Erase(&erase, &pageError);
	//if(pageError != 0xFFFFFFFF)
	//	exit(1);
	for(uint8_t i = 0; i < sizeof(Eeprom); i += 2)
	{
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, adr, *p++);
		adr += 2;
	}
	do
	{
		vTaskDelay(3);
	} while(HAL_FLASH_Lock() != HAL_OK);
}

vTaskDelay() - в миллисекундах

если HAL не хотите, то гляньте определение HAL_FLASH_Program() и HAL_FLASHEx_Erase(), может найдете, что у вас в вашем spl не так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и у меня раньше проблем не возникало, это третий проект на этом МК с этим кодом для FLASH. Использую SPL, копнул глубже их коды - алгоритм аналогичный вашему. Проблему пока не решил. Пишутся данные WORDами, и в какой то момент бах! и PGERR

1.png

2.png

3.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Evgeniy Chernyavskiy сказал:

и в какой то момент бах! и PGERR

1) на одном мк или ..... на пяти из пяти? пробовали МК сменить или этот код залить в старые устройства? или старый код залить в новое устройство?

2) в моём коде, в коде Eddy_Em пишется по 16 бит за проход. этот мк пишет по 16 бит. 32бита  - это 2 раза пишет по 16. в вашем коде по 32. попробуйте по 16 бит за проход в вайле.

ну и до кучи.... код хала, может в нем что-то получше, чем в спл есть различия от спл

 

stm32f0xx_hal_flash.h

stm32f0xx_hal_flash.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Evgeniy Chernyavskiy said:

Пишутся данные WORDами, и в какой то момент бах! и PGERR

Судя по скринам ничего криминального, но ничего не сказано про flash latency и частоту проца, flash latency установлена максимальная?

И как Вы могли видеть в доке:

Quote

Bit 2PGERR: Programming error
Set by hardware when an address to be programmed contains a value different from '0xFFFF' before programming.

Вот чисто для теста, что будет если перед программирование проверить содержимое cellAddr на 0xFFFFFFFF(у вас 32бит). Я понимаю что в окне memory мы видим FF но может ядро и периферия видит там что то другое!?
Для теста я бы еще попробовал использовать функцию FLASH_ProgramHalfWord и посмотреть на результат.

Ну и нельзя забывать про ресур флеши, к концу ресурса поведение роботы с флеш не предсказуемо, на сколько свежий контроллер? и уже звучал вопрос, на других контроллера поведение повторятся?
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробовал на трёх процах. Они новые, правда куплены с рук в Одессе, возможно вся партия такая... Насчёт функции FLASH_ProgramHalfWord, на ней собственно и построена функция FLASH_ProgramWord, и если исследовать глубже, то именно при её выполнении устанавливается этот бит.. На днях придёт контроллер с проверенного сайта, попробую. Спасибо за советы! Как найду причину обязательно поделюсь :))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...