Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Tim19 -> DMA -> значение ADC в memory

Непрочитано 03.06.2014, 12:41  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Tim19 -> DMA -> значение ADC в memory

План такой. ADC работает в непрерывном режиме тоесть в регистре данных ADC постоянно обновляется значение. Таймер (tim19 compare1) пинает DMA (dma1 канал1) а DMA перекладывает значение ADC в массив.

Код:
void TIM19_init(void) {
  TIM_OCInitTypeDef TIM_OCInitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  /* Enable TIM19 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);

  /* TIM19 Configuration */
  TIM_DeInit(TIM19);

  /* Fills each TIM_TimeBaseInitStruct member with its default value */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  /* Time base configuration*/
  TIM_TimeBaseStructure.TIM_Period = 50-1;
  TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 (OC1) */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 1;                        // !!               // в примере из интернета здесь "1"
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //!!                // в примере из интернета этой стоки вообще нет
  TIM_OC1Init(TIM19, &TIM_OCInitStructure);
  
  /* TIM1 Update DMA Request enable */
  TIM_DMACmd(TIM19, TIM_DMA_CC1, ENABLE);
  
  /* Enable TIM19 counter */
  TIM_Cmd(TIM19, ENABLE);   
}
Код:
void    DMA_init(void) {
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  DMA_InitTypeDef DMA_InitStructure;
  
// DMA1 канал 1 - сигма-дельта АЦП
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDADC1-›JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ex[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                              // направление от периферии к памяти
DMA_InitStructure.DMA_BufferSize = 100;                                         // длинна буфера = ARRAY_LENGHT(mas1)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                // инкримент периферии отключен
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                         // инкремент в памяти - включен
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;         // размер данных в периферии 32 бита
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                 // размер данных в памяти 32 бита
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                   // режим DMA - обычный, не круговой
DMA_InitStructure.DMA_Priority = DMA_Priority_High;                             // поскольку DMA задействовано одно - его приоритет не имеет смысла
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                    // Memory-to-memory Disable
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
DMA_Cmd(DMA1_Channel1, ENABLE);
}
инициализацию АЦП не привожу, оно точно работает, в регистре SDADC1-›JDATAR правильные данные. DMA массив не заполняет. предполанаю что я неправильно запускаю DMA таймером. связка ADC -› DMA - работает (стартовать ADC каждый раз не надо, оно запускается один раз, при инициализации и непрерывно измеряет), массив заполняется.
Реклама:
__________________
Kvsrk85(Андрей)

Последний раз редактировалось kvark85; 03.06.2014 в 13:38.
kvark85 вне форума  
Непрочитано 03.06.2014, 12:47  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

АЦП не правильно настроен. Процессор какой?
Impartial вне форума  
Непрочитано 03.06.2014, 13:09  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Сообщение от Impartial Посмотреть сообщение
АЦП не правильно настроен. Процессор какой?
с чего это? я же говорю, оно работает, я могу свободно в любой момент считывать с него значения и эти значения правильные. процессор
STM32F373. а в той связке что я хочу реализовать АЦП с DMA никак не связано
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 03.06.2014, 13:25  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Цитата:
в регистре SDADC1-›JDATAR правильные данные.
Судя по этой фразе АЦП использует инжекторный режим. Он работает по другому.
Impartial вне форума  
Непрочитано 03.06.2014, 13:39  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

поясните. то есть результаты инжекторной группы нельзя передавать с помощью DMA при условии что DMA запускается таймером? Потому что как я уже писал у меня получается эти же данные передавать с помощью DMA если DMA настроено брать данные по завершению преобразования SDADC.
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
Непрочитано 03.06.2014, 13:55  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

В инжекторной группе 4 регистра. Какой из них указан в CPAR?
Impartial вне форума  
Непрочитано 03.06.2014, 15:00  
kvark85
Прописка
 
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
kvark85 на пути к лучшему
По умолчанию Re: Tim19 -> DMA -> значение ADC в memory

Разобрался и заработало. Ошибка в даташите. На странице 172 на картинке показано что DMA1 канал1 может запускаться tim19_ch1, а на странице ниже (173-й) в таблице указано что DMA1 канал1 может запускаться tim19_ch3, tim19_ch4. Поменял настройку таймера на 3-й канал и заработало как и ожидалось.
Миниатюры:
Нажмите на изображение для увеличения
Название: 33333.png
Просмотров: 64
Размер:	108.1 Кб
ID:	65165  
__________________
Kvsrk85(Андрей)
kvark85 вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 28 14.10.2024 06:42
STM32 ADC + DMA в циклическом режиме Nik_UFO Микроконтроллеры, АЦП, память и т.д 4 24.02.2012 18:49


Часовой пояс GMT +4, время: 13:41.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.