Перейти к содержанию
    

ADC в STM32F100. Нет сканирования каналов.

Здравствуйте все.

Пробую АЦП данного устройства с помощью куба. АЦП в связке с ДМА. Почему то сканирует постоянно один канал. ДМА пишет в массив из 4 элементов значение 1 канала и все. Т.е. допустим ADCbuff[0] = 100, ADCbuff[1] = 100,  ADCbuff[2] = 100,  ADCbuff[3] = 100. АЦП в режиме регуляр. 4 канала, Rank установлены каждый на свой канал. Режим скан включен. Что еще надо сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 minutes ago, khlenar said:

Что еще надо сделать?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего сложного. В LL.. библиотеке все действия над регистрами сделаны в виде макросов. Поэтому разницы большой не вижу. Чего то не хватает. С помощью куба быстрее менять варианты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно порыться с кубе, в en.stm32cubef1.zip

\en.stm32cubef1\STM32Cube_FW_F1_V1.6.0\Projects\STM32F103RB-Nucleo\Examples_LL\ADC\ADC_ContinuousConversion_TriggerSW_Init\Src\

main.c
stm32f1xx_it.c
system_stm32f1xx.c

. . . .
  * @brief   This example describes how to use a ADC peripheral to perform
  *          continuous ADC conversions of a channel, from a SW start.
  *          This example is based on the STM32F1xx ADC LL API;
  *          Peripheral initialization done using LL initialization function.
  ******************************************************************************
. . .
    /* Set Set ADC sequencers scan mode, for all ADC groups                   */
    /* (group regular, group injected).                                       */
    // LL_ADC_SetSequencersScanMode(ADC1, LL_ADC_SEQ_SCAN_DISABLE);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/* ADC1 init function */
void MX_ADC1_Init(void)
{
  LL_ADC_InitTypeDef ADC_InitStruct;
  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;
  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
  
  /**ADC1 GPIO Configuration  
  PA0-WKUP   ------> ADC1_IN0
  PA1   ------> ADC1_IN1
  PA2   ------> ADC1_IN2 
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* ADC1 DMA Init */
  
  /* ADC1 Init */
  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);

  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);

  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);

  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);

  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_HALFWORD);

  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);

    /**Common config 
    */
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
  ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE;
  LL_ADC_Init(ADC1, &ADC_InitStruct);

  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
  ADC_REG_InitStruct.SequencerLength = 4;
  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;
  LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);

    /**Configure Regular Channel 
    */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0);

  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_0, LL_ADC_SAMPLINGTIME_7CYCLES_5);

    /**Configure Regular Channel 
    */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_1);

  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_7CYCLES_5);

    /**Configure Regular Channel 
    */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3, LL_ADC_CHANNEL_2);

  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_2, LL_ADC_SAMPLINGTIME_7CYCLES_5);

    /**Configure Regular Channel 
    */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_4, LL_ADC_CHANNEL_TEMPSENSOR);

  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SAMPLINGTIME_7CYCLES_5);

  LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_TEMPSENSOR);

}

/* USER CODE BEGIN 1 */
void ADC1_next_Init(void)
{
	 LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 4);
	 LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1, (uint32_t)ADCbuff);
	 LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1, (uint32_t)&ADC1->DR);

	 LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
	 LL_ADC_Enable(ADC1);

	 LL_ADC_StartCalibration(ADC1);
	 while(LL_ADC_IsCalibrationOnGoing(ADC1));

}
/* USER CODE END 1 */

Вот код инициализации. Может что то я не включил? Раза 3 проверял перепроверял. Считываю с буфера в задаче FreeRTOS. ADC запускаю в начале программы

с помощью LL_ADC_REG_StartConversionSWStart(ADC1);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, khlenar said:

Поэтому разницы большой не вижу

А я вижу.

Когда у меня не работает, я беру отладчик, описание и медленно и печально сравниваю одно с другим. Прям вот методом написания на бумажке "в CR1 установлены бит SCAN, в CR2 ADON, DDS, DMA, CONT. В SQRx установлены ..., в SMPRx установлены ...". Помогает.

 

У Вас, кстати, sample time для температурного канала какой-то подозрительный. Подробности - в даташите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запустите этот код без RTOS. Если в настройках узлов все правильно (что вполне могобыть) - проверьте настройки-коммутацию подсистемы тактирования контроллера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот только сел, просмотрел по регистрам. Оказывается куб не включает в регистре ADC_SQR1 бит L(глубина сканирования). Всегда была 0. Вроде сейчас заработало. Спасибо большое всем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем,куб не корректно генерирует, в данном случае. Количество каналов пишет: 

ADC_REG_InitStruct.SequencerLength = 4;

а надо

ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS;

Это макрос сдвига к битам L. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, khlenar said:

Вообщем,куб не корректно генерирует, в данном случае.

В общем, куб с завидной регулярностью подгаживает людям))) Честно говоря, даже и не буду скрывать, что слегка злорадствую над этим творением. С другой стороны, лишний раз подтверждаю для себя, что нужно использовать только свои драйвера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 hours ago, haker_fox said:

В общем, куб с завидной регулярностью подгаживает людям))) Честно говоря, даже и не буду скрывать, что слегка злорадствую над этим творением. С другой стороны, лишний раз подтверждаю для себя, что нужно использовать только свои драйвера.

Я скажу так, можно разобраться как работает конкретная периферия + написать свой драйвер а можно сгенерить код кубом + разобраться как работает периферия итого, имея общую составлявшую разобраться как работает периферия скорость разработки будет определяться "написать свой драйвер" vs "сгенерить код кубом" с практической точки зрения выбор очевиден, но соглашусь, что некоторые просто получают эстетическое наслаждение изобретая свой велосипед со своим блекджеком и плюшками
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как тяжело читать ваше длинное предложение) Сразу уроки немецкого вспомнил)))

По делу...

5 minutes ago, Integro said:

с практической точки зрения выбор очевиден

Естественно! Только свой милый драйвер, удовлетворяющий своим задачам.

5 minutes ago, Integro said:

эстетическое наслаждение изобретая свой велосипед со своим блекджеком и плюшками

Никто же не сказал, что драйвера из куба/хала написаны безупречно. Придёт время, и их придётся рихтовать. А если прибор ваш работает в режиме 24/7/365 и периодически сбоит? Что делать? Вот один из наших приборов работает на подстанции. Его сбой - критичен. В случае сбоя можно получить "эстетическое наслаждение" от заказчика, которому по-бубену какие драйвера использованы. Ему нужна надёжность. Это электрическая подстанция...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Integro сказал:

скорость разработки будет определяться "написать свой драйвер" vs "сгенерить код кубом"
 

Не согласен. Во втором случае к "разобраться как работает периферия" прибавится очень непростой квест "разобраться как работает куб" :)

А это зачастую сложнее, чем понять, как работает периферия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как работает куб, я даже и не понял как), просто установил, открыл,создал проект, какой камень нужен и все. Я даже и не парился. В общем то у куба можно подсмотреть как делается. Когда новый не знакомый чип. Особенно если камень тяжелый. Допустим F429 с дисплеем и ОЗУ SDRAM, за пару дней в свободное время запустил. С мануалом конечно. Если бы регистры упаковывали в структуры и обьединения, то для меня это было бы на много проще и нагляднее чем вот эти дефайны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, AHTOXA said:

прибавится очень непростой квест "разобраться как работает куб" :)

Вот! Точно сказали:biggrin: И я думаю, зачем вводить лишнюю сущность, которую для нормальной разработки всё-равно придётся редактировать. Ну не верю я просто, что драйвера куба способны покрыть все задачи пользователя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...