user_stm 0 5 мая, 2023 Опубликовано 5 мая, 2023 (изменено) · Жалоба Здравствуйте. Мне нужно в RunTime настроить заданный пин (например A1) для работы с ацп, запустить преобразование ,получить результат, применяя HAL (чип stm32F401) Логика работы такая: по требованию начинается цикл измерений (несколько преобразований для усреднения) - каждую секунду запускается измерение напряжение на заданном пине (А1) по окончанию преобразования, результат суммируется с предыдущим для последующего усреднения Напомню,При запуске МС этот заданный пин неизвестен и должен находиться в Reset_State Чтобы заставить STM32CubeIDE сгенерировать начальный код настройки АЦП, использование колбэк функций и тд, и при этом не указывать конкретный пин, я задаю использование для АЦП встроенного температурного датчика на кристалле, ставлю галочки прерывание на окончание АЦП.. кстати, в будущем этот датчик планирую использовать вот вообщем код инициализации - генерирует STM32CubeIDE включить тактирование порта А я не забыл __HAL_RCC_GPIOA_CLK_ENABLE(); - вызваю ранее void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { if(hadc->Instance==ADC1) { __HAL_RCC_ADC1_CLK_ENABLE(); HAL_NVIC_SetPriority(ADC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ADC_IRQn); } } static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; ADC_InjectionConfTypeDef sConfigInjected = {0}; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /*вот я даже пробовал использовать InjectedChannel - sConfigInjected.InjectedChannel = ADC_CHANNEL_TEMPSENSOR; sConfigInjected.InjectedRank = 1; sConfigInjected.InjectedNbrOfConversion = 1; sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_3CYCLES; sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_NONE; sConfigInjected.ExternalTrigInjecConv = ADC_INJECTED_SOFTWARE_START; sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedOffset = 0; if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK) { Error_Handler(); } */ } когда становится известно какой пин нужен, пишу: GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = 1<<(uint16_t)Line; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); запуск преобразования делаю так, к этому времени какой пин нужен стало уже известно (A1) sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {Error_Handler();} HAL_ADC_Start(&hadc1);//начать АЦП преобразование написал колбэк по окончанию void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //окончание АЦП преобразования { adc_data = HAL_ADC_GetValue(&hadc1); ..... Вообщем похоже что прерывание не наступает, флаг туда еще не ставил для проверки.... но мне нужно узнать правильно ли я настроил АЦП, ПОМОГИТЕ работоспособен ли такой вариант не особо понимаю смысл всех этих Rank,InjectedChannel,SamplingTime Изменено 5 мая, 2023 пользователем user_stm случайно нажал enter Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 5 мая, 2023 Опубликовано 5 мая, 2023 · Жалоба В пакете HAL для F4 есть примеры ADC_DualModeInterleaved ADC_InjectedConversion_Interrupt ADC_RegularConversion_DMA ADC_RegularConversion_Interrupt ADC_RegularConversion_Polling ADC_TriggerMode ADC_TripleModeInterleaved Посмотрите, запустите и будет понимание Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 5 мая, 2023 Опубликовано 5 мая, 2023 · Жалоба 2 часа назад, user_stm сказал: не особо понимаю смысл всех этих Rank,InjectedChannel,SamplingTime Для понимания производитель чипа написал для вас юзер.мануал. Попробуйте всё-таки открыть его. PS: Работать с какой-то периферией МК не читая юзер.мануал, это всё равно, что играть в пинг-понг с закрытыми глазами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 5 мая, 2023 Опубликовано 5 мая, 2023 · Жалоба Поздно бултыхаться, когда акулы ноги доедают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться