Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-15 13:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 09:54 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
Здравствуйте,
Сейчас разбираюсь с принципом работы DMA на 1986ВЕ3Т. Пытаюсь реализовать простейший пример пересылки данных по принципу память - память. Т.е. пересылка данных из одной области памяти в другую не простым копирование, а при помощи DMA. На диске, который шел вместе с отладочной платой, нашел пример. Я его немного отредактировал под компилятор gcc. Запускаю его, компилируются все нормально, но пересылка данных память-память не осуществляется. В чем может быть проблема?

Файл скопировал просто в сообщение. В приложение не удалось его добавить

/**
******************************************************************************
* @file Examples/MDR1986VE3/DMA/Pri_Alt_Channels/main.c
* @author Milandr Application Team
* @version V1.2.0
* @date 14/06/2013
* @brief Main program body.
******************************************************************************
* <br><br>
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, MILANDR SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>&copy; COPYRIGHT 2013 Milandr</center></h2>
*/

/* Includes ------------------------------------------------------------------*/
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_rst_clk.h"
#include "MDR32F9Qx_dma.h"
#include "uart.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_eeprom.h"
#include "MDR32F9Qx_timer.h"

/** @addtogroup __MDR32F9Qx_StdPeriph_Examples MDR32F9Qx StdPeriph Examples
* @{
*/

/** @addtogroup __MDR1986VE3_EVAL MDR1986VE3 Complexity Evaluation Board
* @{
*/


/** @addtogroup DMA_Pri_Alt_Channels_3T DMA_Pri_Alt_Channels
* @{
*/

/* Private typedef -----------------------------------------------------------*/
typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
#define SIZE 0x10

#define PER_CLOCK_TIMER1_ONCLK (1<<14) //Маска разрешения тактирования таймера 1.
#define PER_CLOCK_TIMER2_ONCLK (1<<15) //Маска разрешения тактирования таймера 1.
#define TIM_CLOCK_TIM1_CLK_EN (1<<24) //Маска включения частоты на таймере 1.
#define SHARE_HCLK_TIMER1 7 //Делим тактовую частоту HCLK на... (0 = не делим, 1 = /2, 2 = /4).
#define TIM_CLOCK_TIM1_BRG (SHARE_HCLK_TIMER1<<0) //Делим частоту на таймере 1 на SHARE_HCLK_TIMER.
#define CNTRL_CNT_EN (1<<0) //Маска включения таймера.
#define CNTRL_EVENT_SEL (1<<8) //Маска выбора сточник события: CNT == ARR;
#define DMA_RE_CNT_ARR_EVENT_RE (1<<1) //Маска разрешения запроса DMA при событии CNT == ARR;
#define IE_CNT_ARR_EVENT_IE (1<<1) //Маска разрешения прерывания при событии CNT == ARR;
#define TIM_CLOCK_TIM2_CLK_EN (1<<25) //Маска включения частоты на таймере 2.
#define SHARE_HCLK_TIMER2 7 //Делим тактовую частоту HCLK на... (0 = не делим, 1 = /2, 2 = /4).
#define TIM_CLOCK_TIM2_BRG (SHARE_HCLK_TIMER2<<8)//Делим частоту на таймере 1 на SHARE_HCLK_TIMER.

#define CH1_CNTRL_CAP_nPWM_Z (1<<15) //Маска: какнал в режиме "захват".
#define CH1_CNTRL_CHPSC_8 (3<<6) //Маска: предворительный делитель для канала на 8.
#define CHy_CNTRL2_CCR1_EN (1<<2) //Маска: включить канал 1.
#define TIMERx_IE_CNT_ARR_EVENT_IE (1<<1) //Маска: Флага разрешения прерывания по событию совпадения CNT и ARR.

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
RST_CLK_FreqTypeDef CLK_FrequencyStructure;

