Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 98 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7  След.
Автор Сообщение
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-дек-15 15:57 
Не в сети

Зарегистрирован: 2016-янв-22 15:45
Сообщения: 21
Возможно. Рекомендации как обойти эту проблему с использованием регистров MDR_DMA->CHNL_REQ_MASK_SET, MDR_DMA->CHNL_REQ_MASK_CLR, MDR_DMA->CHNL_ENABLE_SET не помогли(


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

Зарегистрирован: 2016-янв-22 15:45
Сообщения: 21
Что делать в такой ситуации?


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

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 391
Отказаться от прерываний ДМА, менять структуры опрашивая флаги.
Если не вариант - запросить разработчиков МК корректный код заглушки.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


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

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 68
Попробуйте сделать так:

Код:
int main (void)
{
  // Инициализация системы тактирования микроконтроллера
  ...

  // Начало инициализации DMA
  U_DMA_Init_Begin ();

  // Инициализация различных устройств, в том числе SPI
  ...
   
  // Конец инициализации DMA
  U_DMA_Init_End ();
   
  ...
}

// Начало инициализации DMA
void U_DMA_Init_Begin (void)
{
  // Разрешить тактирование DMA
  // Для корректной работы DMA необходимо разрешить тактирование SSP1 и SSP2
  // Если этого не сделать, то всё время будет возникать прерывание от DMA.   
  RST_CLK_PCLKcmd (RST_CLK_PCLK_DMA | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_SSP2, ENABLE); 
   
  // Запретить все прерывания, в том числе от SSP1 и SSP2.
  NVIC->ICPR[0] = 0xFFFFFFFF;
  NVIC->ICER[0] = 0xFFFFFFFF;   
   
  // Сбросить все настройки DMA
  DMA_DeInit();
}

// Конец инициализации DMA
void U_DMA_Init_End (void)
{
  // Задать приоритет аппаратного прерывания от DMA
  NVIC_SetPriority (DMA_IRQn, 3);     

  // Разрешить прерывания от DMA
  NVIC_EnableIRQ (DMA_IRQn);      

}


Ключевой момент состоит в том, что при использовании DMA надо обязательно разрешить тактирование SSP1 и SSP2, даже если их не используете.


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

Зарегистрирован: 2017-мар-02 08:48
Сообщения: 18
Здравствуйте. Вопрос по DMA + DAC. Отладочная плата 1986VE91T Rev 4.

Передаю массив 8-БИТНЫХ ЗНАЧЕНИЙ (от 0х00 до 0хFF) из памяти в ЦАП через ДМА пинг-понг.
Получаю следующую картинку (рисовал в ворде):
Вложение:
not_switch3.jpg
not_switch3.jpg [ 15.92 КБ | Просмотров: 1999 ]

Меняю местами старшие 4 бита с младшими у каждого байта массива. Получается вроде как должно быть:
Вложение:
switch2.jpg
switch2.jpg [ 6.82 КБ | Просмотров: 1999 ]

В чем ошибка?
Код и проект прилагаю.
Открыть
Код:
   
#include "common.h"


#define SWITCH 0  //Поставить 1, чтобы поменять половины байта местами

#define DMA_SELECT(CHANNEL)   (0x00000001<<(CHANNEL))

#define DATA_SIZE 256

uint8_t test_data_sw[DATA_SIZE];

uint8_t test_data[DATA_SIZE] =
{
   0x00, 0x01, 0x02, 0x03, 0x04 ,0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,   
   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
   0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,   
   0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
   0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,   
   0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
   0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,   
   0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
   0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,   
   0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
   0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
   0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
   0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
   0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
   0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
   0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
};


void CPU_init(void);   
void LedsPinGfg(void);
void DMA_Config(void);
void DAC_Config(void);
void TIM_Config(void);

void data_sw(void); // Меняет местами половины байта


int main (void)
{   
#if SWITCH
   data_sw();
#endif
   
   CPU_init();   
   LedsPinGfg();
   DMA_Config();
  DAC_Config();
  TIM_Config();

   while(1)
   {
   }
}


void CPU_init ( void )
{
   //Необходимая пауза для работы Flash-памяти программ
  MDR_EEPROM->CMD |= (3 << 3);

  MDR_RST_CLK->HS_CONTROL = 0x01;// вкл. HSE осцилятора (частота кварца 8 МГц)
  while ((MDR_RST_CLK->CLOCK_STATUS & (1 << 2)) == 0x00);// ждем пока HSE выйдет в рабочий режим

  MDR_RST_CLK->CPU_CLOCK = ((2 << 0));//подача частоты на блок PLL
  MDR_RST_CLK->PLL_CONTROL = ((1 << 2) | (9 << 8));//вкл. PLL  | коэф. умножения = 10
  while ((MDR_RST_CLK->CLOCK_STATUS & 0x02) != 0x02);// ждем когда PLL выйдет в раб. режим

  MDR_RST_CLK->CPU_CLOCK = ((2 << 0)//источник для CPU_C1
                          | (1 << 2)//источник для CPU_C2
                          | (0 << 4)//предделитель для CPU_C3
                          | (1 << 8));//источник для HCLK

  MDR_BKP->REG_0E |= (7 << 0); //режим встроенного регулятора напряжения DUcc
  MDR_BKP->REG_0E |= (7 << 3); //выбор доп.стабилизирующей нагрузки
}


void LedsPinGfg(void)
{
   PORT_InitTypeDef PortInit;

   RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);
   PortInit.PORT_Pin   = (PORT_Pin_10 | PORT_Pin_11 | PORT_Pin_12 | PORT_Pin_13 | PORT_Pin_14);
   PortInit.PORT_OE    = PORT_OE_OUT;
   PortInit.PORT_FUNC  = PORT_FUNC_PORT;
   PortInit.PORT_MODE  = PORT_MODE_DIGITAL;
   PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
   PORT_Init(MDR_PORTD, &PortInit);
}


