×

Внимание

Форум находится в режиме только для чтения.

Конфиг схемы TIM8(EXTTRIG)->(ADC1+ADC2)->DMA2 при переходе с 103 на 407 серию.

12 года 3 мес. назад #3195 от desant-88
Здравствуйте уважаемые инженеры-разработчики!

Интересует следующее:

1. Проблема : Конфиг схемы TIM8(EXTTRIG)->(ADC1+ADC2)->DMA2 при переходе с 103  на 407 серию.
2. Цель: Цифра из 14-ти аналоговых сигналов.
3. Мой конфиг на 407 :
                * TIM8, сконфигурирован как экстернал триггер и является событием для запуска преобразования АЦП1и АЦП2.
TIM_Cmd(TIM8, DISABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = (168000000 / (125*300));
  TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  TIM_SetCounter(TIM8, 0);
  TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);
  TIM_Cmd(TIM8, ENABLE);
                * ADC1 и ADC2 сконфигурированы в сдвоенном синхронном режиме с сканированием аналоговых каналов и 12 битным разрешением, таким образом на каждый АЦП приходится по 7 каналов, к тому же один из каналов АЦП1 - температурный датчик. Сконфигурированы на передачу данных по DMA2 в режиме №2(передача по 32 бита в один запрос DMA).
RCC_APB2PeriphClockCmd(
			 RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , ENABLE);
          ADC_DeInit();

          ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                               
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                         ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;                                                                                  
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_TRGO;                
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
  ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;                                 
  ADC_InitStructure. ADC_NbrOfConversion = 7;                                           
  
  ADC_CommonInitTypeDef ADC_CommonInitStructure ={
      
      .ADC_Mode =ADC_DualMode_RegSimult  ,                                              
      .ADC_Prescaler = ADC_Prescaler_Div4,
      .ADC_DMAAccessMode = ADC_DMAAccessMode_2,                                         
      .ADC_TwoSamplingDelay = 0 // это ноль                                             
      
    };
  
  ADC_CommonInit(&ADC_CommonInitStructure);
 
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                            ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;             
  ADC_InitStructure.ADC_ExternalTrigConvEdge =  ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;                                 
  ADC_InitStructure. ADC_NbrOfConversion = 7; 
  
  ADC_Init(ADC2, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, output_pin_F1_adc_ch, 1, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_F2_adc_ch, 1, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, output_pin_F3_adc_ch, 2, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_F4_adc_ch, 2, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, output_pin_TA_adc_ch, 3, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_FB_adc_ch, 3, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, output_pin_FV_adc_ch, 4, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_FG_adc_ch, 4, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, output_pin_REV_adc_ch, 5, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_PARK_adc_ch, 5, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, output_pin_BRK_adc_ch, 6, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_PTO_adc_ch, 6, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 7, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 7, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, output_pin_DPM_adc_ch, 7, ADC_SampleTime_15Cycles);

  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);

  ADC_TempSensorVrefintCmd(ENABLE);

  ADC_Cmd(ADC1, ENABLE);

  ADC_Cmd(ADC2, ENABLE);
                * DMA2 сконфигурирован на передачу по 32 бита в DMA_Mode_Circular, без использования очереди.
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
          DMA_DeInit(DMA2_Stream4);

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC->CDR);               
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADCConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 7;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                                       
  DMA_InitStructure.DMA_FIFOMode =DMA_FIFOMode_Disable;                                          
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  
  DMA_Init(DMA2_Stream4, &DMA_InitStructure);

  DMA_ITConfig(DMA2_Stream4,DMA_IT_TC, ENABLE);

  DMA_Cmd(DMA2_Stream4, ENABLE);

  NVIC_InitTypeDef  NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel =DMA2_Stream4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

4. В 103 подобная схема конфигурации функционировала на отлично - на 407 видимо какие-то параметры я неверно устанавливаю или не устанавливаю, все остальное перевел на 407-ой кроме этой схемы, к тому же в референсе написана какая-то фигня с размещением преобразованных данных АЦП1 в сдвоенном режиме, там написано , что они хранятся в регистре ADC_CCR - как так ? Если это регистр настроек ?
5. Если Вас не затруднит могли бы Вы ответить мне именно рабочим примером такой конфигурации потому как переход с 103 на 407 срочный , это конечно в идеале, ну а вообще помогут любые дельные советы.

              Всем заранее огромное спасибо. С уважением, Desant-88.
