#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비트를 가져옴