STM32 READ / ERASE / WRİTE FLASH

Başlatan cagri_dinc, 19 Şubat 2014, 09:34:36

baran123

@görkem
Kod paylaşırsan yardımcı olabiliriz
Sadece işlemin olduğu kısmı yollaman yeterli.

görkem

@baran123 Bulunan adresteki page i sildiğimde page in komple FF olduğunu görüyorum fakat veri yazamıyorum.

#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */
#include "stm32f1xx_hal_flash.h"
#include "stm32f1xx_hal_flash_ex.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
uint32_t adres;
uint16_t data,read_data=0;
uint8_t error_unlock,error_lock,error_write;
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */


void Unlock_Flash(void)
{
  FLASH->KEYR=0x45670123;  
  FLASH->KEYR=0xCDEF89AB;
}

void Lock_Flash(void)
{
  FLASH->CR=0x00000080; 
}

void Erase_Flash(uint32_t adr)
{
  FLASH->CR|=0x00000002;            
  FLASH->AR=adr;                    
  FLASH->CR|=0x00000040;          
  while((FLASH->SR&0x00000001));   
  FLASH->CR &= ~0x00000042;        
}

void Write_Flash(uint32_t adr, uint16_t data)
{
  FLASH->CR|=0x00000001;          
  *(__IO uint16_t*)adr = data;     
  while((FLASH->SR&0x00000001));   
}


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



/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */
adres=0x0801F800;
data=0xCDAE;
Unlock_Flash();
Erase_Flash(adres);
Write_Flash(adres,data);

Lock_Flash();

read_data=Read_Flash(0x0801F800);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
		HAL_Delay(250);
  }
  /* USER CODE END 3 */

}

baran123

@görkem HAL bilmiyorum ama neden register ile yapıyorsun HAL da fonksiyonlar yok mu ?

Ben SPL ile STM32F4 için şöyle yapmıştım.
#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) //__IO = volatile

/*
	Önce sil ve diğer verileri yedek.
*/
uint32_t Flash_WriteWithCheck(uint32_t addr, uint32_t data)
{
	uint32_t status = 0; // 0 error 1 ok

	FLASH_Unlock();

	FLASH_ClearFlag(FLASH_FLAG_EOP    | FLASH_FLAG_OPERR  | FLASH_FLAG_WRPERR);
	FLASH_ClearFlag(FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
	
	if(FLASH_ProgramWord(addr, data) == FLASH_COMPLETE)      
	{
		if(FLASH_READ_WORD(addr) == data)
			status = 1
		else
			status = 0;
	}
	else
		status = 0;

	FLASH_Lock();
	
	return (status);
}

görkem

@baran123 Fonksiyonlarla stm32f4 de yazabiliyorum fakat stm32f103 de ne register nede hal fonksiyonlarıyla yazamadım silmesine siliyor fakat yazmıyor atladığım birşey mi var diye danışmak istedim

erpay

F0'da şöyle  birşey yapmıştım :
HAL_FLASH_Unlock(); 
       
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adres, inputBuffer);     
         
HAL_FLASH_Lock();

görkem

@erpay onu denemiştim veri yazmıyor.

programlayıcı olarak stm32f4 discovery kitini kullanıyorum o yüzden mi oluyor acaba ? stm32f4 için yaptığımda silip yazıp okuyabiliyorum

devrecii

Silip yazmaması ilginç kesin kodlarda bi hata vardır.

Aşağıdaki kod stm32f103 için dikkat edersen her yere volatile yazmışım çünkü derleyici (iar) optimize edeyim derken bizim kodları
siliyor kullanmıyor senin de böyle bir sorunun olabilir. Bu adrese yazıyor 0x8001000.

   
uint8_t ibox[]="ibox654654321";
   uint32_t yazmem=0x8001000;
    

  *((volatile uint32_t*) 0x40022004)=0x45670123; ////FLASH_KEYR  key1 açılış şifresi
  *((volatile uint32_t*) 0x40022004)=0xCDEF89AB; ////FLASH_KEYR  key1
  
  *((volatile uint32_t*) 0x40022010)=0x02;  ////FLASH_CR page silime modu
  *((volatile uint32_t*) 0x40022014)=yazmem; ////FLASH_AR page baş adres
  *((volatile uint32_t*) 0x40022010)^=0x40; ////FLASH_CR tamam sil
  
  *((volatile uint32_t*) 0x40022010)=0x01; ////FLASH_CR page yazma modu
  
   uint16_t *mem=(uint16_t *) ibox; 
   while( (*((volatile uint32_t*) 0x4002200C)&1)); ///////FLASH_SR wait busy
  
   for(uint32_t syc=0;syc<(sizeof(ibox)/2);syc++) 
   { 
     *((volatile uint16_t*) yazmem)=mem[syc]; 
     yazmem+=2;    
     while((*((volatile uint32_t*) 0x4002200C)&1));  ///////FLASH_SR wait busy 
   }
     
  *((volatile uint32_t*) 0x40022010)=0x0;

erpay

HAL_FLASH_Program  sana ne dönüyor ? Debug ile girip denedin mi ?


görkem

#68
@erpay  debug ile bakıyorum  0 bilgisi dönüyor error kodu ile dönmüyor.
@iboibo volatile ile deneyeceğim birde.
yazmaya korumalı olabilir mi ?

erpay

Farklı bir pagede dene. Bir de yazıp yazmadığını st-link ile de kontrol etsene program içinde okuma yanında.

görkem

#70
@erpay Kullandığım fonksiyonlar aşağıdaki şekilde. St-link ile baktığımda da adres değeri FF olarak okunuyor.
void sil(uint32_t ft)
{
	HAL_FLASH_Unlock();//unlock flash writing
	FLASH_PageErase(ft);
	
	HAL_FLASH_Lock();
}
	

void flash_kayit(uint32_t adres,uint16_t dat)
{
HAL_FLASH_Unlock();



ok=HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,adres,dat);
	
	HAL_FLASH_Lock();

}		


sil(0x8010000);
flash_kayit(0x8010000,1);





erpay

ok=HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,adres,dat);

Burada hafword 16 bitlik bir veriden bahsediyor ama sen 8 bit yazmaya çalışıyosun belki bu bir problem oluşturabilir.
Onun yerine şöyle birşey dene bakalım:

HAL_FLASH_Unlock();

adres = 0x8010000
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adres, adres); 

HAL_FLASH_Lock();

görkem

#72
@erpay o şekilde de denedim yazmıyor st-link ten baktım adreslerde korumada yok.


erpay

Cubemx'de F1 için kullandığın kütüphanede bir sorun olabilir onu güncelleyip yeniden oluşturmayı da dene istersen.

görkem

#74
@erpay silme fonksiyonunu yazılımdan kaldırdığımda yazma yapabiliyor fakat fonksiyonu eklediğimde yazma yapmıyor.

not: değişkene volatile ekleyince yazmaya başladı. Silme fonksiyon sorunu devam ediyor.