void TIM_Config(void)
{
  MDR_RST_CLK->PER_CLOCK |= 1 << 14;//разрешение тактирования Таймера 1
  MDR_RST_CLK->TIM_CLOCK = (0 // делитель тактовой частоты Таймера 1
                            |(1 << 24));  // разешение тактирования Таймера 1

  MDR_TIMER1->PSG = 0x0;
  MDR_TIMER1->ARR = 0x715;
  MDR_TIMER1->IE = (1 << 1);//разрешение прерывания по совпадению
 
   // Разрешить работу DMA совместно с таймером TIMER1
  TIMER_DMACmd (MDR_TIMER1, TIMER_STATUS_CNT_ARR, ENABLE);

  // Разрешить работу таймера TIMER1
  TIMER_Cmd (MDR_TIMER1, ENABLE);   

  // Разрешить прерывания от DMA
  NVIC_EnableIRQ(DMA_IRQn);
}



DMA_ChannelInitTypeDef DMA_InitStr;
DMA_CtrlDataInitTypeDef DMA_PriCtrlStr;
DMA_CtrlDataInitTypeDef DMA_AltCtrlStr;

void DMA_Config(void)
{
   // Разрешить тактирование DMA
   // Для корректной работы DMA необходимо разрешить тактирование SSP1 и SSP2
  // Если этого не сделать, то всё время будет возникать прерывание от DMA.   
  RST_CLK_PCLKcmd (RST_CLK_PCLK_DMA | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_SSP2, ENABLE); 
   
  // Запретить все прерывания, в том числе от SSP1 и SSP2.
  NVIC->ICPR[0] = 0xFFFFFFFF;
  NVIC->ICER[0] = 0xFFFFFFFF;   
   
  // Сбросить все настройки DMA
  DMA_DeInit();
   
/* Set Primary Control Data */
#if SWITCH
   DMA_PriCtrlStr.DMA_SourceBaseAddr = (uint32_t)test_data_sw;
#else
   DMA_PriCtrlStr.DMA_SourceBaseAddr = (uint32_t)test_data;
#endif   
  DMA_PriCtrlStr.DMA_DestBaseAddr = (uint32_t)(&(MDR_DAC->DAC1_DATA));
  DMA_PriCtrlStr.DMA_SourceIncSize = DMA_SourceIncByte;
  DMA_PriCtrlStr.DMA_DestIncSize = DMA_DestIncNo;
  DMA_PriCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_PriCtrlStr.DMA_Mode = DMA_Mode_PingPong;
  DMA_PriCtrlStr.DMA_CycleSize = DATA_SIZE;
  DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_1;
  DMA_PriCtrlStr.DMA_SourceProtCtrl = DMA_SourceBufferable;
  DMA_PriCtrlStr.DMA_DestProtCtrl = DMA_DestBufferable;
 
   /* Set Alternate Control Data */
#if SWITCH
   DMA_AltCtrlStr.DMA_SourceBaseAddr = (uint32_t)test_data_sw;
#else
   DMA_AltCtrlStr.DMA_SourceBaseAddr = (uint32_t)test_data;
#endif   
  DMA_AltCtrlStr.DMA_DestBaseAddr   = (uint32_t)(&(MDR_DAC->DAC1_DATA));
  DMA_AltCtrlStr.DMA_SourceIncSize = DMA_SourceIncByte;
  DMA_AltCtrlStr.DMA_DestIncSize = DMA_DestIncNo;
  DMA_AltCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_AltCtrlStr.DMA_Mode = DMA_Mode_PingPong;
  DMA_AltCtrlStr.DMA_CycleSize = DATA_SIZE;
  DMA_AltCtrlStr.DMA_NumContinuous = DMA_Transfers_1;
  DMA_AltCtrlStr.DMA_SourceProtCtrl = DMA_SourceBufferable;
  DMA_AltCtrlStr.DMA_DestProtCtrl = DMA_DestBufferable;
  /* 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 TIM1*/
  DMA_Init(DMA_Channel_TIM1, &DMA_InitStr);

  /* Enable dma_req or dma_sreq to generate DMA request */
  MDR_DMA->CHNL_REQ_MASK_CLR = DMA_SELECT(DMA_Channel_TIM1);
  MDR_DMA->CHNL_USEBURST_CLR = DMA_SELECT(DMA_Channel_TIM1);

  /* Enable DMA_Channel_TIM1 */
  DMA_Cmd(DMA_Channel_TIM1, ENABLE);
}


