Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-14 17:36 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 6
Откуда: г. Орел
После настройки контроллеров DMA, ∑ΔАЦП на соответствующие каналы DMA, NVIC прерывание от DMA, постоянно висит в обработчике прерывания DMA_Handler. DMA передачи от каналов ∑ΔАЦП все завершены. На сайте нет errata. Соответственно посмотреть есть какие либо немаскируемые запросы по DMA возможности нет. Потому как просто без настройки ∑ΔАЦП и DMA, после разрешения прерывания для DMA тут же улетает в обработчик DMA_Handler...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-14 18:15 
Не в сети

Зарегистрирован: 2017-фев-14 11:21
Сообщения: 104
Здравствуйте!

Errata на 1986ВЕ4У https://ic.milandr.ru/upload/iblock/997 ... ee245f.pdf
На вторую страницу добавим.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-14 18:18 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 6
Откуда: г. Орел
В errata для 1986ВЕ4У1 на стр 8 указано что можно обойти баг с помощью записи для соответствующего канала АЦП в регистр CHNL_USEBURST_SET единички. Не помогло. Так же висит в обработчике DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-14 18:46 
Не в сети

Зарегистрирован: 2017-фев-14 11:21
Сообщения: 104
Пришлите, пожалуйста, схему включения, код минимального размера, иллюстрирующий проблему, а также маркировку МК на support@milandr.ru

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-14 19:33 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 6
Откуда: г. Орел
Вложение:
1986BE4.zip [5.28 МБ]
Скачиваний: 5
Схема подключения: это ваш кит 1984ВЕ1У :D
Маркировка: 1986ВЕ1У 1723

Функция main
Код:
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "lib1986BE4/config.h"
#include "lib1986BE4/driverlib/adciu.h"
#include "lib1986BE4/driverlib/dac.h"

static const xPin DAC_OUT = {PORT_DAC_OUT, PORTA_BASE, 0, 0, 0};

unsigned int ADCUI0_DATA[17]; unsigned int ADCUI0_DMA_Cfg;
unsigned int ADCUI1_DATA[17]; unsigned int ADCUI1_DMA_Cfg;
unsigned int ADCUI2_DATA[17]; unsigned int ADCUI2_DMA_Cfg;
unsigned int ADCUI3_DATA[17]; unsigned int ADCUI3_DMA_Cfg;
unsigned int ADCUI4_DATA[17]; unsigned int ADCUI4_DMA_Cfg;
unsigned int ADCUI5_DATA[17]; unsigned int ADCUI5_DMA_Cfg;
unsigned int ADCUI6_DATA[17]; unsigned int ADCUI6_DMA_Cfg;
unsigned int ADCUI7_DATA[17]; unsigned int ADCUI7_DMA_Cfg;

//------------------------------------------------------------------------------
// main
//------------------------------------------------------------------------------
void main (void) {
   //RST_CLK_ADCIU_CFG (RST_CLK_ADC_CLOCK_ADCIU_C1_SEL_CPU_C1 | RST_CLK_ADC_CLOCK_ADCIU_C3_SEL_DIV4 | RST_CLK_ADC_CLOCK_ADCIU_CLK_EN); RST_CLK_BASE -> PER2_CLOCK |= RST_CLK_PER2_CLOCK_PCLK_ADCIU;

   //ADCIU_CLK = 2,048 MHz, SFF = 59, SFC = 3, INT_12V
   //ADCIU_Init (ADCIU_CTRL1_REF_EX_INT_12V, 3, 59);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL0); ADCUI0_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL0, ADCUI0_DATA, DMA_ID_ADCIU0, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU0, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL1); ADCUI1_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL1, ADCUI1_DATA, DMA_ID_ADCIU1, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU1, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL2); ADCUI2_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL2, ADCUI2_DATA, DMA_ID_ADCIU2, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU2, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL3); ADCUI3_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL3, ADCUI3_DATA, DMA_ID_ADCIU3, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU3, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL4); ADCUI4_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL4, ADCUI4_DATA, DMA_ID_ADCIU4, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU4, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL5); ADCUI5_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL5, ADCUI5_DATA, DMA_ID_ADCIU5, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU5, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL6); ADCUI6_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL6, ADCUI6_DATA, DMA_ID_ADCIU6, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU6, 1, 0, 0, 0, 0);
   //ADCIU_ChannelInit (ADCIU_CTRL1_CHP_EN, ADCIU_ANGAIN_PGA_0dB, ADCIU_CHANNEL7); ADCUI7_DMA_Cfg = DMA_CtrlBlockCfg (ADCIU_BASE -> F_DAT + ADCIU_CHANNEL7, ADCUI7_DATA, DMA_ID_ADCIU7, DMA_Mode_Basic, DMA_Transfers_1, 17, DMA_Bit_Depth_32, DMA_Inc_No, DMA_Inc_Word, 0x0, 0x0); //DMA_ChCfg (DMA_ID_ADCIU7, 1, 0, 0, 0, 0);

   //PORT_Init ((xPin *) &DAC_OUT); RST_CLK_BASE -> PER2_CLOCK |= RST_CLK_PER2_CLOCK_PCLK_DAC; DAC_Init (DAC_CFG_ON_DAC0); DAC_BASE -> DAC0_DATA = 0x800; // DAC_OUT = 1,65 V

   //ADCIU_ChannelDMAEn (ADCIU_CTRL1_ADC0EN | ADCIU_CTRL1_ADC1EN | ADCIU_CTRL1_ADC2EN | ADCIU_CTRL1_ADC3EN | ADCIU_CTRL1_ADC4EN | ADCIU_CTRL1_ADC5EN | ADCIU_CTRL1_ADC6EN | ADCIU_CTRL1_ADC7EN);
   //ADCIU_ChannelEn (ADCIU_CTRL1_ADC0EN | ADCIU_CTRL1_ADC1EN | ADCIU_CTRL1_ADC2EN | ADCIU_CTRL1_ADC3EN | ADCIU_CTRL1_ADC4EN | ADCIU_CTRL1_ADC5EN | ADCIU_CTRL1_ADC6EN | ADCIU_CTRL1_ADC7EN);

   NVIC_EnableIRQ (DMA_IRQn);

   while (TRUE)
      {
      unsigned int temp = 100000;
      while (temp--);
      temp = 300000;
      while (temp--);
      }
   }

