안녕하세요, 오랜만입니다.
전광판 프로젝트가 얼추 마무리되어 다시 활동을 재개 합니다. ^^
전광판 프로젝트에서 파일을 변환하는 기능이 필요해서 검토를 하다보니,
파일을 변환하려면, 읽을 파일과 쓸 파일, 이렇게 2개의 파일을 열어야 하네요.
그럼 먼저 여러 개의 파일을 열려면 어디를 고쳐야 하는지 찾아 봤는데,
다행히도 CUBEMX 는 기본으로 2개의 파일을 열 수 있도록 셋팅이 되어 있었습니다.
총 255 개의 파일을 열 수 있다고 합니다.
셋팅 방법은 CUBEMX 의 Configuration TAB 에서, Middleware 의 FATFS 를 선택합니다.
그 다음으로, FATFS Configuration 의 Set Define 에서 FS_LOCK 값을 수정하면 동시에 열 수 있는 파일의 갯수를 조정할 수 있는데, 설정값에 따라 총 255개의 파일을 동시에 열 수 있습니다. 저는 동시에 2개의 파일만 열려고 하니, 디폴트로 2로 그냥 놔두겠습니다.
혹시나 해서 이 값을 1로 바꾸니, 나중에 열도록 한 파일이 안 열리더군요.
따라서 이 값이 동시에 열 수 있는 파일의 갯수를 의미함이 틀림없습니다. ^^
USB MSC(Mass Storage Class) 는 예전에 SD_Card 를 USB Drive 로 동작시켰던 글에서,
귀찮아서 DMA를 동작 시키지 않도록 프로그램했습니다.
DMA를 사용하지 않는 방법은, 예전 글에서 DMA 를 설정하는 부분과 인터럽트 우선 순위를 설정하는 작업을 생략하고,
usbd_storage_if.c 파일의 STORAGE_Read_FS() 함수와 STORAGE_Write_FS()함수의 내부에 쓰인 함수를 일반 폴링 함수로 고치면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /******************************************************************************* * Function Name : STORAGE_Read_FS * Description : * Input : None. * Output : None. * Return : None. *******************************************************************************/ int8_t STORAGE_Read_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 6 */ BSP_SD_ReadBlocks((uint32_t *)buf, blk_addr * STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len); //BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr * STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len); return (USBD_OK); /* USER CODE END 6 */ } /******************************************************************************* * Function Name : STORAGE_Write_FS * Description : * Input : None. * Output : None. * Return : None. *******************************************************************************/ int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 7 */ BSP_SD_WriteBlocks((uint32_t *)buf, blk_addr * STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len); //BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr * STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len); return (USBD_OK); /* USER CODE END 7 */ } | cs |
그럼 다음으로, 파일을 2개 열어서 테스트하기 전에 USB MSC 로 읽을 파일을 PC에서 STM32F4 에 연결된 SD-Card 로 Copy 했습니다.
인터넷에서 돌아다니는 해리포터 소설 1장 만 띠어다 herry-1.txt 로 만들어 Sd card 에 복사 했습니다.
혹시 몰라 2장도 넣는데 .. 파일 3개 여는 테스트는 귀찮네요. ^^. 2개가 되면 3개도 되겠죠 뭐.
다음은, herry-1.txt 파일에서 512 바이트를 읽어서 herry-cnv.txt 파일에 쓰는 소스 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SDIO_SD_Init(); MX_USART1_UART_Init(); MX_FATFS_Init(); MX_USB_DEVICE_Init(); /* USER CODE BEGIN 2 */ HAL_SD_ErrorTypedef res_sd; FRESULT res; FILINFO fno; FIL fil_1,fil_2; DIR dir; FATFS fs32; uint32_t byteswritten, bytesread; /* File write/read counts */ uint8_t read_buf[1000]; char path[200]; #if _USE_LFN TCHAR lfn[_MAX_LFN + 1]; fno.lfname = lfn; fno.lfsize = sizeof lfn; #endif res = f_mount(&fs32,SD_Path,1); sprintf(path,"herry-1.txt"); res = f_open(&fil_1, (char*)path,FA_READ); sprintf(path,"herry-cnv.txt"); res = f_open(&fil_2, (char*)path, FA_WRITE | FA_CREATE_ALWAYS); res = f_read(&fil_1, &read_buf[0],512, &bytesread); res = f_write(&fil_2, &read_buf[0], 512, &byteswritten); res = f_close(&fil_1); res = f_close(&fil_2); res = f_mount(0,SD_Path,0); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } | cs |
위의 코드를 컴파일해서 다운로드 후 실행하면, herry-cnv.txt 파일이 생깁니다.
다음과 같이 각 파일을 열어 보니, 2개의 파일을 열어서(1개는 raed,1개는 Write) 512 바이트를 읽고 쓰는 테스트가 완료됐음을 확인했습니다.
첨부한 파일 이름이 프로젝트 진행 중인 파일 이름으로 되어 있어서 길이가 긴데, 이름은 아무 의미 없습니다. ^^
'STM32F4' 카테고리의 다른 글
[STM32F4xx] USB MSC 에서 파일 깨짐 현상 (0) | 2018.09.06 |
---|---|
[STM32F4xx] USB MSC (SD-Card FAT32) 의 속도 비교. (0) | 2018.09.06 |
[STM32F4xx] Read Unique ID/Flash Size/#REV/Device Signature (0) | 2018.09.06 |
[STM32F4xx] EEPROM Emulate Test (내부 Flash Mem 사용) (0) | 2018.09.06 |
[STM32F4xx] Polling us Delay 함수 (0) | 2018.09.05 |