uint32_t DestBuf[SIZE] __attribute__((section(".dma_ram.DestBuf")));
uint32_t PriBuf[SIZE] __attribute__((section(".dma_ram.PriBuf")));
uint32_t AltBuf[SIZE] __attribute__((section(".dma_ram.AltBuf")));

volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;

/* Private function prototypes -----------------------------------------------*/
void Init_RAM (uint32_t *addr, uint32_t size);
TestStatus Verif_mem (uint32_t BufSize, uint32_t *pBuffer1, uint32_t *pBuffer2);
uint32_t ps_rand(uint32_t addr);
void port_init(void);
void clk_init(void);

/* Private functions ---------------------------------------------------------*/
/**
* @brief Initialisation memory pseudo random value
* @param addr - memory address
* @param size - memory size
* @retval None
*/
void Init_RAM (uint32_t *addr, uint32_t size)
{
uint32_t i;

for (i = 0; i < size; i++)
{
*addr++ = ps_rand((uint32_t)addr + i*4);
}
printf("Init_RAM\n");
}

/**
* @brief Compares two buffers.
* @param pBuffer1, pBuffer2: buffers to be compared.
* @param BufSize: buffer's size
* @retval PASSED: pBuffer1 identical to pBuffer2
* FAILED: pBuffer1 differs from pBuffer2
*/
TestStatus Verif_mem (uint32_t BufSize, uint32_t *pBuffer1, uint32_t *pBuffer2)
{
uint32_t i;

for(i = 0; i < BufSize; i++)
{
if (*pBuffer1++ != *pBuffer2++)
{
return(FAILED);
}
}

printf("Verif_mem\n");
return(PASSED);
}

/**
* @brief Generation random values
* @param addr -
* @retval None
*/
uint32_t ps_rand(uint32_t addr)
{
uint32_t hash = 0;
uint32_t i;
char *key = (char *)&addr;

for (i = 0; i < 4; i++)
{
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}

for (i = 0; i < 256; i++)
{
hash += (hash << 10);
hash ^= (hash >> 6);
}

hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);

return hash;
}