12 года 3 мес. назад #3197 от Денис Ягов


4. В 103 подобная схема конфигурации функционировала на отлично - на 407 видимо какие-то параметры я неверно устанавливаю или не устанавливаю, все остальное перевел на 407-ой кроме этой схемы, к тому же в референсе написана какая-то фигня с размещением преобразованных данных АЦП1 в сдвоенном режиме, там написано , что они хранятся в регистре ADC_CCR - как так ? Если это регистр настроек ?


Тут ошибка в описании. ST уже её признали. В следующей ревизии документа исправят. По остальному - чуть позже.
12 года 3 мес. назад #3198 от desant-88
Понял! Буду ждать, кстати на счет примера ST-ого для данной ситуации, смотрел его, но к сожалению он не то, что нужно. Вообще хотелось бы именно по своей конфигурации понять ошибки и впредь больше не доставать никого с этим. :-[
12 года 3 мес. назад #3200 от Денис Ягов
Ошибка могла бы быть тут:

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                               
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;           
  ADC_InitStructure.ADC_ExternalTrigConvEdge =  ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;                               
  ADC_InitStructure. ADC_NbrOfConversion = 7;
 
  ADC_Init(ADC2, &ADC_InitStructure);


Насколько я понимаю, должно быть вот так:
ADC_InitStructure.ADC_ExternalTrigConvEdge =  ADC_ExternalTrigConv_T8_TRGO

Поэтому АЦП2 при переполнении Таймера 8 - не запускается. (Я не проверял на плате, это "быстрый поиск вероятной ошибки" ... вам стоит перепроверить)

В любом случае до конца дня постораюсь выложить нечто рабочее сюда.  :P
12 года 3 мес. назад #3201 от desant-88
Если бы было все так радужно, я бы был счастлив :) но к сожалению такие точечные настройки я уже проверял и сейчас еще раз проверил ваше предположение  - не работает.  :-\

Да и в референсе написано, что для синхронного запуска этих двух АЦПэшников требуется сконфигурировать ведущий, тоесть АЦП1, а ведомым запуск обеспечен после этого, хотя незнаю на сколько референсу можно верить.

И к тому же , АЦП2 на сколько я понял запускается - устонавливается бит STRT в его статусе, только почему-то данные в регистре данных АЦП2 и соответственно в общем регистре данных ADC_CDR в верхнем слове - отсутствуют, идет преобразование только с АЦП1, тоесть визуально в дебагере я именно это вижу.

Для уточнения картины: после конфига такого сдвоенного режима идет конфиг АЦП3 в независимом режиме, возможно это как-то повлияет на суть процесса, хотя в 103 все работало ))

Лично мои предположения по возможным ошибкам, которые сейчас пытаюсь раскрутить:
              - конфиг таймера 8 именно как тригера, фронт таймера на выходе.
              - "протокол" передачи данных по ДМА2 для сдвоенного режима АЦП, чтение какого именно регистра данных здесь тдолжно быть.
              - настройки АЦП1 и АЦП2 соответственно с настройками таймера 8 и ДМА2.

Как видите моя проблема именно целиком в конфигурации всей данной схемы.
12 года 3 мес. назад #3204 от Денис Ягов
полностью рабочий проект приложил.

Суть проекта:
по переполнению TIM8 запускается параллельная оцифровка АЦП1 по каналу датчика температуры и АЦП2 - по каналу 12 (порт C2). После преобразования делается запрос в DMA2 на копирование результата в переменную ADCDualConvertedValue (верхняя часть которой - один результат работы АЦП, нижняя - другой).

Скриншот и код проекта - приложил (рядом с папкой проекта должна лежать папка "Libraries" взятой из стандартной библиотеки периферии для STM32F4).

8)
Время создания страницы: 0.044 секунд
Работает на Kunena форум