Turgenev 1 14 июня Опубликовано 14 июня · Жалоба В контроллере STM32H743 надо завести QSPI через MDMA и SPI через DMA при помощи Keil и HAL. Завел QSPI через HAL-библиотеку с указанием линковщику следующих областей памяти (содержимое автоматически генерируемого scatter-файла), особенно RAM - это DTCM область памяти контроллера: Спойлер ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } } Пишу во внешнюю флешку и проверяю, что записал через QSPI командами: HAL_QSPI_Receive_DMA... HAL_QSPI_Command... HAL_QSPI_Transmit_DMA... Все работает. Пробую отправить что-нибудь через SPI DMA (HAL_SPI_Transmit_DMA). Ошибок нет, но физически ничего не происходит- осциллограф молчит. Проблема решилась указанием линковщику использовать область памяти AXI-SRAM (нашел на форуме ST): Спойлер https://community.st.com/t5/stm32-mcus-embedded-software/solved-stm32h7-spi-does-not-seem-to-work-with-dma/td-p/405973/page/2 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM2 0x24000000 0x00060000 { ; RW data .ANY (+RW +ZI) } } Но при таких указаниях линковщику QSPI перестал читать, хоть и ошибок также не выдает. Проверить, что я записал без чтения нет возможности, хоть ошибок при записи тоже не выдает. Указание обеих областей не помогает, QSPI так же не работает. Спойлер ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00060000 { .ANY (+RW +ZI) } } Стоит только убрать область AXI-SRAM, как QSPI снова нормально работает, но SPI молчит. Прикрепил файлы с инициализацией периферии и реализации функций: Спойлер main.h main.c mt25ql512abb.h mt25ql512abb.c stm32h7xx_hal_msp.c По ДШ QSPI MDMA и AXI SRAM висят на одной шине. DTCM как и следует из названия, напрямую взаимодействует с ядром. SPI2 через APB1 шину соединяется с AHB шиной, где реализуется взаимодействие с DMA1. Спойлер Посоветуйте, как можно решить проблему? Если честно, то не понятно, почему QSPI или MDMA не работает с AXI SRAM, когда они висят на одной шине и почему SPI или DMA не работают с DTCM памятью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 15 июня Опубликовано 15 июня · Жалоба 16 часов назад, Turgenev сказал: почему SPI или DMA не работают с DTCM памятью. Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу. Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти. Можете тупо указывать в функциях абсолютные адреса и ни один линкер это не изменит. Проверяйте включены и настроены ли все нужные области памяти и периферийные модули. Обратите внимение на настройки MPU - защита и кэширование областей памяти могут мешать работе DMA. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 15 июня Опубликовано 15 июня · Жалоба В 14.06.2024 в 19:36, Turgenev сказал: Посоветуйте, как можно решить проблему? Если честно, то не понятно, почему QSPI или MDMA не работает с AXI SRAM, когда они висят на одной шине и почему SPI или DMA не работают с DTCM памятью. как я понимаю, вы просто на шару потыкали кнопочки в кубе, и у вас это как-то заработало) Это так не работает) Там слишком много неочевидных моментов которые надо учесть. Проще всего найти примеры из комплекта отладочных плат ST или просто пошарится по github. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 15 июня Опубликовано 15 июня · Жалоба 2 часа назад, VladislavS сказал: Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу. Как и из чего понять что "так и задумано": DMA1 и SPI2 не предназначены для работы с DTCM, а QSPI и MDMA предназначены? И наоборот с AXI SRAM. Из блок-схемы организации памяти и периферии это не очевидно. 2 часа назад, VladislavS сказал: Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти. Я, серьезно, меняю только лишь галочку какую память использовать и SPI с QSPI то работают, то нет, в противофазе- когда работает один, второй не работает. Может не на периферию влияет, а на доступ периферии к переменным, с которыми я хочу работать. Спойлер 2 часа назад, VladislavS сказал: Проверяйте включены и настроены ли все нужные области памяти и периферийные модули. Модули то точно включены и настроены, раз отваливаются только при изменении Scatter файла. А что вы понимаете под включением и настройкой областей памяти, кроме указаний линковщику в Scatter файле? Мой вариант это разместить переменные для работы, например, с SPI в AXI SRAM через директиву __attribute__, при указании в Scatter файле памяти DTCM (галочка на IRAM1). 3 часа назад, VladislavS сказал: Обратите внимение на настройки MPU - защита и кэширование областей памяти могут мешать работе DMA. Да, у меня используются настройки MPU, чтобы заработал драйвер MAC-контроллера с библиотекой LwIP. Но область, защищаемая в моих настройках располагается начиная с 0x30040000 (область между SRAM2 и SRAM4, я так понимаю описывающая периферию). К областям DTCM и AXI SRAM настройки MPU отношения не имеют. 20 минут назад, HardEgor сказал: как я понимаю, вы просто на шару потыкали кнопочки в кубе, и у вас это как-то заработало) Это так не работает) Там слишком много неочевидных моментов которые надо учесть. Проще всего найти примеры из комплекта отладочных плат ST или просто пошарится по github. Я бы хотел, чтобы так работало, но нет- с QSPI, LwIP, SPI после пары кнопочек в кубе были долгие поиски что дописать, донастроить, чтобы заработало как надо. Пример с одновременной работой QSPI и SPI очень специфичный, не видел. По отдельности есть, там память в Scatter файле разная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 15 июня Опубликовано 15 июня (изменено) · Жалоба Получилось завести QSPI MDMA при указании в линковщике памяти AXI SRAM (0x24000000). Подсмотрел где линковщик размещает массивы чтения и записи при использовании DTCM памяти и создал новые массивы для работы с QSPI в этих областях: Спойлер __attribute__((at(0x20000348))) uint8_t data_qspi[FLASH_PROGRAM_SIZE]; __attribute__((at(0x20000448))) uint8_t rx_data[FLASH_PROGRAM_SIZE]; Проверить не отвалился ли SPI пока можно только осцилом, что постараюсь сделать к вечеру. Но вопрос все еще актуален: почему QSPI надо указывать DTCM память, а SPI ... и тд, где про это можно почитать? В ДШ на МК это точно не описано. Так же видел в примерах работы с SPI, что перед командами чтения или записи очищают кэш и выравнивают массив по 32 бита: Спойлер SCB_CleanDCache_by_Addr((uint32_t*)data, FLASH_PROGRAM_SIZE); Про это тоже не могу найти информации: когда возникает необходимость так делать, почему и что происходит в этой команде? Ощущение что где-то потерял из виду слона. Изменено 15 июня пользователем Turgenev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 15 июня Опубликовано 15 июня · Жалоба P.S. Вы пытаетесь "с пыру" вкурить хитрое и сложное ядро Cortex-M7 и еще более сложную конкретную реализацию в STM32H7, воодушевившись подходом в стиле, прокатывающим для мелких простых STM32F103, например. Тут так не получится и придется изучать мануалы - референс на ядро ARM Cortex-M7, а также даташит и референс на STM32H7. Судя по последнему вопросу, еще и отдельные аппликейшн ноуты по управлению кешированием. Натыкиванием галочек в упрощенном гуи кейла Вам не добиться желаемого результата, ИМХО. За любым простым "почему так" стоят сотни страниц указанных выше документов, и не каждый захочет играть в эту игру. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 16 июня Опубликовано 16 июня · Жалоба Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM: Спойлер Но эта диаграмма неисчерпывающий источник информации. В 15.06.2024 в 12:21, Arlleex сказал: P.S. Вы пытаетесь "с пыру" вкурить хитрое и сложное ядро Cortex-M7 и еще более сложную конкретную реализацию в STM32H7, воодушевившись подходом в стиле, прокатывающим для мелких простых STM32F103, например. Тут так не получится и придется изучать мануалы - референс на ядро ARM Cortex-M7, а также даташит и референс на STM32H7. Судя по последнему вопросу, еще и отдельные аппликейшн ноуты по управлению кешированием. Натыкиванием галочек в упрощенном гуи кейла Вам не добиться желаемого результата, ИМХО. За любым простым "почему так" стоят сотни страниц указанных выше документов, и не каждый захочет играть в эту игру. Всё так, да почти. Если вдаваться в мои истинные мотивы: да, действую "с пыру", но это лишь преимущество электроники, когда можно сначала попробовать. Я же говорил, у меня ничего не получилось, чтобы нажал пару кнопок и заработало, даже с F103. Всегда приходилось лезть и разбираться. И от вас, я не просил решения в стиле "запрогайте мне, а то не получается". Я сам за подход, когда есть знания, а потом их применяешь. Думал и здесь достаточно изучил работу QSPI и SPI, это оказалось не так. Но согласитесь, ведь изучать весь референс и все апноуты к H7 излишне, когда используешь лишь малую часть этого могучего контроллера. В итоге разобрался с проблемой, все интерфейсы работают, дело было в области памяти где размещается переменная, которую используешь. Через атрибут указал размещение массива для SPI в AXI SRAM. У вас, форумчан, я просил совета "почему так". Нельзя это объяснить в сообщении. Хорошо, понял. Вы отправили читать референс. Это тоже ответ. В любом случае буду рад любым советам, что почитать, чтобы восполнить пробелы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 16 июня Опубликовано 16 июня · Жалоба 1 час назад, Turgenev сказал: Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM: Показать контент Это с чего сделан такой странный вывод?? Вроде по рисунку чётко видно, что DTCM подключена только к ядру. Как можно умудриться так извращённо понять его?... Вот уж и вправду говорят: "Даже если ваше объяснение настолько ясно, что исключает всякое ложное толкование, все равно найдется как минимум один человек, который поймет его неправильно". 1 час назад, Turgenev сказал: Но эта диаграмма неисчерпывающий источник информации. По этой диаграмме любой благоразумный человек поймёт - что с чем работает. Уж насколько нужно вывернуть мозг, чтобы понять её неверно. Подобные диаграммы есть в мануале практически каждого контроллера. Читаются они везде одинаково. Неужто вы их ни разу раньше не видели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 16 июня Опубликовано 16 июня · Жалоба 5 минут назад, jcxz сказал: По этой диаграмме любой благоразумный человек поймёт - что с чем работает. Не спорю, не шарю. Но чем мой путь доступа DMA1 к DTCM отличается от пути доступа MDMA к DTCM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 16 июня Опубликовано 16 июня · Жалоба 40 минут назад, Turgenev сказал: Не спорю, не шарю. Но чем мой путь доступа DMA1 к DTCM отличается от пути доступа MDMA к DTCM? Тем что нет никакого "пути доступа DMA1 к DTCM". На вашем же рисунке всё написано. Неужто так сложно его прочитать? Что такое "Master interface" и "Slave interface" - понимаете? Где на вашей картинке обозначения "Master", а где "Slave" - видите? Почему доступ может идти только по пути: "Master" -> "Slave" - понимаете? Это примерно то же самое, что в электронике вход логического элемента и его выход. Понимаете почему нельзя соединять два выхода лог.элементов? Вот и здесь примерно то же самое. Ну или примерно то же самое как две части разъёма: "папа" и "мама". И почему нельзя воткнуть "папу" в "папу"? (хотя в нонешние времена это уже могут подвергнуть сомнению; особенно в некоторых странах ) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 17 июня Опубликовано 17 июня (изменено) · Жалоба 1 час назад, jcxz сказал: Что такое "Master interface" и "Slave interface" - понимаете? Где на вашей картинке обозначения "Master", а где "Slave" - видите? Почему доступ может идти только по пути: "Master" -> "Slave" - понимаете? Я это все понимаю, но, очевидно, меня ввел в заблуждение путь от AXI SRAM к DMA1, который точно должен быть и который я на тот момент провел мысленно. И там у меня не бились мастера со слэйвами. Вот провожу его уже не мысленно: Спойлер Раздельными синими линиями указал путь между мультиплексорами, красные крестики: - в D1 это 2 мастера, один AXI шины, другой AHB шины; - в D2 это 2 слэйва AHB шины. Доступ DMA1 к AXI SRAM осуществляется другим путем? UPD: Да, мой путь не верен. Настоящий путь поизвилистее будет: Спойлер https://www.st.com/resource/en/application_note/an4891-stm32h72x-stm32h73x-and-singlecore-stm32h74x75x-system-architecture-and-performance-stmicroelectronics.pdf Изменено 17 июня пользователем Turgenev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 17 июня Опубликовано 17 июня · Жалоба 19 часов назад, Turgenev сказал: Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM: Скрыть контент По поводу чтения таких диаграмм: нельзя считать каждую точечку пересечений за "истинное" пересечение, где данные могут расходиться в любые стороны. Это не так. Вы должны четко понимать, что нельзя соединить 2 мастера: например, вы рисуете соединение AXIM с DMA1_PERIPH. AXIM - это мастер-порт, у DMA тоже оба порта - мастер-порты. Как минимум не стыкуется. Далее - через AXIM доступ к DTCM не получить: только через Slave-порт TCU-блока, т.е. через AHBS, подключенный к MDMA. Иначе никакого смысла бы DTCM не имела как таковая. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 17 июня Опубликовано 17 июня · Жалоба ... почему нельзя воткнуть "папу" в "папу"? (хотя в нонешние времена это уже могут подвергнуть сомнению; особенно в некоторых странах :biggrin: ) Ну, вам в ваших европах лучше видно ;-) А вообще, когда для проверки в некоем училище выдали кабели только с "папами", то выяснилось - одна половина курсантов непроходима тупа, зато другая отличается огромной физической силой ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться