Наш учебный курс по программированию микроконтроллеров с использованием новейших инструментов от ST, а именно STM32CubeMx, в самом разгаре. И на очереди у нас работа с SD-картой и файловой системой FatFS. В этот раз я буду использовать плату с микроконтроллером STM32F103VET6 (в отличие от предыдущих статей цикла, в которых использовалась STM32F4Discovery). В остальном все точно так же - запускаем CubeMx, создаем новый проект и начинаем разбираться.
Работать с файловой системой мы будем при помощи внешней SD-карты, подключенной к микроконтроллеру по интерфейсу SDIO, с которого мы и начнем настройку нашего проекта. Итак, осуществляем включение:
Собственно, активация SDIO происходит путем задания требуемого режима работы. В данном случае используем 4-х битный режим, именно так подключена карта памяти на моей плате:
В результате CubeMx активировал и необходимые выводы контроллера, в общем, как и обычно, не будем на этом останавливаться. Из настроек SDIO в текущем базовом проекте изменим только значение предделителя частоты:
Следующим шагом включаем поддержку FatFs в соответствующем разделе и задаем режим работы, конечно, "SD Card":
Многочисленные настройки файловой системы, расположенные ниже, спокойно оставляем дефолтными, сегодня нам нужно запустить максимально базовый пример.
В общем-то, на этом работа с STM32CubeMx заканчивается, осталось только сгенерировать исходный код и перейти к работе с проектом. Так и поступаем, а затем открываем проект и анализируем. CubeMx уже позаботился о том, чтобы вызвать необходимые функции инициализации, а кроме того осуществил связь файловой системы с SD-картой. То есть драйвер уже сконфигурирован так, что при вызове функций FatFs произойдет взаимодействие с картой по SDIO.
С этим все понятно, давайте добавим в функцию main()
тестовый код, который создаст новый файл на SD-карте и запишет в него некоторые данные:
/* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ extern char SDPath[4]; /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ 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_SDIO_SD_Init(); MX_FATFS_Init(); /* USER CODE BEGIN 2 */ FATFS fileSystem; FIL testFile; uint8_t testBuffer[16] = "SD write success"; UINT testBytes; FRESULT res; if(f_mount(&fileSystem, SDPath, 1) == FR_OK) { uint8_t path[13] = "testfile.txt"; path[12] = '\0'; res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS); res = f_write(&testFile, testBuffer, 16, &testBytes); res = f_close(&testFile); } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
Здесь мы последовательно:
- монтируем объект файловой системы -
f_mount()
- открываем файл -
f_open()
- записываем данные в файл -
f_write()
- закрываем файл -
f_close()
Максимально простой базовый пример для проверки работоспособности связки SDIO и FatFs 👍 В переменной res
можно увидеть, возникли ли ошибки при выполнении той или иной операции. Так что собираем проект и прошиваем контроллер. После выполнения программы на карте должен появиться новый файл, проверяем это, подключив SD к ПК:
На карте памяти обнаруживается файл testfile.txt с тем содержимым, что мы и планировали, а именно со строкой, сигнализирующей о том, что запись проведена успешно. Таким образом, задача решена.
Резюмируем ) В этой статье мы разобрались, как при помощи STM32CubeMx реализовать поддержку FatFs в нашем проекте. Собственно, большую часть работы CubeMx взял на себя, так что на сегодня на этом заканчиваем, обязательно следите за обновлениями нашего сайта!