Я пытаюсь узнать, как использовать "новую" библиотеку HAL из stm32.
Когда я пытаюсь сделать простое преобразование АЦП, он работает только один раз, но затем он останавливается. Я полагаю, что флаг Конверсии не установлен. Я использую плату обнаружения STM32f429I, в которой есть STM32f429ZI.
Обратите внимание, что я знаю о том, что sprintf - плохая практика, и лучше делать АЦП с прерываниями, я знаю, что, пожалуйста, не указывайте, это не имеет отношения к вопросу, я просто тестирую HAL здесь.
Итак, вопрос в том, почему флаг EOC не установлен или что я могу сделать, чтобы он работал? Поиск в Google не очень помогает, так как очень мало хороших материалов о 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, конфигурация АЦП выглядит следующим образом:
РЕДАКТИРОВАТЬ 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;
}
}