2017-04-24 1 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에서는 단일 바이트를 삭제할 수 없습니다. – 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으로 설정). 일반적으로 섹터 크기는 여러 킬로바이트이며 주소 공간에 따라 다를 수 있습니다.

관련 문제