void DAC_Config(void)
{
   PORT_InitTypeDef PortInitStructure;   
   
  RST_CLK_PCLKcmd (RST_CLK_PCLK_DAC | RST_CLK_PCLK_PORTE, ENABLE); 

  PORT_StructInit (&PortInitStructure);   
  PortInitStructure.PORT_Pin   = PORT_Pin_9;
  PortInitStructure.PORT_OE    = PORT_OE_OUT;
  PortInitStructure.PORT_MODE =  PORT_MODE_ANALOG;
  PORT_Init (MDR_PORTE, &PortInitStructure);      

  DAC_DeInit();
  DAC1_Init(DAC1_AVCC);
  DAC1_Cmd (ENABLE);
}


int k=0;

void DMA_IRQHandler (void)
{
   if(k){
      k=0;
      PORT_SetBits(MDR_PORTD, PORT_Pin_10);
   }else{
      k=1;
      PORT_ResetBits(MDR_PORTD, PORT_Pin_10);
   }
      
      
  if((MDR_DMA->CHNL_PRI_ALT_SET & (1<<DMA_Channel_TIM1)) == (0<<DMA_Channel_TIM1))
  {
    DMA_AltCtrlStr.DMA_CycleSize = DATA_SIZE;
    DMA_Init(DMA_Channel_TIM1, &DMA_InitStr);
  }
  else if((MDR_DMA->CHNL_PRI_ALT_SET & (1<<DMA_Channel_TIM1)) == (1<<DMA_Channel_TIM1))
  {
    DMA_PriCtrlStr.DMA_CycleSize = DATA_SIZE;
    DMA_Init(DMA_Channel_TIM1, &DMA_InitStr);
  }
}   


void data_sw(void)
{
   int i;
   uint8_t b,c;
   
   for(i=0;i<DATA_SIZE;i++)
   {
      b=test_data[i]<<4;
      c=test_data[i]>>4;
      test_data_sw[i]=(b+c);
   }
}
Закрыть
Вложение:
DMA_8bit.zip [894.11 КБ]
Скачиваний: 60


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

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
Похоже на то, что при попытке записи в регистр младшего бита (например 0x01) через ПДП, значения младшего бита копируется в остальные биты регистра, то есть записывается 0x01010101, вот и получаются у вас переполнения.
Наблюдал подобное, когда пытался записать через ПДП в регистр MDR_ADC->ADC1_CFG младшие 8 бит (предполагалось что остальные биты должны быть заполнены при инициализации).
Попробуйте тип переменных массива, разрядность данных ПДП указать 32 разряда.


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

Зарегистрирован: 2017-мар-02 08:48
Сообщения: 18
Dmitriy0783 писал(а):
то есть записывается 0x01010101
Да, похоже... Так задумано? Или это недочет микроконтроллера? Или мой (может, что-то не так настроил) ?
Dmitriy0783 писал(а):
Попробуйте тип переменных массива, разрядность данных ПДП указать 32 разряда.
При 32-х разрядах вроде работает нормально. Просто возникла необходимость передавать именно массив типа uint8_t.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-апр-28 06:54 
Не в сети

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
Lin писал(а):
Dmitriy0783 писал(а):
то есть записывается 0x01010101
Да, похоже... Так задумано? Или это недочет микроконтроллера? Или мой (может, что-то не так настроил) ?
Dmitriy0783 писал(а):
Попробуйте тип переменных массива, разрядность данных ПДП указать 32 разряда.
При 32-х разрядах вроде работает нормально. Просто возникла необходимость передавать именно массив типа uint8_t.

