임베디드/펌웨어 기초

Flash

twoweeks-within 2025. 1. 22. 17:54

 

 

#define FLASH_SECTOR_MAX 64

 

 

typedef struct

{

uint32_t addr;

uint32_t length;

} flash_tb1_t;

 

flash_tb1_t flash_tb1[FLASH_SECTOR_MAX];

 

bool flashInit()

{

bool ret= true;

 

for(int i=0; i<FLASH_SECTOR_MAX; i++)

{

flash[i].addr = 0x80000000 + i*1024;

flash[i].length = 1024;

}

return ret;

}

 

0x8000 0000 부터 1024크기로 쭉 Init 

 

 

int16_t start_sector_num = -1;

uint32_t sector_count = 0;

 

for(int i=0; i<FLASH_SECTOR_MAX; i++)

{

if(flashInSector(i, addr, length) == true)

{

if( start_sector_num < 0)

{

start_sector_num = i;

}

sector_count++;

}

}

 

 

>> -1 로 해둔이유

만약 오류가 나거나 찾은게 없으면 결과가 -1 로 남음

> flash_tb1[-1] 

   > 배열에서 -1 번 인덱스는 없기 때문에 eraze를 하지 않게됨

 

 

for (int i = 0; i < length; i += 2)

{

uint16_t data;

 

data = p_data[i + 0] << 0;

data |= p_data[i + 1] << 8;

 

status = HAL_FLASH_Program (FLASH_TYPEPROGRAM_HALFWORD, addr + i,

(uint64_t) data);

 

if (status != HAL_OK)

{

return false;

}

}

 

8비트 데이터를 가져온뒤 16비트 저장소에 저장

  >> [1][0],, [3][2],, [5][4].. 이런식으로 저장됨

 

bool flashRead(uint32_t aadr, uint8_t* p_data, uint32_t length)

{

bool ret = true;

uint8_t *p_byte = (uint8_t *)addr;

 

for(int i=0; i<length; i++)

{

p_data[i] = p_byte[i];

}

 

32bit addr : 주소를 8비트 포인터로 가져오면

 > 8비트씩 주소접근을 함 > 4번하 1개 가져오는

 

ex)

0x8000000 + (60 * 1024) 

// flash의 60KB 부터 접근 

i++

logPrintf( "0x%X : 0x%X\r\n", 0x8000000 + (60 * 1024) +i , buf[i]) l

>>

0x8000F000 : 00

0x8000F001 : 01 

0x8000F002 : 02

>>>

 8000F000 총 32bit  ( 4* 8 ) 에서 8bit ( 2byte ) :: 00 , 01, 02 ,, 최하위 2비트를 가져옴

 

'임베디드 > 펌웨어 기초' 카테고리의 다른 글

UART, DMA  (0) 2025.01.19
reset  (0) 2025.01.08
cdc 2  (0) 2025.01.05
USB CDC  (0) 2025.01.04
stm32 mx >LED  (1) 2025.01.03