/**
* @brief Main program.
* @param None
* @retval None
*/
void main(void)
{

DMA_ChannelInitTypeDef DMA_InitStr;
DMA_CtrlDataInitTypeDef DMA_PriCtrlStr;
DMA_CtrlDataInitTypeDef DMA_AltCtrlStr;

uint32_t DMA_Channel = 3;

clk_init();
usartInit();
port_init();

// RST_CLK_DeInit();

/* Init RAM */
Init_RAM (DestBuf, SIZE);
Init_RAM (PriBuf, SIZE);
Init_RAM (AltBuf, SIZE);

/* Reset all settings */
DMA_DeInit();
DMA_StructInit(&DMA_InitStr);

/* Set Primary Control Data */
DMA_PriCtrlStr.DMA_SourceBaseAddr = (uint32_t)PriBuf;
DMA_PriCtrlStr.DMA_DestBaseAddr = (uint32_t)DestBuf;
DMA_PriCtrlStr.DMA_SourceIncSize = DMA_SourceIncWord;
DMA_PriCtrlStr.DMA_DestIncSize = DMA_DestIncWord;
DMA_PriCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_PriCtrlStr.DMA_Mode = DMA_Mode_Basic;
DMA_PriCtrlStr.DMA_CycleSize = SIZE;
DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_512;
DMA_PriCtrlStr.DMA_SourceProtCtrl = DMA_SourcePrivileged;
DMA_PriCtrlStr.DMA_DestProtCtrl = DMA_DestPrivileged;

/* Set Alternate Control Data */
DMA_AltCtrlStr.DMA_SourceBaseAddr = (uint32_t)AltBuf;
DMA_AltCtrlStr.DMA_DestBaseAddr = (uint32_t)DestBuf;
DMA_AltCtrlStr.DMA_SourceIncSize = DMA_SourceIncWord;
DMA_AltCtrlStr.DMA_DestIncSize = DMA_DestIncWord;
DMA_AltCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_AltCtrlStr.DMA_Mode = DMA_Mode_AutoRequest;
DMA_AltCtrlStr.DMA_CycleSize = SIZE;
DMA_AltCtrlStr.DMA_NumContinuous = DMA_Transfers_16;
DMA_AltCtrlStr.DMA_SourceProtCtrl = DMA_SourcePrivileged;
DMA_AltCtrlStr.DMA_DestProtCtrl = DMA_DestPrivileged;

/* Set Channel Structure */
DMA_InitStr.DMA_PriCtrlData = &DMA_PriCtrlStr;
DMA_InitStr.DMA_AltCtrlData = &DMA_AltCtrlStr;
DMA_InitStr.DMA_Priority = DMA_Priority_Default;
DMA_InitStr.DMA_UseBurst = DMA_BurstClear;
DMA_InitStr.DMA_SelectDataStructure = DMA_CTRL_DATA_PRIMARY;

/* Init DMA channel */
DMA_Init(DMA_Channel, &DMA_InitStr);

/* Run channel */
DMA_Cmd(DMA_Channel, ENABLE);
DMA_Request(DMA_Channel);

/* Transfer complete */
while (DMA_GetFlagStatus(DMA_Channel, DMA_FLAG_CHNL_ENA))
{
if((MDR_DMA->STATUS & 0x000000F0)==0x00000000)
{
DMA_Request(DMA_Channel);
}
}
/* Check the corectness of written data */
TransferStatus1 = Verif_mem(SIZE, PriBuf, DestBuf);
/* TransferStatus1 = PASSED, if the data transmitted and received are correct */
/* TransferStatus1 = FAILED, if the data transmitted and received are different */

/* Set Channel Structure */
// DMA_InitStr.DMA_SelectDataStructure = DMA_CTRL_DATA_ALTERNATE;

/* Init DMA channel */
// DMA_Init(DMA_Channel, &DMA_InitStr);

/* Run channel */
// DMA_Cmd(DMA_Channel, ENABLE);
// DMA_Request(DMA_Channel);

/* Transfer complete */
// while (DMA_GetFlagStatus(DMA_Channel, DMA_FLAG_CHNL_ENA))
// {
// }
/* Check the corectness of written data */
// TransferStatus2 = Verif_mem(SIZE, AltBuf, DestBuf);
/* TransferStatus2 = PASSED, if the data transmitted and received are correct */
/* TransferStatus2 = FAILED, if the data transmitted and received are different */

while (1)
{
//printf("proba\n");
}
}

void port_init(void)
{
PORT_InitTypeDef PORT_InitStructure;

RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB, ENABLE);

PORT_StructInit(&PORT_InitStructure);
PORT_InitStructure.PORT_Pin = (PORT_Pin_All);
PORT_InitStructure.PORT_OE = PORT_OE_OUT;
PORT_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
PORT_Init(MDR_PORTB, &PORT_InitStructure);

RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTE, ENABLE);

PORT_StructInit(&PORT_InitStructure);
PORT_InitStructure.PORT_Pin = PORT_Pin_5 | PORT_Pin_10;
PORT_InitStructure.PORT_OE = PORT_OE_OUT;
PORT_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
PORT_Init(MDR_PORTE, &PORT_InitStructure);

//RST_CLK_PCLK2cmd(RST_CLK_PCLK2_PORTI, ENABLE);

//PORT_StructInit(&PORT_InitStructure);
//PORT_InitStructure.PORT_Pin = PORT_Pin_14 | PORT_Pin_15;
//PORT_InitStructure.PORT_OE = PORT_OE_OUT;
//PORT_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
//PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
//PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
//PORT_Init(MDR_PORTI, &PORT_InitStructure);


//RST_CLK_PCLK2cmd(RST_CLK_PCLK2_PORTG,ENABLE);

