Я намагаюся навчитися використовувати "нову" бібліотеку HAL від stm32.
Коли я намагаюся зробити просте перетворення АЦП, він працює лише один раз, але потім він перестає конвертувати. Я припускаю, що прапор кінця конверсії не встановлюється. Я використовую плату Discovery STM32f429I, на якій є STM32f429ZI.
Зауважте, що я знаю, що спринт є поганою практикою і робити adc з перериванням краще, я знаю, що, будь ласка, не вказуйте цього, це не стосується питання, я просто тестую HAL тут.
Отже, питання полягає в тому, чому прапор EOC не встановлений або що я можу зробити, щоб він працював? Гуглінг не дуже допомагає, оскільки там дуже мало хороших матеріалів про HAL.
Ось код:
__IO uint16_t ADCValue=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
int main(void)
{
char str[15];
/* Various initializations */
HAL_ADC_Start(&hadc1);
while (1)
{
if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
sprintf(str, "%d", ADCValue);
BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
}
Я також створив проект за допомогою CubeMX, adc конфігурація така:
EDIT 1
Я спробував налагодити все, і здається, що програма застрягла в тому, щоб перевірити прапор EOC - він бачить, що він не показаний, і тому видає таймер, очікуючи на показ EOC (але він ніколи не встановлюється) Ось код, де він застрягає в налагоджувачі:
/* Check End of conversion flag */
while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)))
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
{
hadc->State= HAL_ADC_STATE_TIMEOUT;
/* Process unlocked */
__HAL_UNLOCK(hadc);
return HAL_TIMEOUT;
}
}