Перейти к содержанию
    

Настройки линковщика STM32H7

В контроллере STM32H743 надо завести QSPI через MDMA и SPI через DMA при помощи Keil и HAL.

Завел QSPI через HAL-библиотеку с указанием линковщику следующих областей памяти (содержимое автоматически генерируемого scatter-файла), особенно RAM - это DTCM область памяти контроллера:

Спойлер

image.png.26c8bc5771f05fb00b520a80869595fc.png

 

; *************************************************************
; *** 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 молчит. Прикрепил файлы с инициализацией периферии и реализации функций:

По ДШ QSPI MDMA и AXI SRAM висят на одной шине. DTCM как и следует из названия, напрямую взаимодействует с ядром. SPI2 через APB1 шину соединяется с AHB шиной, где реализуется взаимодействие с DMA1.

Спойлер

image.thumb.png.9e1b2efb5e021dcb2b90fe76eb0de5ec.png

Посоветуйте, как можно решить проблему? Если честно, то не понятно, почему QSPI или MDMA не работает с AXI SRAM, когда они висят на одной шине и почему SPI или DMA не работают с DTCM памятью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Turgenev сказал:

почему SPI или DMA не работают с DTCM памятью.

Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу.

Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти. Можете тупо указывать в функциях абсолютные адреса и ни один линкер это не изменит. Проверяйте включены и настроены ли все нужные области памяти и периферийные модули. Обратите внимение на настройки MPU - защита и кэширование  областей памяти могут мешать работе DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 14.06.2024 в 19:36, Turgenev сказал:

Посоветуйте, как можно решить проблему? Если честно, то не понятно, почему QSPI или MDMA не работает с AXI SRAM, когда они висят на одной шине и почему SPI или DMA не работают с DTCM памятью.

как я понимаю, вы просто на шару потыкали кнопочки в кубе, и у вас это как-то заработало)

Это так не работает) Там слишком много неочевидных моментов которые надо учесть. Проще всего найти примеры из комплекта отладочных плат ST или просто пошарится по github.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, VladislavS сказал:

Потому что так задумано. DTCM и ITCM только для ядра доступны без всяких шин быстро и сразу.

Как и из чего понять что "так и задумано": DMA1 и SPI2 не предназначены для работы с DTCM, а QSPI и MDMA предназначены? И наоборот с AXI SRAM. Из блок-схемы организации памяти и периферии это не очевидно.

2 часа назад, VladislavS сказал:

Вообще, настройки линкера никак не влияют на работу периферийных устройст, а лишь размещают данные в памяти.

Я, серьезно, меняю только лишь галочку какую память использовать и SPI с QSPI то работают, то нет, в противофазе- когда работает один, второй не работает. Может не на периферию влияет, а на доступ периферии к переменным, с которыми я хочу работать.

Спойлер

image.png.1b1b38dadf6a0d35b6030609c2991c4d.png

 

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 файле разная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получилось завести 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);

Про это тоже не могу найти информации: когда возникает необходимость так делать, почему и что происходит в этой команде?

Ощущение что где-то потерял из виду слона.

Изменено пользователем Turgenev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

image.png.3741da97aa576f92a492ac8399579391.png


P.S. Вы пытаетесь "с пыру" вкурить хитрое и сложное ядро Cortex-M7 и еще более сложную конкретную реализацию в STM32H7, воодушевившись подходом в стиле, прокатывающим для мелких простых STM32F103, например. Тут так не получится и придется изучать мануалы - референс на ядро ARM Cortex-M7, а также даташит и референс на STM32H7. Судя по последнему вопросу, еще и отдельные аппликейшн ноуты по управлению кешированием. Натыкиванием галочек в упрощенном гуи кейла Вам не добиться желаемого результата, ИМХО.

За любым простым "почему так" стоят сотни страниц указанных выше документов, и не каждый захочет играть в эту игру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM:

Спойлер

image.thumb.png.4f708ecbae238cbe543fd51830a68b59.png

  Но эта диаграмма неисчерпывающий источник информации.

В 15.06.2024 в 12:21, Arlleex сказал:

P.S. Вы пытаетесь "с пыру" вкурить хитрое и сложное ядро Cortex-M7 и еще более сложную конкретную реализацию в STM32H7, воодушевившись подходом в стиле, прокатывающим для мелких простых STM32F103, например. Тут так не получится и придется изучать мануалы - референс на ядро ARM Cortex-M7, а также даташит и референс на STM32H7. Судя по последнему вопросу, еще и отдельные аппликейшн ноуты по управлению кешированием. Натыкиванием галочек в упрощенном гуи кейла Вам не добиться желаемого результата, ИМХО.

За любым простым "почему так" стоят сотни страниц указанных выше документов, и не каждый захочет играть в эту игру.

