2017-04-24 115 views
0

我試圖擦除stm32l011k4中的Flash地址。我的代碼就是這樣;如何刪除C中的多個Flash地址?

#define SLAVE_ID_ADDR_I        0x08080001 
#define SLAVE_ID_ADDR_II       0x08080002 
#define SLAVE_ID_ADDR_III       0x08080003 
#define MASTERID         0x08080000 

void software_erase(void){ 

     HAL_FLASH_Unlock(); 

    /* Fill EraseInit structure*/ 
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; 
    EraseInitStruct.PageAddress = SlaveID_III;    
    EraseInitStruct.NbPages  = 4;          

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) 
    { 
     playTone=3; 
    } 
    else{   
     MasterID = 0; 
     SlaveID_I = 0; 
     SlaveID_II = 0; 
     SlaveID_III = 0; 
     MasterID_loaded = 0; 
     SlaveID_loaded_I = 0; 
     SlaveID_loaded_II = 0; 
     SlaveID_loaded_III = 0; 
     clear_keyfobs = 1; 
     playTone=2; 
    } 
} 

編輯: 但我想0x08080001之間擦除字節 - 0x08080003。並非所有部分。 這意味着必須刪除「0x08080001,0x08080002,0x08080003」,但必須保留「0x08080000」。

有什麼建議嗎?

+2

給出的值不是頁面,而是字節地址。您無法刪除Flash中的單個字節。 – Olaf

+0

請閱讀芯片的文檔。它應該告訴你儘可能小的擦除大小。 – user694733

回答

2

該地址指向EEPROM,不閃爍。

enter image description here

您不必刪除在EEPROM什麼,只是解鎖並寫入新的值。

但是,爲了寫一個字節,你需要一個正確解除引用的指針,一個整數常量將不起作用。

#define SLAVE_ID_ADDR_I (*(volatile unsigned char *)0x08080001) 
#define SLAVE_ID_ADDR_II (*(volatile unsigned char *)0x08080002) 
#define SLAVE_ID_ADDR_III (*(volatile unsigned char *)0x08080003) 
#define MASTERID   (*(volatile unsigned char *)0x08080000) 

void software_erase(void) 
{ 
    if(FLASH->PECR & FLASH_PECR_PELOCK) 
     HAL_FLASH_Unlock(); 
    SLAVE_ID_ADDR_I = 0; 
    ... 
3

當你的意思是「字節」時,你似乎會說「頁面」,但這並沒有多大意義。

STM32的閃存中最小的可擦除單元通常被稱爲「扇區」,並且比單個字節大得多。

這是可能的程序(即寫即變成1秒到0)簡單的詞,但你不能刪除(即轉成0 1S)小於在某個時間限制。通常扇區大小是多個千字節,並且也可以在地址空間中變化。