void DMA_Handler (void) {
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU0].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU0].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU1].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU1].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU2].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU2].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU3].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU3].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU4].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU4].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU5].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU5].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU6].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU6].Cfg = ADCUI0_DMA_Cfg;
   //if (DMAPriCtrlBlock[DMA_ID_ADCIU7].cycle_ctrl == DMA_Mode_Stop) DMAPriCtrlBlock[DMA_ID_ADCIU7].Cfg = ADCUI0_DMA_Cfg;
}


Собственно только включение прерывания DMA

Весь проект в архиве среда Eclipse C/C++ IDE, отладка через JTAG/SWD отладчик SEGGER j-link base

Инициализация DMA
Код:
//------------------------------------------------------------------------------
// DMA API functions
//------------------------------------------------------------------------------
void DMA_Init (void) {
   unsigned int temp = DMA_MAX_NUM_CHANNELS; while (temp--) DMAPriCtrlBlock[temp] = (xDMACtrlBlock) {0x0, 0x0, 0x0, 0x0};

   DMA_BASE -> CFG = 0x0; //DMA_CFG_MASTER_ENABLE;
   DMA_BASE -> CTRL_BASE_PTR = (unsigned int) DMAPriCtrlBlock;
   DMA_BASE -> CHNL_SW_REQUEST = 0;
   DMA_BASE -> CHNL_USEBURST_CLR = 0xFFFFFFFF;
   DMA_BASE -> CHNL_USEBURST_SET = 1 << DMA_ID_ADC;
   DMA_BASE -> CHNL_REQ_MASK_CLR = 0xFFFFFFFF;
   DMA_BASE -> CHNL_ENABLE_CLR = 0xFFFFFFFF;
   DMA_BASE -> CHNL_PRI_ALT_CLR = 0xFFFFFFFF;
   DMA_BASE -> CHNL_PRIORITY_CLR = 0xFFFFFFFF;
   DMA_BASE -> ERR_CLR = 0x1;
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-15 08:53 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 285
Откуда: ПКК "Миландр"
Ветка здесь - viewtopic.php?f=35&t=3919

Попробуйте вариант отсюда - viewtopic.php?p=22636#p22636

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-15 11:44 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 6
Откуда: г. Орел
Сработал вариант:

Код:
DMA_BASE -> CHNL_REQ_MASK_SET = 0xFFFFFFFF;
DMA_BASE -> CHNL_ENABLE_SET = 0xFFFFFFFF;


Прерывание вызывается только один раз. Скорее всего имеет смысл после инициализации контроллера DMA сбрасывать прерывания в NVIC.

Вариант:
Код:
DMA_BASE -> CHNL_REQ_MASK_SET = 0xFFFFFFFF;
DMA_BASE -> CHNL_ENABLE_CLR = 0xFFFFFFFF;
нерабочий.

Так же вариант из errata для 1986ВЕ4У нерабочий:
Код:
DMA_BASE -> CHNL_USEBURST_SET = 1 << 30;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+DMA+∑ΔАЦП+NVIC
СообщениеДобавлено: 2019-мар-15 12:40 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 6
Откуда: г. Орел
Дополнение:
После отработки всех передач по каналу DMA соответствующие биты регистра CHNL_ENABLE_SET сбрасываются. И чтобы не висело постоянно в прерывании от DMA контроллера приходится устанавливать биты CHNL_REQ_MASK_SET (если канал в дальнейшем не нужен) и CHNL_ENABLE_SET, что однако не есть удобно и каждый раз этот нюанс приходится учитывать...


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

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


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

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


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

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