Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Error message from debugger back end: Error finishing flash

Вс янв 15, 2023 17:11:12

Здравствуйте :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 */

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

Пн янв 16, 2023 08:58:40

Думаю вопрос снят.
Для таких-же с отмороженным мозгом как я сообщаю, что если код очистки 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 */
  }

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

Пн янв 16, 2023 09:06:32

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