HAL_FLASHEx_Erase Fonksiyonu HardFault Problemi
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)&PAR; 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
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