Всё так, да почти. Если вдаваться в мои истинные мотивы: да, действую "с пыру", но это лишь преимущество электроники, когда можно сначала попробовать. Я же говорил, у меня ничего не получилось, чтобы нажал пару кнопок и заработало, даже с F103. Всегда приходилось лезть и разбираться. И от вас, я не просил решения в стиле "запрогайте мне, а то не получается". Я сам за подход, когда есть знания, а потом их применяешь. Думал и здесь достаточно изучил работу QSPI и SPI, это оказалось не так. Но согласитесь, ведь изучать весь референс и все апноуты к H7 излишне, когда используешь лишь малую часть этого могучего контроллера.

В итоге разобрался с проблемой, все интерфейсы работают, дело было в области памяти где размещается переменная, которую используешь. Через атрибут указал размещение массива для SPI в AXI SRAM. 

У вас, форумчан, я просил совета "почему так". Нельзя это объяснить в сообщении. Хорошо, понял. Вы отправили читать референс. Это тоже ответ.

В любом случае буду рад любым советам, что почитать, чтобы восполнить пробелы. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Turgenev сказал:

Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM:

  Показать контент

image.thumb.png.4f708ecbae238cbe543fd51830a68b59.png

Это с чего сделан такой странный вывод?? Вроде по рисунку чётко видно, что DTCM подключена только к ядру. Как можно умудриться так извращённо понять его?... :wacko2:

Вот уж и вправду говорят: "Даже если ваше объяснение настолько ясно, что исключает всякое ложное толкование, все равно найдется как минимум один человек, который поймет его неправильно".  :biggrin:

1 час назад, Turgenev сказал:

  Но эта диаграмма неисчерпывающий источник информации.

По этой диаграмме любой благоразумный человек поймёт - что с чем работает. Уж насколько нужно вывернуть мозг, чтобы понять её неверно.  :crazy:

Подобные диаграммы есть в мануале практически каждого контроллера. Читаются они везде одинаково. Неужто вы их ни разу раньше не видели?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, jcxz сказал:

По этой диаграмме любой благоразумный человек поймёт - что с чем работает.

Не спорю, не шарю. Но чем мой путь доступа DMA1 к DTCM отличается от пути доступа MDMA к DTCM? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, Turgenev сказал:

Не спорю, не шарю. Но чем мой путь доступа DMA1 к DTCM отличается от пути доступа MDMA к DTCM? 

Тем что нет никакого "пути доступа DMA1 к DTCM". На вашем же рисунке всё написано. Неужто так сложно его прочитать?

image.png.763766def728c0b05ce47d68b4448506.png

Что такое "Master interface" и "Slave interface" - понимаете?

Где на вашей картинке обозначения "Master", а где "Slave" - видите?

Почему доступ может идти только по пути: "Master" -> "Slave" - понимаете? 

 

Это примерно то же самое, что в электронике вход логического элемента и его выход. Понимаете почему нельзя соединять два выхода лог.элементов? Вот и здесь примерно то же самое.

Ну или примерно то же самое как две части разъёма: "папа" и "мама". И почему нельзя воткнуть "папу" в "папу"? (хотя в нонешние времена это уже могут подвергнуть сомнению; особенно в некоторых странах :biggrin:  )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Что такое "Master interface" и "Slave interface" - понимаете?

Где на вашей картинке обозначения "Master", а где "Slave" - видите?

Почему доступ может идти только по пути: "Master" -> "Slave" - понимаете? 

Я это все понимаю, но, очевидно, меня ввел в заблуждение путь от AXI SRAM к DMA1, который точно должен быть и который я на тот момент провел мысленно. И там у меня не бились мастера со слэйвами. Вот провожу его уже не мысленно:

Спойлер

image.thumb.png.6903153cabfd5e682946f817bc786380.png

Раздельными синими линиями указал путь между мультиплексорами, красные крестики: - в D1 это 2 мастера, один AXI шины, другой AHB шины;

- в D2 это 2 слэйва AHB шины.

Доступ DMA1 к AXI SRAM осуществляется другим путем?

 

 

UPD: Да, мой путь не верен. Настоящий путь поизвилистее будет:

 

Изменено пользователем Turgenev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, Turgenev сказал:

Изучал я эту диаграмму и в ней также можно проследить, что DMA1 может использовать DTCM:

  Скрыть контент

image.thumb.png.4f708ecbae238cbe543fd51830a68b59.png

По поводу чтения таких диаграмм: нельзя считать каждую точечку пересечений за "истинное" пересечение, где данные могут расходиться в любые стороны. Это не так. Вы должны четко понимать, что нельзя соединить 2 мастера: например, вы рисуете соединение AXIM с DMA1_PERIPH. AXIM - это мастер-порт, у DMA тоже оба порта - мастер-порты. Как минимум не стыкуется. Далее - через AXIM доступ к DTCM не получить: только через Slave-порт TCU-блока, т.е. через AHBS, подключенный к MDMA. Иначе никакого смысла бы DTCM не имела как таковая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... почему нельзя воткнуть "папу" в "папу"? (хотя в нонешние времена это уже могут подвергнуть сомнению; особенно в некоторых странах :biggrin: )
Ну, вам в ваших европах лучше видно ;-)
А вообще, когда для проверки в некоем училище выдали кабели только с "папами", то выяснилось - одна половина курсантов непроходима тупа, зато другая отличается огромной физической силой ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...