Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: universitelim54 - 24 Haziran 2022, 18:08:04

Başlık: stm32f103c6 işlemci için Flash hafıza yazma ve okuma
Gönderen: universitelim54 - 24 Haziran 2022, 18:08:04
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);
}



Başlık: Ynt: stm32f103c6 işlemci için Flash hafıza yazma ve okuma
Gönderen: yucatar - 24 Haziran 2022, 20:59:31
Erase_Flash fonksiyonunda 2. satırdaki FLASH->KEYR değer atanmamış.

FLASH->KEYR //registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.             
Başlık: Ynt: stm32f103c6 işlemci için Flash hafıza yazma ve okuma
Gönderen: gokhangokcen - 25 Haziran 2022, 08:53:44
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);
}

Başlık: Ynt: stm32f103c6 işlemci için Flash hafıza yazma ve okuma
Gönderen: universitelim54 - 25 Haziran 2022, 16:33:08
elinize saglık calıstı