Написал тестовый пример, пересылка память-память через 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);
}
Что не здесь так?