реклама на сайте
подробности

 
 
> STM32H743 MDMA, Нет передачи в периферию
__inline__
сообщение Jul 18 2018, 14:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Использую H743 на отладочной плате Nucleo.

Работал с DMA, DMA2D - всё чудесно и превосходно: с AXI RAM отправляю буфер в LCD-дисплей по шине FMC 8-бит (дисплей со своим контроллером и видеопамятью).

Но не хватает опции перестановки байтов, потому что LCD требует передавать старший, затем младший байт. Пока использую REV16 per pixel.

Хочу избавиться от REV16, применив MDMA в котором можно включить перестановку байтов (слов и полу-слов).

Проблема: MDMA не работает: инит сделал Кубом , вызов через HAL. Код стандартный и нет нужды его приводить здесь.

Буфер кадра в AXI SRAM, дисплей на FMC, кеширование портов дисплея отключено (адреса 0xC0000000...0xC0010000). Дисплей чёрный - ничего не отрисовывает.

Почему?

Волнует специфика - может ли MDMA отрабатывать транзакции AXI SRAM => FMC ? Читал мануал, прямого ответа там на мой вопрос нет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
__inline__
сообщение Jul 19 2018, 09:41
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



Написал тестовый пример, пересылка память-память через MDMA.

Инит МДМА:

Код
static void MX_MDMA_Init(void)
{
  /* MDMA controller clock enable */
  __HAL_RCC_MDMA_CLK_ENABLE();

  /* Configure MDMA channel MDMA_Channel7 */
  /* Configure MDMA request hmdma_mdma_channel7_sw_0 on MDMA_Channel7 */
  hmdma_mdma_channel7_sw_0.Instance = MDMA_Channel7;
  hmdma_mdma_channel7_sw_0.Init.Request = MDMA_REQUEST_SW;
  hmdma_mdma_channel7_sw_0.Init.TransferTriggerMode = MDMA_BLOCK_TRANSFER;
  hmdma_mdma_channel7_sw_0.Init.Priority = MDMA_PRIORITY_LOW;
  hmdma_mdma_channel7_sw_0.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;
  hmdma_mdma_channel7_sw_0.Init.SourceInc = MDMA_SRC_INC_BYTE; //HALFWORD;
  hmdma_mdma_channel7_sw_0.Init.DestinationInc = MDMA_DEST_INC_BYTE; //HALFWORD;
  hmdma_mdma_channel7_sw_0.Init.SourceDataSize = MDMA_SRC_DATASIZE_BYTE; //HALFWORD;
  hmdma_mdma_channel7_sw_0.Init.DestDataSize = MDMA_DEST_DATASIZE_BYTE; //HALFWORD;
  hmdma_mdma_channel7_sw_0.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
  hmdma_mdma_channel7_sw_0.Init.BufferTransferLength = 8; //32; //1;
  hmdma_mdma_channel7_sw_0.Init.SourceBurst = MDMA_SOURCE_BURST_SINGLE;
  hmdma_mdma_channel7_sw_0.Init.DestBurst = MDMA_DEST_BURST_SINGLE;
  hmdma_mdma_channel7_sw_0.Init.SourceBlockAddressOffset = 0;
  hmdma_mdma_channel7_sw_0.Init.DestBlockAddressOffset = 0;
  if (HAL_MDMA_Init(&hmdma_mdma_channel7_sw_0) != HAL_OK)
  {
    Error_Handler();
  }

}


Main:
Код
u8 Buffer0[32] __attribute__((at(0x30000000)));  //__attribute__((aligned(32)));
volatile u8 Buffer1[32] /*__attribute__((aligned(32)));*/   __attribute__((at(0x30040000)));        //__attribute__((aligned(32)));

int main(void)
{
SCB_EnableICache();
SCB_EnableDCache();

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_MDMA_Init();

LED(RESET);

memset(       Buffer0,0,sizeof(Buffer0));
memset((void*)Buffer1,0,sizeof(Buffer1));

for(u32 i=0;i<32;i++)Buffer0[i]=0xAA;

SCB_CleanDCache(); //сбрасываем содержимое кэша данных в память

if(HAL_MDMA_Start(&hmdma_mdma_channel7_sw_0,(u32)Buffer0,(u32)Buffer1,1,1)         !=HAL_OK)while(1);

if(HAL_MDMA_PollForTransfer(&hmdma_mdma_channel7_sw_0,HAL_MDMA_BLOCK_TRANSFER,1000)!=HAL_OK)while(1);

delay_ms(500);

if(Buffer1[0]!=0xAA)
{
LED(SET);
while(1);
}

while(1)
{
LED(SET);
delay_ms(100);
LED(RESET);
delay_ms(100);
}



while(1);


Старт и опрос проходят без проблем. Проверяю первый байт приёмного буфера Buffer1, он не равен 0xAA как это в источнике - светодиод загорается и горит вечно:

Код
if(Buffer1[0]!=0xAA)
{
LED(SET);
while(1);
}


Что не здесь так?
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 19 2018, 10:22
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(__inline__ @ Jul 19 2018, 13:41) *
Что не здесь так?

Flush кэша данных-то Вы сделали, а invalidate после приема DMA где?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- __inline__   STM32H743 MDMA   Jul 18 2018, 14:38
|- - __inline__   Всё заработало, когда включил MPU. Протестил на ра...   Jul 19 2018, 10:49
- - Genadi Zawidowski   Инвалидэйт делать перед запуском дома на какую-то ...   Jul 19 2018, 11:01
- - Arlleex   Тут чисто из логики даже все следует. Есть D-Cache...   Jul 19 2018, 11:26
- - __inline__   Теперь всё ясно. Всем спасибо. Интересно, что ко...   Jul 19 2018, 11:38
|- - Arlleex   Цитата(__inline__ @ Jul 19 2018, 15:38) И...   Jul 19 2018, 12:20
|- - __inline__   Цитата(Arlleex @ Jul 19 2018, 13:20) Это ...   Jul 19 2018, 12:38
|- - esaulenka   Цитата(Arlleex @ Jul 19 2018, 15:20) Не з...   Jul 20 2018, 06:50
|- - Arlleex   Цитата(esaulenka @ Jul 20 2018, 10:50) Ка...   Jul 20 2018, 07:06
- - Genadi Zawidowski   ЦитатаПоэтому после выдачи события "транзакци...   Jul 19 2018, 14:54
|- - Arlleex   Цитата(Genadi Zawidowski @ Jul 19 2018, 17...   Jul 19 2018, 17:18
- - Genadi Zawidowski   Кодвообще не смог понять Вспомните, что в данном п...   Jul 19 2018, 21:20
|- - jcxz   Цитата(Genadi Zawidowski @ Jul 20 2018, 00...   Jul 19 2018, 22:28
- - Genadi Zawidowski   Дело в том, что пока процессор ожидает завершения ...   Jul 19 2018, 23:26
- - Arlleex   В общем, я лишь для общей картины добавлю официаль...   Jul 20 2018, 06:16
- - esaulenka   Да, неправ, это место просмотрел... Благо объемы у...   Jul 20 2018, 12:43
|- - Arlleex   Цитата(esaulenka @ Jul 20 2018, 16:43) Но...   Jul 20 2018, 14:23
- - Genadi Zawidowski   ЦитатаИ маленький буфер тоже по-хорошему выравнива...   Jul 20 2018, 13:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 11:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016