Evgeniy Chernyavskiy 0 8 декабря, 2019 Опубликовано 8 декабря, 2019 · Жалоба Доброго времени суток! Помогите решить проблемку: при записи пользовательских настроек во FLASH, после нескольких итераций устанавливается бит PGERR и все оставшиеся данные ясное дело не пишутся. Память перед записью стираю! Использую SPL. Проверяю и в отладчике и с помощью утилиты: значения ячеек перед записью 0xFF, но всё равно устанавливается PGERR. С чем это может быть связано? МК - STM32f072С8Т6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 9 декабря, 2019 Опубликовано 9 декабря, 2019 · Жалоба Может, не дожидаетесь окончания записи, опрашивая флаг FLASH_SR_BSY? (И после того, как дождались, желательно вставить барьерчик, типа __DSB();, для надёжности). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 10 декабря, 2019 Опубликовано 10 декабря, 2019 · Жалоба Цитата 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'ами вместо побайтной. =] А барьерчик помогает в другом месте %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 10 декабря, 2019 Опубликовано 10 декабря, 2019 · Жалоба Пишу вот так, ни разу на ошибки не натыкался. Перед записью не лишним будет все флаги очистить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 13 декабря, 2019 Опубликовано 13 декабря, 2019 · Жалоба пишу в флеш халом. ни разу проблем не было. во внутрь хала глубоко не заглядывал, ибо всё работает. мой код для 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 не так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Evgeniy Chernyavskiy 0 17 декабря, 2019 Опубликовано 17 декабря, 2019 · Жалоба Вот и у меня раньше проблем не возникало, это третий проект на этом МК с этим кодом для FLASH. Использую SPL, копнул глубже их коды - алгоритм аналогичный вашему. Проблему пока не решил. Пишутся данные WORDами, и в какой то момент бах! и PGERR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 18 декабря, 2019 Опубликовано 18 декабря, 2019 · Жалоба 8 часов назад, Evgeniy Chernyavskiy сказал: и в какой то момент бах! и PGERR 1) на одном мк или ..... на пяти из пяти? пробовали МК сменить или этот код залить в старые устройства? или старый код залить в новое устройство? 2) в моём коде, в коде Eddy_Em пишется по 16 бит за проход. этот мк пишет по 16 бит. 32бита - это 2 раза пишет по 16. в вашем коде по 32. попробуйте по 16 бит за проход в вайле. ну и до кучи.... код хала, может в нем что-то получше, чем в спл есть различия от спл stm32f0xx_hal_flash.h stm32f0xx_hal_flash.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 18 декабря, 2019 Опубликовано 18 декабря, 2019 · Жалоба 15 hours ago, Evgeniy Chernyavskiy said: Пишутся данные WORDами, и в какой то момент бах! и PGERR Судя по скринам ничего криминального, но ничего не сказано про flash latency и частоту проца, flash latency установлена максимальная? И как Вы могли видеть в доке: Quote Bit 2PGERR: Programming errorSet by hardware when an address to be programmed contains a value different from '0xFFFF' before programming. Вот чисто для теста, что будет если перед программирование проверить содержимое cellAddr на 0xFFFFFFFF(у вас 32бит). Я понимаю что в окне memory мы видим FF но может ядро и периферия видит там что то другое!? Для теста я бы еще попробовал использовать функцию FLASH_ProgramHalfWord и посмотреть на результат. Ну и нельзя забывать про ресур флеши, к концу ресурса поведение роботы с флеш не предсказуемо, на сколько свежий контроллер? и уже звучал вопрос, на других контроллера поведение повторятся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Evgeniy Chernyavskiy 0 12 января, 2020 Опубликовано 12 января, 2020 · Жалоба Пробовал на трёх процах. Они новые, правда куплены с рук в Одессе, возможно вся партия такая... Насчёт функции FLASH_ProgramHalfWord, на ней собственно и построена функция FLASH_ProgramWord, и если исследовать глубже, то именно при её выполнении устанавливается этот бит.. На днях придёт контроллер с проверенного сайта, попробую. Спасибо за советы! Как найду причину обязательно поделюсь :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться