stm32f030k6t6 hard fault a düşüyor

Başlatan esensoy, 19 Ekim 2022, 16:28:34

esensoy

STM32F030K6T6
IAR 8.10.1
ST'nin flash eeprom kütüphanesi,

eeprom init edilirken bir fonksiyon dönüşünde ilk resimdeki asm kodu işletilir işletilmez hard fault a düşüyor,
Sebebi hakkında fikri olan var mı?




En tehlikeli an "zafer" anıdır.

Erol YILMAZ

çalıştığını alana birşey yazıyor olmasın?

esensoy

onu nasıl kontrol edeceğim?
asm den adım adım kod çalıştırıyorum, c tarafından da değil,
öncesinde bir yerde fault oluşup
MOVS R4,R0 satırından sonra fault a düşebilir mi?
En tehlikeli an "zafer" anıdır.

JKramer

Kullandığınız mikrodenetleyiciye ve yazacağınız yere göre eeprom.h'da düzenlemeler yapmanız lazım, EEPROM_START_ADDRESS, vb. gibi. Ben yanlış yere yazma durumu olmasın diye linker script'te FLASH'tan ayrı alan ayarlamıştım sanırım. Yani adresleri kontrol edin en başta.

Bir de bu sorunla ilgili değil ama ST'nin kodunda bir hata vardı, 2014'ten beri mi ne düzeltmiyorlardı, başkası hatırlamazsa öğleden sonra bakarım.

esensoy

eeprom.h bu şekilde,

Alıntı yapılan: JKramer - 20 Ekim 2022, 09:20:31Kullandığınız mikrodenetleyiciye ve yazacağınız yere göre eeprom.h'da düzenlemeler yapmanız lazım, EEPROM_START_ADDRESS, vb. gibi. Ben yanlış yere yazma durumu olmasın diye linker script'te FLASH'tan ayrı alan ayarlamıştım sanırım. Yani adresleri kontrol edin en başta.

Bir de bu sorunla ilgili değil ama ST'nin kodunda bir hata vardı, 2014'ten beri mi ne düzeltmiyorlardı, başkası hatırlamazsa öğleden sonra bakarım.
Bakarsanız çok sevinirim,

/**
  ******************************************************************************
  * @file    eeprom.h
  * @author  MCD Application Team
  * @version V1.0.0
  * @date    07-Dec-2012
  * @brief  EEPROM read/write routines - header
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */

#ifndef EEPROM2_H
#define EEPORM2_H

/* Exported types ------------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

/*---FUNCTIONS---*/

u16 EEPROM_Init (void);
u16 E2_WriteMem(u16, u16);
void E2_WriteBurst(u16, u16, u16*);
u16 E2_ReadMem(u16,u16*);

/*---CONSTANTS---*/
#define E2_PHYSICAL_SIZE    256

#endif

/* Define the size of the sectors to be used */
#define PAGE_SIZE            ((uint32_t)0x0400)  /* Page size = 1KByte */

/* EEPROM start address in Flash */
#define EEPROM_START_ADDRESS    ((uint32_t)0x08002000) /* EEPROM emulation start address:
                                                after 64KByte of used Flash memory */
/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS      ((uint32_t)(EEPROM_START_ADDRESS + 0x000))
#define PAGE0_END_ADDRESS      ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))

#define PAGE1_BASE_ADDRESS      ((uint32_t)(EEPROM_START_ADDRESS + PAGE_SIZE))
#define PAGE1_END_ADDRESS      ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1)))

/* Used Flash pages for EEPROM emulation */
#define PAGE0                  ((uint16_t)0x0000)
#define PAGE1                  ((uint16_t)0x0001)

/* No valid page define */
#define NO_VALID_PAGE          ((uint16_t)0x00AB)

/* Page status definitions */
#define ERASED                  ((uint16_t)0xFFFF)    /* PAGE is empty */
#define RECEIVE_DATA            ((uint16_t)0xEEEE)    /* PAGE is marked to receive data */
#define VALID_PAGE              ((uint16_t)0x0000)    /* PAGE containing valid data */

/* Valid pages in read and write defines */
#define READ_FROM_VALID_PAGE    ((uint8_t)0x00)
#define WRITE_IN_VALID_PAGE    ((uint8_t)0x01)

/* Page full define */
#define PAGE_FULL              ((uint8_t)0x80)

/* Variables' number */
#define NumbOfVar              ((uint8_t)0x80)

extern u16 eeprom_variable[NumbOfVar];


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
En tehlikeli an "zafer" anıdır.

odemiriz

0x0800 0000 - 0x0800 7FFF 32 KB (1) Main Flash memory
adres konumu bu şekilde.

yazma adresini ((uint32_t)0x08007000) yaparsanız sondan yer göstermiş olursunuz. 0x08002000 ayarlı sizde büyük ihtimal kullanılan yerlere denk geliyor.

#define EEPROM_START_ADDRESS    ((uint32_t)0x08007000) /* EEPROM emulation start address:

esensoy

Alıntı yapılan: odemiriz - 20 Ekim 2022, 10:50:580x0800 0000 - 0x0800 7FFF 32 KB (1) Main Flash memory
adres konumu bu şekilde.

yazma adresini ((uint32_t)0x08007000) yaparsanız sondan yer göstermiş olursunuz. 0x08002000 ayarlı sizde büyük ihtimal kullanılan yerlere denk geliyor.

#define EEPROM_START_ADDRESS    ((uint32_t)0x08007000) /* EEPROM emulation start address:

Hocam çok teşekkür ederim, tam da bundanmış,
En tehlikeli an "zafer" anıdır.

JKramer

eeprom.c'de EE_VerifyPageFullyErased fonksiyonunu kontrol edin, aşağıdaki gibi düzenleme yapmak gerekiyor:

Src/eeprom.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/Src/eeprom.c b/Src/eeprom.c
index 1d66320..9df4fdb 100644
--- a/Src/eeprom.c
+++ b/Src/eeprom.c
@@ -307,9 +307,15 @@ uint16_t EE_VerifyPageFullyErased(uint32_t Address)
 {
  uint32_t readstatus = 1;
  uint16_t addressvalue = 0x5555;
-    
+  uint32_t pageEndAddress = PAGE0_END_ADDRESS;
+
+  if (Address == PAGE1_BASE_ADDRESS)
+  {
+      pageEndAddress = PAGE1_END_ADDRESS;
+  }
+
  /* Check each active page address starting from end */
-  while (Address <= PAGE0_END_ADDRESS)
+  while (Address <= pageEndAddress)
  {
    /* Get the current location content to be compared with virtual address */
    addressvalue = (*(__IO uint16_t*)Address);