//PORT_StructInit(&PORT_InitStructure);
//PORT_InitStructure.PORT_Pin = PORT_Pin_All;
//PORT_InitStructure.PORT_OE = PORT_OE_OUT;
//PORT_InitStructure.PORT_OE = PORT_OE_IN;
//PORT_InitStructure.PORT_PULL_UP = PORT_PULL_UP_OFF;
//PORT_InitStructure.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
//PORT_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
//PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
//PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
//PORT_Init(MDR_PORTG, &PORT_InitStructure);
printf("portinit_proba\n");
}




void clk_init(void)
{
RST_CLK_DeInit();
RST_CLK_PCLKcmd(RST_CLK_PCLK_DMA, ENABLE);
RST_CLK_HSEconfig(RST_CLK_HSE_ON);// Enable HSE (High Speed External) clock
while(RST_CLK_HSEstatus() != SUCCESS);

RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul10);// Configures the CPU_PLL clock source

RST_CLK_CPU_PLLcmd(ENABLE);// Enables the CPU_PLL
while(RST_CLK_CPU_PLLstatus() != SUCCESS);

RST_CLK_PCLKcmd(RST_CLK_PCLK_EEPROM, ENABLE);// Enables the RST_CLK_PCLK_EEPROM
EEPROM_SetLatency(EEPROM_Latency_5);// Sets the code latency value

RST_CLK_CPU_PLLuse(ENABLE);// Select the CPU_PLL output as input for CPU_C3_SEL
RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);// Set CPUClk Prescaler

RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);// Select the CPU clock source
printf("clkinit_proba\n");
}
/**
* @brief Reports the source file ID, the source line number
* and expression text (if USE_ASSERT_INFO == 2) where
* the assert_param error has occurred.
* @param file_id: pointer to the source file name
* @param line: assert_param error line source number
* @param expr:
* @retval None
*/
#if (USE_ASSERT_INFO == 1)
void assert_failed(uint32_t file_id, uint32_t line)
{
/* User can add his own implementation to report the source file ID and line number.
Ex: printf("Wrong parameters value: file Id %d on line %d\r\n", file_id, line) */

/* Infinite loop */
while (1)
{
}
}
#elif (USE_ASSERT_INFO == 2)
void assert_failed(uint32_t file_id, uint32_t line, const uint8_t* expr);
{
/* User can add his own implementation to report the source file ID, line number and
expression text.
Ex: printf("Wrong parameters value (%s): file Id %d on line %d\r\n", expr, file_id, line) */

/* Infinite loop */
while (1)
{
}
}
#endif /* USE_ASSERT_INFO */

/** @} */ /* End of group DMA_Pri_Alt_Channels_3T */

/** @} */ /* End of group __MDR1986VE3 */

/** @} */ /* End of group __MDR32F9Qx_StdPeriph_Examples */


/******************* (C) COPYRIGHT 2013 Milandr *********/

/* END OF FILE main.c */


Последний раз редактировалось cody_rhett 2016-окт-12 14:18, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 13:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1038
Откуда: Тула
Приложения нет.
Как минимум, нужно убедиться, что управляющие структуры ДМА расположены в области доступа AHB 0x20100000+

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 14:23 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
prostoRoman писал(а):
Приложения нет.
Как минимум, нужно убедиться, что управляющие структуры ДМА расположены в области доступа AHB 0x20100000+


Не понял как прикреплять файлы - не прикрепляются почему то. Добавил код в сообщение.
Просто этот пример был взят с диска специально для конктретного контроллера. написаны инструкции по его запуску. там сказано что просто скопировать main.c и подключить необходимые библиотеки. Я предполагал что раз миландр выложил этот пример, то должен быть рабочий. или я ошибаюсь?..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 15:48 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1038
Откуда: Тула
@file MDR32F9Qx_dma.c
Код:
/** @defgroup DMA_Private_Variables DMA Private Variables
  * @{
  */

/**
  * @brief  DMA Channel Control Data Table
  */

