Error message from debugger back end: Error finishing flash

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Error message from debugger back end: Error finishing flash

Сообщение The_Blind_WatchMaker »

Здравствуйте :shock: сам я нуб, работаю на STM32CubeIDE у меня проблема со стиранием секторов во внутренней Flash памяти МК STM32F429ZI (DISCO).
Пытался сделать разными способами, через HAL и напрямую регистрами, до появления в коде функции стирания Flash работает штатно.
Если в коде появляется стирание Flash заливка завершается с такой инф.:
Изображение
Код при этом работает, если заливался через отладку, то и отладка проходит штатно.
После этого при попытке записать изменения на МК через Cube появляется ошибка:
Error message from debugger back end: Error finishing flash
Изображение
При этом через STMUtility можно стереть Flas и биты. После стирания Flash (биты не влияют) можно снова работать из CubeIDE.
Переключение на OpenOCD не помогает...
Что только не нагуглил. Наиболее вменяемый вариант не устраивает.
https://kkmspb.ru/development/microcont ... 32F205.php
Т.к. ни другого программатора у меня нет, ни Keil'ом ни :solder: не владею... :dont_know:
Может кто сталкивался с проблемой и знает как решить?
Спойлер

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

  /* USER CODE BEGIN WHILE */

   uint32_t time = 0;
   uint32_t VarFlach = 0;
   HAL_StatusTypeDef flash_IS = HAL_ERROR;

   VarFlach = *(__IO uint32_t*)0x08000000;
// +**************************************************************Писать в Flash
   while (flash_IS != HAL_OK)
	   flash_IS = HAL_FLASH_Unlock();
   flash_IS = HAL_ERROR;
   while (flash_IS != HAL_OK)
   {
	   flash_IS = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x0800C000, 0x89ABCD);
   }
   flash_IS = HAL_ERROR;
   while (flash_IS != HAL_OK)
	   flash_IS = HAL_FLASH_Lock();
   // +**************************************************************Закончить писать в Flash
   VarFlach = *(__IO uint32_t*)0x0800C000;
// +**************************************************************Стирать  Flash

    flash_IS = HAL_ERROR;
   while (flash_IS != HAL_OK)
   {
	    flash_IS = HAL_FLASH_Unlock();
   }

   FLASH_EraseInitTypeDef strToErase;
   strToErase.Banks = FLASH_BANK_1;
   strToErase.Sector = FLASH_SECTOR_3;
   strToErase.NbSectors = 1;
   strToErase.TypeErase = FLASH_TYPEERASE_SECTORS;
   strToErase.VoltageRange = FLASH_VOLTAGE_RANGE_3;
   uint32_t sectorError = 0;
   //HAL_FLASHEx_Erase(&strToErase, &sectorError);								//Вариант 1
   //HAL_FLASHEx_Erase_IT(&strToErase);											//Вариант 2
   //FLASH_Erase_Sector(FLASH_SECTOR_3, FLASH_VOLTAGE_RANGE_3);					//Вариант 3
   //if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)==HAL_OK)		//Вариант 3
   //	   VarFlach = 0;														//Вариант 3

   	 CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);										//Вариант 4
     FLASH->CR |= FLASH_PSIZE_WORD;												//Вариант 4
     CLEAR_BIT(FLASH->CR, FLASH_CR_SNB);										//Вариант 4
     FLASH->CR |= FLASH_CR_SER | (FLASH_SECTOR_3 << FLASH_CR_SNB_Pos);			//Вариант 4
     FLASH->CR |= FLASH_CR_STRT;												//Вариант 4

     while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET)						//Вариант 4
     {
    	 ;
     }

     /* If the erase operation is completed, disable the SER and SNB Bits */
             CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB));

   flash_IS = HAL_ERROR;
      while (flash_IS != HAL_OK)
   	   flash_IS = HAL_FLASH_Lock();
      // +**************************************************************Закончить стирать Flash
   VarFlach = *(__IO uint32_t*)0x0800C000;
   //VarFlach = FLASH->SR;


   HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);//set is On
   HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_RESET);//set is Off

   while (1)
   {
	   if (VarFlach==0x89ABCD)
        if ((HAL_GetTick()-time)>1000)
        {
            HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13 | GPIO_PIN_14);
            time = HAL_GetTick();
        }
    /* USER CODE END WHILE */
____________________________
Поделиться рецептом можно в ЛС
Реклама
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: Error message from debugger back end: Error finishing fl

Сообщение The_Blind_WatchMaker »

Думаю вопрос снят.
Для таких-же с отмороженным мозгом как я сообщаю, что если код очистки Flash вызывать в бесконечном цикле по условию, то ошибки не случается и после стирания(даже нескольких раз последовательно) ошибки не возникает.
Спойлер

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

while (1)
   {
	   if (VarFlach==0x89ABCD)
        if ((HAL_GetTick()-time)>1000)
        {
            HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13 | GPIO_PIN_14);
            time = HAL_GetTick();
        }
	   if ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) ) //&& ((HAL_GetTick() - zaderjka) > 5000)
	   {
		   flash_IS = HAL_ERROR;
		      while (flash_IS != HAL_OK)
		      {
		   	    flash_IS = HAL_FLASH_Unlock();
		      }
		      HAL_FLASHEx_Erase(&strToErase, &sectorError);
		      flash_IS = HAL_ERROR;
		            while (flash_IS != HAL_OK)
		         	   flash_IS = HAL_FLASH_Lock();
		   zaderjka = HAL_GetTick();
		   HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);//set is On
	   }
	   VarFlach = *(__IO uint32_t*)0x0800C000;
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
____________________________
Поделиться рецептом можно в ЛС
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Error message from debugger back end: Error finishing fl

Сообщение Eddy_Em »

The_Blind_WatchMaker, лучше бы хал выкинуть, а для стирания флеша и записи в него ничего сложного делать не нужно, только документацию внимательно почитать.
Я себе вот такое написал. Бинарный поиск позволяет найти нужную запись достаточно быстро (скажем, для поиска среди 4096 возможных записей понадобится лишь 12-13 сравнений, а в линейном случае это число потенциально равно 4096!). При большом размере "хранилища" может целая секунда пройти с момента старта, пока линейно найдешь последние настройки! Нельзя так делать.
P.S. А называть переменную 'zaderjka' ну никуда не годится! Только русскому или близкому к нашему языку, возможно, станет понятно, что "задерйка" - это "задержка". А 99.99% населения Шарика вообще ничего не поймет. Есть международный язык - английский, вот им и нужно пользоваться при именовании переменных, функций и написании комментариев.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Ответить

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