Здесь, наверное, нужно дождаться комментарии разработчиков контроллера. Данная особенность, выход из ситуации были определены опытным путем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-03 09:53 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 121
Откуда: ПКК "Миландр"
Необходимо устанавливать разрядность данных источника, соответствующую разрядности данных приемника. Запись в MDR_DAC->DAC1_DATA восьмибитных значений через DMA не является штатным режимом. Для записи в DAC допустимо использовать 16-битные значения или 32-битные.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-03 16:04 
Не в сети

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
В случае с регистром MDR_ADC->ADC1_CFG переход на 16 разрядов не помог, при попытки записи допустим 0x0123 в младшие 2 байта в регистр записывается 0x01230123. Разрядность данных источника совпадает с разрядностью данных приемника.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-03 18:03 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 121
Откуда: ПКК "Миландр"
Dmitriy0783:
Регистр MDR_ADC->ADC1_CFG следуя описанию 32-х битный. А есть ли практический смысл писать в этот регистр значения через DMA?

Я сейчас проверяю работоспособность DMA по пересылке данных различных форматов. Позднее выложу результаты.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-04 06:58 
Не в сети

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
Есть необходимость используя контроллер DMA синхронизировать работу внешнего АЦП, работу встроенного АЦП МК и управление аналоговыми коммутаторами. Прием данных от внешнего АЦП через SSP в режиме SSI в качестве ведомого. По событию приема данных от внешнего АЦП запускаем встроенный АЦП МК, управляем коммутаторами (здесь может не хватает возможности отключения импульсного запроса на обработку DMA, о проблеме и о способе решения говорил на 5 странице).
Цикл DMA состоит из 640 запусков встроенного АЦП (каналы разные). Для массива, содержащего 32-х разрядные слова управления, требуется 2560 байт ОЗУ. Бит Сfg REG GO и необходимые биты Cfg REG CHS располагаются в младшем байте регистра MDR_ADC->ADC1_CFG. В случае корректной записи младшего байта MDR_ADC->ADC1_CFG можно было бы сэкономить 1920 байт ОЗУ.
Дополнительно, для других целей, не хватает циклического режима работы DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-10 14:02 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 121
Откуда: ПКК "Миландр"
По поводу проверки DMA:

1 - При работе с памятью ОЗУ работают пересылки данных любых типов. Байт в байт, в полуслово, в слово. Полуслово в полуслово, слово. Разрядность приемника не обязана совпадать с разрядностью источника.

2 - При работе с регистрами периферийных устройств, есть некоторые нюансы реализации. Все-таки это не ячейки памяти, а устройства в адресном пространстве. Пересылка байта в регистр ЦАП происходит некорректно, поскольку разработчики не закладывались на такой вариант. Вот если взять отдельный 12-битный ЦАП возникнет ли идея писать туда байтами, старшими, младшими? Поэтому рекомендация - при работе с регистрами периферийных устройств обращаться к ним с соразмерной разрядностью.

В случае с ЦАП посредством DMA работают 16-битные и 32-битные пересылки.

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

Lin:
Вот пример записи в ЦАП 8-битных значений:
DMA пишет значение 0xF7, значение в ЦАП оказывается = 0x7F7
DMA: 0x3C -> ЦАП = 0xC3C
DMA: 0xC3 -> ЦАП = 0x3C3

Функция "переворота" не решает проблему, потому что амплитуда пилы все-равно получается неверной.

Dmitriy0783:
На мой взгляд для запуска АЦП по таблице лучше использовать таймер. Там и кольцевую индексацию можно обработать в отличие от DMA. Но я не знаком с Вашей задачей, поэтому не возьмусь судить.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-10 16:20 
Не в сети

Зарегистрирован: 2017-мар-02 08:48
Сообщения: 18
Vasiliy писал(а):
Функция "переворота" не решает проблему, потому что амплитуда пилы все-равно получается неверной.
Получается 8-битный режим ЦАП-а с небольшой погрешностью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2017-май-11 07:17 
Не в сети

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
Vasiliy писал(а):
Dmitriy0783:
На мой взгляд для запуска АЦП по таблице лучше использовать таймер. Там и кольцевую индексацию можно обработать в отличие от DMA. Но я не знаком с Вашей задачей, поэтому не возьмусь судить.

Можно подробнее? Речь идет о запуске АЦП (записи управляющего слова в регистр MDR_ADC->ADC1_CFG) по прерыванию таймера, или можно обойтись без прерывания?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 98 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7  След.

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


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

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


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

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