/* Select data alignment */
#if (DMA_Channels_Number == 1)
#define DATA_ALIGN 32
#elif (DMA_Channels_Number == 2)
#define DATA_ALIGN 64
#elif ((DMA_Channels_Number >= 3) && (DMA_Channels_Number <= 4))
#define DATA_ALIGN 128
#elif ((DMA_Channels_Number >= 5) && (DMA_Channels_Number <= 8))
#define DATA_ALIGN 256
#elif ((DMA_Channels_Number >= 9) && (DMA_Channels_Number <= 16))
#define DATA_ALIGN 512
#elif ((DMA_Channels_Number >= 17) && (DMA_Channels_Number <= 32))
#define DATA_ALIGN 1024
#endif

#if defined ( __ICCARM__ )
  #pragma data_alignment = DATA_ALIGN
#if defined (  USE_MDR1986VE3 ) || defined (USE_MDR1986VE1T)
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION");
#else
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#endif // #if defined (  USE_MDR1986VE3 )

#elif defined ( __CMCARM__ )
  #pragma locate DMA_ControlTable 0x20000000 noinit
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#elif defined ( __CC_ARM )
   #if defined (USE_MDR1986VE3) || defined (USE_MDR1986VE1T)
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (DATA_ALIGN)));
   #else
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__ ((aligned (DATA_ALIGN)));
   #endif
#endif




/** @} */ /* End of group DMA_Private_Variables */


как видно тут нет варианта для GCC, подразумевалось что этот файл Вы тоже " немного отредактировал под компилятор gcc. "

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 16:59 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
prostoRoman писал(а):
@file MDR32F9Qx_dma.c
Код:
/** @defgroup DMA_Private_Variables DMA Private Variables
  * @{
  */

/**
  * @brief  DMA Channel Control Data Table
  */

/* Select data alignment */
#if (DMA_Channels_Number == 1)
#define DATA_ALIGN 32
#elif (DMA_Channels_Number == 2)
#define DATA_ALIGN 64
#elif ((DMA_Channels_Number >= 3) && (DMA_Channels_Number <= 4))
#define DATA_ALIGN 128
#elif ((DMA_Channels_Number >= 5) && (DMA_Channels_Number <= 8))
#define DATA_ALIGN 256
#elif ((DMA_Channels_Number >= 9) && (DMA_Channels_Number <= 16))
#define DATA_ALIGN 512
#elif ((DMA_Channels_Number >= 17) && (DMA_Channels_Number <= 32))
#define DATA_ALIGN 1024
#endif

#if defined ( __ICCARM__ )
  #pragma data_alignment = DATA_ALIGN
#if defined (  USE_MDR1986VE3 ) || defined (USE_MDR1986VE1T)
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION");
#else
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#endif // #if defined (  USE_MDR1986VE3 )

#elif defined ( __CMCARM__ )
  #pragma locate DMA_ControlTable 0x20000000 noinit
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#elif defined ( __CC_ARM )
   #if defined (USE_MDR1986VE3) || defined (USE_MDR1986VE1T)
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (DATA_ALIGN)));
   #else
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__ ((aligned (DATA_ALIGN)));
   #endif
#endif




/** @} */ /* End of group DMA_Private_Variables */


как видно тут нет варианта для GCC, подразумевалось что этот файл Вы тоже " немного отредактировал под компилятор gcc. "




Вот что в моем библиотечном файле MDR32F9Qx_dma.c написано:

Код:
#if defined ( __ICCARM__ )
  #pragma data_alignment = DATA_ALIGN
#if defined (  USE_MDR1986VE3 ) || defined (USE_MDR1986VE1T)
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION");
#else
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#endif // #if defined (  USE_MDR1986VE3 )

#elif defined ( __CMCARM__ )
  #pragma locate DMA_ControlTable 0x20000000 noinit
   DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)];
#elif defined ( __CC_ARM )
   #if defined (USE_MDR1986VE3) || defined (USE_MDR1986VE1T)
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (DATA_ALIGN)));
   #else
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__ ((aligned (DATA_ALIGN)));
   #endif
