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);
}
Erase_Flash fonksiyonunda 2. satırdaki FLASH->KEYR değer atanmamış.
FLASH->KEYR //registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.
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);
}
elinize saglık calıstı