STM32H7 CubeMx SD Card Test
[STM32H7 EVM] 보드에는 4bit SD 인터페이스가 있어 SD카드 FAT 연결 테스트를 Stm32CubeMx를 이용하여 해 보았다.
우선 SD카드는 하드웨어 적으로 STM32H7의 디폴트 SDMMC1에 연결되어 있다.
STM32H7 EVM보드는에 아래면에 SD소켓이 장착되어 있다.
STM32CubeMx 를 이용하여 SDMMC1을 SD 4bit 모드로 선택한다.
Middleware 탭의 FATFS에서 Mode를 SD Card로 선택 한다.
이렇게 해서 기본으로 코드 생성하면 아래와 같은 코드가 생성 되는데...
주의 해야 할 사항은 bsp_driver_sd.c 파일에 있는 BSP_SD_Init() 함수를 호출 해 주어야 한다는 것이다.
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
/* USER CODE BEGIN 2 */
BSP_SD_Init();
/* USER CODE END 2 */
//disk_initialize((BYTE) 0);
f_opendir_scan_sd();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
SD를 4bit 모드로 변환 해 주는 부분이다.
uint8_t BSP_SD_Init(void)
{
uint8_t sd_state = MSD_OK;
/* Check if the SD card is plugged in the slot */
if (BSP_SD_IsDetected() != SD_PRESENT)
{
return MSD_ERROR_SD_NOT_PRESENT;
}
/* HAL SD initialization */
sd_state = HAL_SD_Init(&hsd1);
/* Configure SD Bus width (4 bits mode selected) */
if (sd_state == MSD_OK)
{
/* Enable wide operation */
if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)
{
sd_state = MSD_ERROR;
}
}
return sd_state;
}
SD 카드 읽어 파일 내용을 출력 해주면 쉽게 SD카드 테스트 완료
void f_opendir_scan_sd(void)
{
DIR dir;
FILINFO fno;
TCHAR path[200] = "0:";
res = f_mount(&SDFatFS,path,0);
printf("SD Mount : res f_mount : %02X\n\r",res);
if (res == FR_OK)
{
res = f_opendir(&dir,path);
printf("res f_open : %02X\n\r",res);
if (res == FR_OK)
{
while(1)
{
char *fn;
res = f_readdir(&dir, &fno);
if (res != FR_OK)
printf("res = %d f_readdir\n\r", res);
if ((res != FR_OK) || (fno.fname[0] == 0))
break;
fn = fno.fname;
printf("%c%c%c%c ",
((fno.fattrib & AM_DIR) ? 'D' : '-'),
((fno.fattrib & AM_RDO) ? 'R' : '-'),
((fno.fattrib & AM_SYS) ? 'S' : '-'),
((fno.fattrib & AM_HID) ? 'H' : '-') );
printf("%10d ", fno.fsize);
printf("%s/%s\n\r", path, fn);
}
}
res = f_mount(0,path,0);
printf("SD Unmount : res f_mount : %02X\n\r",res);
}
}
반응형