Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 2 сообщения ] 
Автор Сообщение
 Заголовок сообщения: DMA+ADC 1986ве3т
СообщениеДобавлено: 2016-окт-21 15:17 
Не в сети

Зарегистрирован: 2016-окт-12 09:39
Сообщения: 6
Организация: МПЗ
Пытаюсь на отладочной плате на базе 1986ве3т реализовать передачу DMA+ADC. Делаю все в режиме отладки. Данные из ADC_RESULT записываются в массив данных, расположенный в памяти. Все хорошо и данные из АЦП по DMA передаются в память и записываются там в массив. НО! Данные с АЦП в массив записываются только один раз и больше не обновляются. В чем может быть причина?

Вот код с инициализацией DMA
#define ADC_RES ((uint32_t)0x40088000+0x18)
#define SIZE        0x10

RST_CLK_FreqTypeDef CLK_FrequencyStructure;

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

MDR_ADC_TypeDef ADC;

void port_init(void);
void clk_init(void);
void ADC_initialization(void);

void main(void)
{

  DMA_ChannelInitTypeDef DMA_InitStr;
  DMA_CtrlDataInitTypeDef DMA_PriCtrlStr;
  DMA_CtrlDataInitTypeDef DMA_AltCtrlStr;

  uint32_t DMA_Channel = 30;

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


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


  /* Set Primary Control Data */
  DMA_PriCtrlStr.DMA_SourceBaseAddr = ADC_RES;
  DMA_PriCtrlStr.DMA_DestBaseAddr = (uint32_t)DestBuf;
  DMA_PriCtrlStr.DMA_SourceIncSize = DMA_SourceIncNo; 
  DMA_PriCtrlStr.DMA_DestIncSize = DMA_DestIncWord;
  DMA_PriCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_PriCtrlStr.DMA_Mode = DMA_Mode_Basic;
  DMA_PriCtrlStr.DMA_CycleSize = 10;
  DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_1024;
  DMA_PriCtrlStr.DMA_SourceProtCtrl = DMA_SourcePrivileged;
  DMA_PriCtrlStr.DMA_DestProtCtrl = DMA_DestPrivileged;

  /* Set Channel Structure */
  DMA_InitStr.DMA_PriCtrlData = &DMA_PriCtrlStr;
  DMA_InitStr.DMA_Priority = DMA_Priority_High;
  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);
  	      }
  	    }

  while (1)
  {

	  
  }
}


Вернуться к началу
 Заголовок сообщения: Re: DMA+ADC 1986ве3т
СообщениеДобавлено: 2016-окт-21 16:57 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 130
По окончании цикла передачи надо вновь задать параметр DMA_CycleSize, ибо это есть счетчик, считающий вниз до нуля.
  
DMA_PriCtrlStr.DMA_CycleSize = 10;
DMA_Init(DMA_Channel, &DMA_InitStr);
Возможно, вы подумали, что параметр
DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_1024;
позволит вам совершить 1024 цикла передачи. Но этот параметр имеет совершенно иной смысл. Он указывает, через сколько передач данных произойдет арбитраж на шине. Другими словами подсистема DMA даст вашему каналу возможность сделать до 1024 передач по 4 байта (по полному слову) и только тогда сможет переключиться на обслуживание другого канала.
Настройки же, как в STM32x, чтобы безконечно повторять циклы передачи через DMA в этом камне нету.

Кроме того, в вашей проге имеется безконечный цикл, в который прога попадет после первого цикла передачи. Надо бы внутри безконечного цикла повторять анализ флага и перезапуск цикла передачи через DMA.

Еще лучше использовать прерывания по окончании цикла DMA, иначе смысл DMA теряется.


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

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB