2017-04-24 6 views
0

私はstm32l011k4のフラッシュアドレスを消去しようとします。そのような私のコード。Cで複数のフラッシュアドレスを削除する方法は?

#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では1バイトを削除することはできません。 – 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バイトよりもはるかに大きくなります。

プログラム(つまり、1秒に0にする)ことはできますが、一度に一定の制限を下回って消去することはできません。通常、セクタのサイズは複数キロバイトで、アドレス空間によって異なる場合もあります。

関連する問題