AVN 0 4 августа, 2017 Опубликовано 4 августа, 2017 (изменено) · Жалоба Ситуация следующая. (STM32F405) FLASH_Unlock(); while (FLASH->SR & 0x010000); FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3); while (FLASH->SR & 0x010000); FLASH_Lock(); Все прекрасно проходит под отладчиком. Сектор 1 стерт. Перепрошиваю, отключаю отладчик, передергиваю питание, немного выжидаю, подключаю отладчик и смотрю содержимое памяти. Сектор 1 не изменился. В чем фишка? Изменено 21 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 4 августа, 2017 Опубликовано 4 августа, 2017 · Жалоба На основе бытовой телепатии: под отладчиком не срабатывают прерывания, которые нельзя использовать при записи во флеш. В релизе соответственно они ломают процесс записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tvsdig 0 4 августа, 2017 Опубликовано 4 августа, 2017 · Жалоба Все прекрасно проходит под отладчиком. Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания? Попробуйте использовать флаг EOP (совместно с BSY). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVN 0 4 августа, 2017 Опубликовано 4 августа, 2017 · Жалоба Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания? Попробуйте использовать флаг EOP (совместно с BSY). Сразу всю процедуру. На основе бытовой телепатии: под отладчиком не срабатывают прерывания, которые нельзя использовать при записи во флеш. В релизе соответственно они ломают процесс записи. Естественно, все прерывания запрещены. И даже вся периферия отключена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 5 августа, 2017 Опубликовано 5 августа, 2017 · Жалоба Не ограничиваю никакие прерывания, просто выполняю код. У меня все нормально работает. Как под отладчиком, так и без него: void InternalFlash::lock() { FLASH->CR |= FLASH_CR_LOCK; } void InternalFlash::unlock(void) { FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } //Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается //void flash_erase_all_pages(void) //{ // FLASH->CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц // FLASH->CR |= FLASH_CR_STRT; //Начать стирание // while(!FlashReady); // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь... // FLASH->CR &= FLASH_CR_MER; //} void InternalFlash::erasePage(byte page) { if(page < 12 && page > 0) { while(FLASH_IS_BUSY);// Wait while flash is busy FLASH->CR |= FLASH_CR_PSIZE_1;// Parallelism to x32 FLASH->CR |= FLASH_CR_SER | (page << 3); //Устанавливаем бит стирания одной страницы и стираем сектор 1 - 11 FLASH->CR |= FLASH_CR_STRT; // Запускаем стирание while(FLASH_IS_BUSY);//Ждем пока страница сотрется. } } void InternalFlash::write(uint address, uint data) { while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша *(uint*)address = data;// Write word cos we have 32bit parallelism while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша } void InternalFlash::writeBuf(uint address, uint *data, ushort size) { while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша for(ushort i = 0; i < size; ++i) { ((uint *)address)[i] = data[i];// Write word cos we have 32bit parallelism while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи } FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша } Все методы класса InternalFlash stm32f205, но, думаю, разницы не будет с другими ядрами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVN 0 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба Проблема решена. Надо просто перед доступом к флэш очищать биты ошибок в FLASH->SR. Откуда они берутся - я пока не понял, но они стоят сразу при старте контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться