STM32F4 Backup RAM kullanımı

Başlatan magnetron, 14 Kasım 2023, 22:33:39

magnetron

merhaba forum,

STM32F4 işlemcide enerji gittiğinde dataları Backup RAM de saklamak istiyorum
ama yeniden açıldığında saçma değerler geliyor - pil takılı

nasıl yapıcam , teşekkür

void EXTI16init(void) {

  EXTI_ClearITPendingBit(EXTI_Line16);
  EXTI_InitStructure.EXTI_Line = EXTI_Line16;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
  NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Configure the PVD Level to 2.9V */
          EXTI16init();
          PWR_PVDLevelConfig(PWR_PVDLevel_7);
    /* Enable the PVD Output */
          PWR_PVDCmd(ENABLE);

  /* Enable PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  /* Enable BKPRAM Clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
  /* Enable the Backup SRAM low power Regulator to retain it's content in VBAT mode */
  PWR_BackupRegulatorCmd(ENABLE);
  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

void PVD_IRQHandler(void)
{
    __disable_irq();

	  save_retentive();
    /* Clear the Key Button EXTI line pending bit */
    EXTI_ClearITPendingBit(EXTI_Line16);
    EXTI_ClearFlag(EXTI_Line16);
    while (1){Delay(100);IWDG_ReloadCounter();
  }
}

void read_retentive(void){
	uint8_t i;uint16_t *RAMptr=&RAM[DATAWORDS+100*2];

		  for (i = 0; i < 100; i += 1)
		  {
			  *RAMptr= *(__IO uint16_t *) (BKPSRAM_BASE + i*2);
			  RAMptr++;
		  }
}
void save_retentive(void){
	uint8_t i;uint16_t *RAMptr=&RAM[DATAWORDS+100*2];

		  for (i = 0; i < 100; i += 1)
		  {
			   *(__IO uint16_t *) (BKPSRAM_BASE + i*2)=*RAMptr;
			   RAMptr++;
		  }
}

Mucit23

STM32F4 Serisinde BKP Registerlerine erişmek için ilk önce BKPSRAM ve PWR donanımlarının Clock'unu açmak gerekiyor.
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);

Daha sonra BKP Registerlerine erişimi aktif etmelisin

PWR_BackupAccessCmd(ENABLE);

Daha Sonra RTC_WriteBackupRegister ve RTC_ReadBackupRegister fonksiyonları ile yazma ve okuma yapabilirsin



magnetron

hocam merhaba,

sizin dediklerinizi yapmıştım clokları açtım pil de takılı

RTC_WriteBackupRegister ve RTC_ReadBackupRegister ise
bunlar Backup Data Registerlere yazmak okumak için anladığım kadarıyla

datasheette belirtilen 4 KB Backup SRAM
ben buraya yazmak okumak istiyorum
bunu yapmak için açmak gereken bir kilit falan var mı

teşekkür

Mucit23

Bildiğim kadarıyla 4KB SRAM sadece bazı modellerde sunuluyor. STM32F427 ve STM32F437 Serisinde var. Bunlara erişmek için ekstra bir takım ayarlar yapmanız gerekiyor anladığım kadarıyla.

Aşağıdaki yazıyı okumanızı tavsiye ederim.

STM32F407 serisi için standart olarak 20 Adet BKP Registeri var. Bahsettiğim fonksiyonlarla bu registerlara yazma okuma yapabiliyorsunuz. Fakat 4KB opsiyonel SRAM farklı bir adreste yer alıyor. Buraya Reference Manual Sayfa 115'de Backup SRAM'e nasıl erişileceği anlatılmış.




magnetron