Подключение к микроконтроллеру STM32 SD карты по SPI c DMA: stm32f401ccu6 + sd card spi dma
HTML-код
- Опубликовано: 11 сен 2024
- Подключение к микроконтроллеру STM32 SD карты по SPI c DMA. Микроконтроллер stm32f401ccu6 имеет ограниченный набор периферии. Например, у него нет интерфейса SDIO для подключения SD карты. Однако SD может быть подключена тремя способами: по SPI, по 1 каналу данных SDIO и по 4 каналам данных SDIO. Т.е. для stm32f401ccu6 доступно подключение карты памяти по spi. В видео показываю построение проекта и рассказываю про настройки.
Проект доступен для скачивания по ссылке: drive.google.c...
В приложении картинка со схемой подключения.
Поддержать канал:
donate.qiwi.co...
yoomoney.ru/to...
Покупал на Алиэкспресс:
программатор ST-Link alii.pub/6fdujg
плата разработки stm32f401ccu6 alii.pub/6fdumy
плата разработки stm32f411ceu6 alii.pub/6fduop
аудио-ЦАП pcm5102a alii.pub/6fdurf
макетная плата alii.pub/6fduuq
провода для макетной платы alii.pub/6fduwo
3.2" дисплей с тачскрином ILI9341 spi alii.pub/6fdvcf
1.3" дисплей ST7789 spi alii.pub/6fdvks
модуль микро SD карты alii.pub/6fdvoh
stm32, стм32, stm32f401ccu6, spi, sd, stm32 sd, stm32 sd spi, sd spi, spi dma, sd spi dma, stm32 sd spi dma, stm32f401ccu6 sd spi dma, подключение sd карты к stm32, sd + spi + dma, stm32+sd+spi+dma
Резервные явки, если явка на ютуб будет провалена:
Канал на Дзене: zen.yandex.ru/...
Группа в ВК: vadrov
#stm32
#программирование
#sdcard
Подключение дисплея st7789 по spi c dma на CMSIS и LL рассмотрено в видео ruclips.net/video/8tIJ16riJqo/видео.html
Подключение SD-карты по spi с dma на CMSIS и LL рассмотрено в видео ruclips.net/video/z99bLhlnukM/видео.html
Подключение кнопок на таймере с прерыванием на CMSIS и LL с устранением дребезга, автоповтором и буферов ввода (прямо как на PC 😉) рассмотрено в видео ruclips.net/video/e-w5HS75neg/видео.html
Файловый менеджер (структура и код) рассмотрен в видео ruclips.net/video/4c_PwnasQvs/видео.html
Подключение аудио-цап (audio dac) по интерфейсу i2s на CMSIS и LL рассмотрено в видео ruclips.net/video/p0IhX-XiiiQ/видео.html
К каждому из перечисленных видео есть ссылка в описании на проект для скачивания.
Поддержать канал:
donate.qiwi.com/payin/VadRov
yoomoney.ru/to/4100117522443917
Покупал на Алиэкспресс:
программатор ST-Link alii.pub/6fdujg
плата разработки stm32f401ccu6 alii.pub/6fdumy
плата разработки stm32f411ceu6 alii.pub/6fduop
аудио-ЦАП pcm5102a alii.pub/6fdurf
макетная плата alii.pub/6fduuq
провода для макетной платы alii.pub/6fduwo
3.2" дисплей с тачскрином ILI9341 spi alii.pub/6fdvcf
1.3" дисплей ST7789 spi alii.pub/6fdvks
модуль микро SD карты alii.pub/6fdvoh
Про подключение SD по SPI DMA к STM32, но без HAL (LL, регистры): ruclips.net/video/z99bLhlnukM/видео.html
Архив проекта из этого видео: drive.google.com/file/d/1TKiM8Gg1zN2MfJmGmefi3pn52UlcGUFG
Резервные явки, если явка на ютуб будет провалена:
Канал на Дзене: zen.yandex.ru/vadrov
Группа в ВК: vk.com/vadrov
Thank You VADROV
Здравствуйте. будет работать этот код на stm32f411ceu6?
Здравствуйте. Будет. Стройте проект для 411 и подключайте к нему драйвер.
Если МК поддерживает SDIO, в чем его преимущество перед SPI, кроме скорости? Уменьшает занятость процессора, или при использовании DMA нет разницы? Или если скорость не важна, то что лучше выбрать?
Преимущество в скорости (от 4 раз выше при использовании 4-разрядного sdio). Меньше загрузка ядра в сравнении со spi независимо от использования или неиспользования DMA: контроллер аппаратный и по командам сам формирует соответствующие запросы к карте в отличие от подключения по spi, где мы формируем запросы ввода/вывода к карте по соответствующей спецификации. Что выбрать, выбирает разработчик в зависимости от специфики проекта. К слову, sdio более "капризна" в обвязке: требуется подтяжка на линиях, желательна равнозначность длин проводников, особенно, при больших скоростях обмена, но легко реализуема на современных микроконтроллерах. spi проще в аппаратной реализации, да, и программный драйвер тоже проще.
Понял, спасибо. Все хочу попробовать :)
Добрый день, очень хороший и полезный метод. К сожалению у меня не работает. У меня версия STM cubide 1.10.11 а девайс Nucleo L452. Как изменить этот код для моей случии ? спосибо !
Приветствую.
Конечно, не работает. Там (stm32l4xxx) DMA иное, как в серии g0 (да, и spi тоже). Набросал, попробуйте:
drive.google.com/file/d/1054SpgjxuxivH0yIga5SmuDCfkYfv_zX/view
SD_MOSI -> PC3, SD_MISO -> PC2, SD_CLK -> PB10, SD_CS -> PC1. Ну, и питание к модулю SD (3.3 v) не забудьте подключить. На карте создайте в корневой директории файл test.txt При успешном открытии файла на плате должен мигать зеленый светодиод (подключен к выводу PA5) с частотой 3 раза в секунду, а при ошибке - один раз в секунду. Сам проверить не могу - нет "отладки" с такой серией МК в наличии. Код драйвера SD написан на CMSIS, так что, сам основной проект может быть хоть на HAL, хоть на LL.
Возможно ли записывать информацию на SD-карту в while(1)? До цикла запись производится без проблем, в цикле никак записи достичь не могу.
Если цикл пустой, то попробуйте вставить в него хотя бы одну строку __NOP()
Эс Пи Ай ❌
Спи ✅
Лэйбл ❌
Лабел ✅
Что здесь чёрт возьми происходит😅
Таинство. Он (микроконтроллер) и она (sd карта) решили сочетать себя узами вечного коннектинга.
У меня 2 ошибки и 3 предупреждения
Помогите, пожалуйста
user_diskio_spi.c
../FATFS/Target/user_diskio_spi.c:100: error: unterminated #else
100 | #ifdef SD_USE_DMA
*** [FATFS/Target/subdir.mk:22: FATFS/Target/user_diskio_spi.o] Error 1
"make -j20 all" terminated with exit code 2. Build might be incomplete.
Предупреждения
../FATFS/Target/user_diskio_spi.c:116:13: warning: 'SPI_DMA_TransmitReceive' defined but not used [-Wunused-function]
116 | static void SPI_DMA_TransmitReceive(SPI_TransferType type, const BYTE* buff, uint16_t buff_size)
| ^~~~~~~~~~~~~~~~~~~~~~~
../FATFS/Target/user_diskio_spi.c:88:13: warning: 'spi_rw' defined but not used [-Wunused-function]
88 | static BYTE spi_rw(BYTE wval)
| ^~~~~~
../FATFS/Target/user_diskio_spi.c:79:13: warning: 'set_sd_interface_speed' defined but not used [-Wunused-function]
79 | static void set_sd_interface_speed(uint8_t speed)
| ^~~~~~~~~~~~~~~~~~~~~~
Лучше воспользуйтесь вариантом работы c sd из проекта видеоплеера. Он основан на обновленной библиотеке FATFS: github.com/vadrov/stm32f4_fast_optimized_avi_player_osd/tree/main/FATFS
Я обновил архив. Перекачайте.
В общем, вымучил проект, заработало. Я копировал все коды автора себе, потом подправлял под свою распиновку, и вылезали новые ошибки. Пришлось вообще удалить файл system_stm32h7xx.c и ошибки ушли.
Спасибо!