#elif defined ( __GNUC__ )
   #if defined (USE_MDR1986VE3) || defined (USE_MDR1986VE1T)
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((section(".ramfunc"), aligned(DATA_ALIGN)));
   #else
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((aligned(DATA_ALIGN)));
   #endif
#endif


В моем случае активна вот эта часть:

Код:
#elif defined ( __GNUC__ )
   #if defined (USE_MDR1986VE3) || defined (USE_MDR1986VE1T)
      DMA_CtrlDataTypeDef DMA_ControlTable[DMA_Channels_Number * (1 + DMA_AlternateData)] __attribute__((section(".ramfunc"), aligned(DATA_ALIGN)));


и как раз секция RAMFUNC у меня размещена по адресу 2010000 (т.е. тот адрес который нужен для структуры DMA). А именно (далее код из файла MDR1986VE3.ld):

MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
RAM (rw) : ORIGIN = 0x20000000, LENGTH = 32K
DMA_RAM (rwx): ORIGIN = 0x200008cc, LENGTH = 1K
IRAM (rwx) : ORIGIN = 0x20100000, LENGTH = 16K
}
......
.......
.....

.ramfunc : AT (__edata)
{
__ramfunc_start__ = .;
*(.ramfunc*)
. = ALIGN(4);
__ramfunc_end__ = .;
} > IRAM

Т.е. по идее структура должна помещаться по необходимому адресу. Или я опять что то не так понимаю?)) :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-12 17:58 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1038
Откуда: Тула
cody_rhett писал(а):
Т.е. по идее структура должна помещаться по необходимому адресу. Или я опять что то не так понимаю?)) :?

По идее - да. Если *.map файл или дизассемблет тоже такого мнения, значит дело не в этом =)
А пробовали с меньшими изменениями (или совсем без них) запускать проект?

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-13 09:33 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
prostoRoman писал(а):
cody_rhett писал(а):
Т.е. по идее структура должна помещаться по необходимому адресу. Или я опять что то не так понимаю?)) :?

По идее - да. Если *.map файл или дизассемблет тоже такого мнения, значит дело не в этом =)
А пробовали с меньшими изменениями (или совсем без них) запускать проект?


На самом деле я изменил только три строки в самом начале, где размещал массивы для передачи по DMA. Разместил их по конкретным адресам:
Код:
uint32_t DestBuf[SIZE] __attribute__((section(".dma_ram.DestBuf")));
uint32_t PriBuf[SIZE] __attribute__((section(".dma_ram.PriBuf")));
uint32_t AltBuf[SIZE] __attribute__((section(".dma_ram.AltBuf")));


Потому что в примере эти переменные были объявлены так:
Код:
uint16_t DestBuf[SIZE] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION") __attribute__((section("EXECUTABLE_MEMORY_SECTION")));
uint16_t PriBuf[SIZE] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION") __attribute__((section("EXECUTABLE_MEMORY_SECTION")));
uint16_t AltBuf[SIZE] IAR_SECTION ("EXECUTABLE_MEMORY_SECTION") __attribute__((section("EXECUTABLE_MEMORY_SECTION")));


Я их просто объявил как надо для моего компилятора


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-13 16:18 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
вроде нашел ошибку. оказывается и данные, которые я передаю, и управляющие структуры должны находится в одной секции памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA пересылка память-память
СообщениеДобавлено: 2016-окт-13 17:29 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1038
Откуда: Тула
Точно, что-то напрягло в строке, но отвлекли цифры
Код:
DMA_RAM (rwx): ORIGIN = 0x200008cc, LENGTH = 1K

Есть у контроллера ДМА такой позорный недуг, что он не работает с EEPROM и DTCM RAM
Вложение:
pic7.png
pic7.png [ 79.16 КБ | Просмотров: 2278 ]

upd: в общем то проблемы есть и у других производителей и они их решают. Можно брать на вооружение.
Изображение

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB