stm32f103c6 işlemci için Flash hafıza yazma ve okuma

Başlatan universitelim54, 24 Haziran 2022, 18:08:04

universitelim54

Mrb arkadaslar

stm32f103c6t işlemcim için flash hafızaya 4 adet 16 bitlik veri yazıp okumak istiyorum . Buldugum örnekler üzerine calıssamda olmadı. hafızaya yazdıgım ve okudugum orneklerde ıslemcıyı kapatıp actıgımda programın calısmadıgını gordum . bu konuda yardımınızı rıca ederım . derleyıcı olarak STMIDE kullanıyorum .. Kullandıgım ornek kodlar asagıdadır .işlemcimin 32kb oldugunu göz önünde bulundurmanızı rica ederim.

if(Kaydet_Butonu==1)

   {
      

     Erase_Flash(0x08007C00);                        // SAyfa Silindi

     Write_Flash(0x08007C00,  Kalibrasyon_Agirligi);                   // 16 bitlik veri adrese yazıldı.
    HAL_Delay(200);
     Okuma_Yapiliyor = Read_Flash(0x08007C00);      // addresten 16 bitlik veri okundu.


     Kaydet_Butonu=0;
   }



void Erase_Flash (uint32_t adr)
{
   
  FLASH->KEYR=0xCDEF89AB;   // Silme veya yazma islemi yapilmadan önce Flash kilidi mutlaka açilmalidir.               
  FLASH->KEYR //registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.                
  FLASH->CR|=0x00000002;            //PER enable
  FLASH->AR=adr;                    //FLASH->AR registerine silinmek istenen adres yazilir
  FLASH->CR|=0x00000040;            //STRT anable
  while((FLASH->SR&0x00000001));    //Islem bitene kadar bekle(BUSY kontrol ediliyor)
  FLASH->CR &= ~0x00000042;         //FLASH->CR ilk durumuna aliniyor (kilit hala açik!)
   FLASH->CR=0x00000080;                    //FLASH_CR registeri resetlendiginde FLASH kiltlenmis olur
}




void Write_Flash (uint32_t adr, uint16_t data)
{
   FLASH->KEYR=0x45670123;                 // Silme veya yazma islemi yapilmadan önce Flash kilidi mutlaka açilmalidir.
  FLASH->KEYR=0xCDEF89AB;                  // FLASH->KEYR registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.
  FLASH->CR|=0x00000001;            //PG enable
  *(__IO uint16_t*)adr = data;      //istenen adrese istenen data yaziliyor
  while((FLASH->SR&0x00000001));    //Islem bitene kadar bekle(BUSY kontrol ediliyor)
   FLASH->CR=0x00000080;                   //FLASH_CR registeri resetlendiginde FLASH kiltlenmis olur
}


uint16_t Read_Flash(uint32_t  adr)
{
  uint16_t * Pntr = (uint16_t *)adr;
  return(*Pntr);
}




yucatar

Erase_Flash fonksiyonunda 2. satırdaki FLASH->KEYR değer atanmamış.

FLASH->KEYR //registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.             

gokhangokcen

Merhabalar, aşağıdaki kodlar işini görecektir. Sadece flashStartAddress ve diğer ilgili adresleri işlemcinin hafızasına göre revize etmen yeterli.

#define FLASH_READ_BYTE(ADDR)				(*(__IO uint8_t *)ADDR)
#define FLASH_READ_HALFWORD(ADDR)			(*(__IO uint16_t*)ADDR)
#define FLASH_READ_WORD(ADDR)				(*(__IO uint32_t*)ADDR)
#define FLASH_READ_DOUBLEWORD(ADDR)			(*(__IO uint64_t*)ADDR)

#define flashStartAddress		0x0800FC00
#define ledCountAddress			0x0800FC00
#define analogToleranceAddress		0x0800FC02
#define resolutionAddress		0x0800FC04


void writeValuesToFlash()  // yazma fonksiyonu
{

	EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.PageAddress = flashStartAddress;
	EraseInitStruct.NbPages     = 1;

	HAL_FLASH_Unlock();

	if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
	{
	/*Error occurred while page erase.*/
		flashError = HAL_FLASH_GetError();
	}

	HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (__IO uint32_t)ledCountAddress, activeLedCount);
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (__IO uint32_t)analogToleranceAddress, analogTolerance);
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (__IO uint32_t)resolutionAddress, resolution);

	HAL_FLASH_Lock();
}


void readValues(void)  //okuma fonksiyonu
{

	activeLedCount = FLASH_READ_HALFWORD(ledCountAddress);
	analogTolerance = FLASH_READ_HALFWORD(analogToleranceAddress);
	resolution = FLASH_READ_HALFWORD(resolutionAddress);
}
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.