Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32H743 DMA

Вт ноя 19, 2019 08:33:21

Доброго времени суток!

Понадобилось передать массив по SPI с использованием DMA. .data .bss ._user_heap_stack расположил в RAM_D1.
Среда разработки TrueSTUDIO в связке с CubeMX, использую стандартную команду HAL_SPI_Transmit_DMA.

При передаче глобального массива все ок, работает без проблем, но при попытке передачи массива, объявленного внутри функции, SPI не передает ничего.

Пробовал включать I,D cache, запрещал кеширование всего RAM_D1, менял расположение на RAM_D2, использовал DMA1,2 с разными потоками(все это в разных комбинациях). Ничего не помогает.
В HAL'овской структуре SPI код ошибки 16(Значит ошибка связана с DMA), в структуре DMA код ошибки 1.
Ниже прилагаю System architecture контроллера и(на всякий случай) данные структуры, после вызова функции HAL_SPI_Transmit_DMA

Изображение Изображение
Буду благодарен за любую идею.

Re: STM32H743 DMA

Вт ноя 19, 2019 13:23:56

При передаче глобального массива все ок, работает без проблем, но при попытке передачи массива, объявленного внутри функции, SPI не передает ничего.
Объявленного где? Уж не на стеке-ли с последующим выходом из функции до завершения DMA-транзакции? :))) :)))

Добавлено after 1 minute 36 seconds:
Буду благодарен за любую идею.
Лучше бы показали как объявляете массив, стартуете/завершаете DMA-транзакцию. А если массив на стеке, то ещё - где (в каком регионе ОЗУ) находится стек?

Re: STM32H743 DMA

Вт ноя 19, 2019 14:17:28

Объявленного где? Уж не на стеке-ли с последующим выходом из функции до завершения DMA-транзакции? :))) :)))
Лучше бы показали как объявляете массив, стартуете/завершаете DMA-транзакцию. А если массив на стеке, то ещё - где (в каком регионе ОЗУ) находится стек?

Спасибо, что заставили перепроверить, а то я уже хотел забросить это дело. Думал,что в build analyzer(нижеприведенный скриншот) достоверные данные.
Посмотрел через printf адрес переменной, а она почему то в DTCMRAM.

Изображение

Суть в том что в .ld файле есть нижеприведенный параметр(о котором я даже не подозревал). Вот я его и не заметил, поправив только циферки в build analyzer.
Код:
_estack = 0x20020000;    //было(конец DTCMRAM)
_estack = 0x24080000;    //стало(конец RAM_D1)


Теперь работает.
Ответить