khlenar 5 4 марта, 2019 Опубликовано 4 марта, 2019 · Жалоба Здравствуйте все. Пробую АЦП данного устройства с помощью куба. АЦП в связке с ДМА. Почему то сканирует постоянно один канал. ДМА пишет в массив из 4 элементов значение 1 канала и все. Т.е. допустим ADCbuff[0] = 100, ADCbuff[1] = 100, ADCbuff[2] = 100, ADCbuff[3] = 100. АЦП в режиме регуляр. 4 канала, Rank установлены каждый на свой канал. Режим скан включен. Что еще надо сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 4 марта, 2019 Опубликовано 4 марта, 2019 · Жалоба 55 minutes ago, khlenar said: Что еще надо сделать? Выбросить куб. Проинициализировать регистры вручную. Делал сканирование пары каналов АЦП в stm32f051 с вычиткой DMA. Ничего сложного там нет. Правда сейчас ничего не помню, это было 3 года назад, на работе, а я сейчас в отпуске. Даже в код подглянуть не могу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 4 марта, 2019 Опубликовано 4 марта, 2019 · Жалоба Ничего сложного. В LL.. библиотеке все действия над регистрами сделаны в виде макросов. Поэтому разницы большой не вижу. Чего то не хватает. С помощью куба быстрее менять варианты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 4 марта, 2019 Опубликовано 4 марта, 2019 · Жалоба Можно порыться с кубе, в 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба /* 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 12 hours ago, khlenar said: Поэтому разницы большой не вижу А я вижу. Когда у меня не работает, я беру отладчик, описание и медленно и печально сравниваю одно с другим. Прям вот методом написания на бумажке "в CR1 установлены бит SCAN, в CR2 ADON, DDS, DMA, CONT. В SQRx установлены ..., в SMPRx установлены ...". Помогает. У Вас, кстати, sample time для температурного канала какой-то подозрительный. Подробности - в даташите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба Запустите этот код без RTOS. Если в настройках узлов все правильно (что вполне могобыть) - проверьте настройки-коммутацию подсистемы тактирования контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба Вот только сел, просмотрел по регистрам. Оказывается куб не включает в регистре ADC_SQR1 бит L(глубина сканирования). Всегда была 0. Вроде сейчас заработало. Спасибо большое всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба Вообщем,куб не корректно генерирует, в данном случае. Количество каналов пишет: ADC_REG_InitStruct.SequencerLength = 4; а надо ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS; Это макрос сдвига к битам L. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 2 hours ago, khlenar said: Вообщем,куб не корректно генерирует, в данном случае. В общем, куб с завидной регулярностью подгаживает людям))) Честно говоря, даже и не буду скрывать, что слегка злорадствую над этим творением. С другой стороны, лишний раз подтверждаю для себя, что нужно использовать только свои драйвера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 19 hours ago, haker_fox said: В общем, куб с завидной регулярностью подгаживает людям))) Честно говоря, даже и не буду скрывать, что слегка злорадствую над этим творением. С другой стороны, лишний раз подтверждаю для себя, что нужно использовать только свои драйвера. Я скажу так, можно разобраться как работает конкретная периферия + написать свой драйвер а можно сгенерить код кубом + разобраться как работает периферия итого, имея общую составлявшую разобраться как работает периферия скорость разработки будет определяться "написать свой драйвер" vs "сгенерить код кубом" с практической точки зрения выбор очевиден, но соглашусь, что некоторые просто получают эстетическое наслаждение изобретая свой велосипед со своим блекджеком и плюшками Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба Как тяжело читать ваше длинное предложение) Сразу уроки немецкого вспомнил))) По делу... 5 minutes ago, Integro said: с практической точки зрения выбор очевиден Естественно! Только свой милый драйвер, удовлетворяющий своим задачам. 5 minutes ago, Integro said: эстетическое наслаждение изобретая свой велосипед со своим блекджеком и плюшками Никто же не сказал, что драйвера из куба/хала написаны безупречно. Придёт время, и их придётся рихтовать. А если прибор ваш работает в режиме 24/7/365 и периодически сбоит? Что делать? Вот один из наших приборов работает на подстанции. Его сбой - критичен. В случае сбоя можно получить "эстетическое наслаждение" от заказчика, которому по-бубену какие драйвера использованы. Ему нужна надёжность. Это электрическая подстанция... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба 3 часа назад, Integro сказал: скорость разработки будет определяться "написать свой драйвер" vs "сгенерить код кубом" Не согласен. Во втором случае к "разобраться как работает периферия" прибавится очень непростой квест "разобраться как работает куб" :) А это зачастую сложнее, чем понять, как работает периферия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 7 марта, 2019 Опубликовано 7 марта, 2019 · Жалоба Как работает куб, я даже и не понял как), просто установил, открыл,создал проект, какой камень нужен и все. Я даже и не парился. В общем то у куба можно подсмотреть как делается. Когда новый не знакомый чип. Особенно если камень тяжелый. Допустим F429 с дисплеем и ОЗУ SDRAM, за пару дней в свободное время запустил. С мануалом конечно. Если бы регистры упаковывали в структуры и обьединения, то для меня это было бы на много проще и нагляднее чем вот эти дефайны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 9 hours ago, AHTOXA said: прибавится очень непростой квест "разобраться как работает куб" :) Вот! Точно сказали И я думаю, зачем вводить лишнюю сущность, которую для нормальной разработки всё-равно придётся редактировать. Ну не верю я просто, что драйвера куба способны покрыть все задачи пользователя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться