Saturday, August 2, 2025

STM32 시리즈 SPI로 SD카드 읽고 쓰는 소스중에서 


 https://github.com/eziya/STM32_SPI_SDCARD/

가 있다.


이 소스중에 

 https://github.com/eziya/STM32_SPI_SDCARD/blob/master/STM32F4_HAL_SPI_SDCARD/Src/fatfs_sd.c




while(len--); 구문은 오류임.


실제로는 len 보다 1 만큼 많이 실행되어 메모리 침범 오류를 만듭니다.


/* receive data block */

static bool SD_RxDataBlock(BYTE *buff, UINT len)

{

uint8_t token;


/* timeout 200ms */

Timer1 = 200;


/* loop until receive a response or timeout */

do {

token = SPI_RxByte();

} while((token == 0xFF) && Timer1);


/* invalid response */

if(token != 0xFE) return FALSE;


/* receive data */

do {

SPI_RxBytePtr(buff++);

len--;


} while(len--);


/* discard CRC */

SPI_RxByte();

SPI_RxByte();


return TRUE;

}


이것은 아래처럼 수정해야함.



/* receive data block */

static bool SD_RxDataBlock(BYTE *buff, UINT len)

{

uint8_t token;


/* timeout 200ms */

Timer1 = 200;


/* loop until receive a response or timeout */

do {

token = SPI_RxByte();

} while((token == 0xFF) && Timer1);


/* invalid response */

if(token != 0xFE) return FALSE;


/* receive data */

do {

SPI_RxBytePtr(buff++);

len--;


} while(len !=0);


/* discard CRC */

SPI_RxByte();

SPI_RxByte();


return TRUE;

}



len-- 대신 --len을 써도 된다.

그러지 말고 명확하게 하기 위해서 --는 먼저 하고 비교문을 확실히 넣는것이 낫다.