HAL_FLASHEx_Erase Fonksiyonu HardFault Problemi

Çözüldü226 görüntülenmeSTM32 MCUsFlash stm32 stm32g0

HAL_FLASHEx_Erase Fonksiyonu HardFault Problemi

Merhaba

STM32F0 ile yazılmış bir projeyi G0 serisine dönüştürüyorum. Flash yazmadan önce yaptığım silme fonksiyonunda hata alıyorum. Flash adresim program kodlarının gömüldüğü kısımdan çok uzakta. Yardımlarınız bekliyorum, nerede hata yapıyorum ?

Kodlar;

int flash_par_adr1[ParSize] __attribute__((at(0x0800F000)));	// 4096 Byte =4KB
int flash_par_adr2[ParSize] __attribute__((at(0x0800E000)));	// 4096 Byte =4KB
 //_____________________________________________________________________________ SaveParamToFlash
HAL_StatusTypeDef SaveParamToFlash(int page)
{
uint32_t tFlashAddress	= 0x00;
uint32_t tParAddress		= 0x00;
FLASH_EraseInitTypeDef	FLASH_EraseInit;
uint32_t								PageError;
HAL_StatusTypeDef				feedback;
   if(page == 0)
  FlashAddress= (uint32_t)&flash_par_adr1;
 else
  FlashAddress= (uint32_t)&flash_par_adr2;
 /* Erase the FLASH pages */	
 ParAddress	= (uint32_t)∥
 EndAddress	= ParAddress + ParSize;
 NbrOfPage		= (EndAddress - ParAddress) / FLASH_PAGE_SIZE + 1;
   FLASH_EraseInit.TypeErase		= FLASH_TYPEERASE_PAGES;
 //FLASH_EraseInit.Banks				= 0x00;
 FLASH_EraseInit.Page	      =	FlashAddress;
 FLASH_EraseInit.NbPages			= NbrOfPage;
 HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_MISERR | FLASH_FLAG_PGSERR | FLASH_FLAG_FASTERR);
    feedback = HAL_FLASHEx_Erase(&FLASH_EraseInit,&PageError);
 HAL_FLASH_Lock();
 if(feedback != HAL_OK)
  return(feedback);
 /* Program the user Flash area word by word*/
 tFlashAddress	= FlashAddress;
 tParAddress		= ParAddress;
 HAL_FLASH_Unlock();
 while ((tParAddress < EndAddress) && (feedback == 0))
 {
  feedback = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST,tFlashAddress, *(__IO uint32_t *)tParAddress);
  if(feedback != HAL_OK)
   return(feedback);
  tFlashAddress	= tFlashAddress + 4;
  tParAddress		= tParAddress + 4;
 }
 HAL_FLASH_Lock();
  /* Check if the programmed data is OK */
 tFlashAddress	= FlashAddress;
 tParAddress		= ParAddress;
  while ((tParAddress < EndAddress) && (feedback == 0))
  {
    if (*(__IO uint32_t *)tParAddress	!= *(__IO uint32_t *)tFlashAddress)
    {
   feedback = HAL_ERROR;
    }
     tFlashAddress	= tFlashAddress + 4;
  tParAddress		= tParAddress + 4;
  }
 return(feedback);
}

Debug esnasında aldığım görseller;

//————-Program hafızam

//————-Erase işleminden sonra aldığım hata bayrakları

//———-Bu da yazma silme parametrelerimin Watch’taki görüntüsü

Alper Çoban En iyi cevap olarak seçildi Şubat 18, 2022
0

Merhaba,

STM32G0 serisinde flash yazma ve silme işlemleri STM32F0 serisinden biraz farklı.

STM32G0 FW paketi içindeki örnek uygulamalar işinize yarayacaktır:

C:\Users\…\STM32Cube\Repository\STM32Cube_FW_G0_V1.5.0\Projects\NUCLEO-G031K8\Examples\FLASH\FLASH_EraseProgram

İyi çalışmalar

Alper Çoban En iyi cevap olarak seçildi Şubat 18, 2022
1