Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Flash Write ve Hardfault

Başlatan robikod, 10 Eylül 2021, 13:49:33

robikod

Herkese merhaba,

stm32f4 ile dual bank kod güncelleme kodu üzerinde çalışırken bir hata yaşıyorum.

parametrelerim aşağıdaki gibi tanımlı.

  uint32_t totalBlockNumber;
  uint32_t blockNumber;
  uint8_t blockData[512];
  uint32_t frameDataCount;

Kodun bir noktasında Flash_Write_Start(totalBlockNumber,blockNumber,(frameDataCount - 8), blockData); fonksiyonu çağırılıyor bu fonksiyonu aşağı ekledim. Bu fonksiyondan önce bank erase yapıp flash alanını sildiğimden emin oluyorum.

(NOT: frameDataCount değişkeni 8 den büyük bunun kontrolülü yapıyorum. )


void Flash_Write_Start( uint32_t totalBlockNumber, uint32_t blockNumber, uint32_t packet_length, uint8_t * blockData)
{
  HAL_StatusTypeDef errorCheck = 1;
  uint32_t bankActive;
  if(fwFrameCounter == blockNumber)
  {    
  errorCheck = FLASH_If_Write(Flash_Write_Address, blockData, packet_length);
  }
  if(errorCheck != FLASHIF_OK)
  {
    SerialPrint("FLASH ERROR\n");
}

kodun içerisindeki FLASH_If_Write(Flash_Write_Address, blockData, packet_length); fonksiyonunda kod bazen Hardfaulta düşüyor.

Burada kodu Hardfaulta zorlayan durum ne olabilir ?


  FLASHIF_StatusTypeDef FLASH_If_Write(uint32_t destination, uint32_t *p_source, uint32_t length)
{
  FLASHIF_StatusTypeDef status ;
  HAL_StatusTypeDef halErrorFlag;
  /* Unlock the Flash to enable the flash control register access *************/
  if (HAL_FLASH_Unlock() != HAL_OK)
  {
    return FLASHIF_CRCKO;
  } 
uint32_t i ;
 status = FLASHIF_OK;
 
  /* DataLength must be a multiple of 32 bit */
  for ( i = 0U; (i < (length >> 2U)) && (destination <= (USER_FLASH_END_ADDRESS - 4U)); i++) //
  {

    /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
       be done by word */


    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (destination + (i * 4U)), *(uint32_t *)(p_source + i)) == HAL_OK)
    {

      /* Check the written value */
      if (*(__IO uint32_t *)(destination + (i * 4U)) != *(uint32_t *)(p_source + i))
      {
        status = FLASHIF_WRITINGCTRL_ERROR;
      }

        /* Increment FLASH destination address */
//       destination += 4;
    }
    else
    {
      /* Error occurred while writing data in Flash memory */
      status = FLASHIF_WRITING_ERROR;
      break;
    }
//  SerialPrint(" 4 \n");

    if (status != FLASHIF_OK)
    {
      break;
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
  
  halErrorFlag = HAL_FLASH_Lock();
  if( halErrorFlag != HAL_OK)
  {
  } 
 
  
  return status;
}