Я пытаюсь узнать, как использовать "новую" библиотеку 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;
}
}
источник
#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
это то же самое, что отключено, поэтому отключено на самом деле ADC_EOC_SEQ_CONV.Хм ... Я нашел пару учебников, которые использовали HAL_ADC_Stop (& hadc1), чтобы закончить преобразование ... Я смотрел на эти учебники раньше и думал, что это довольно варварский способ, кажется, он полностью отключает ADC, так что я должен был другой метод. Но, похоже, это действительно хорошо работает.
Не стесняйтесь опубликовать ответ, если есть более элегантный способ сделать это, так как я думаю, что использование HAL_ADC_Stop () довольно ужасно, но может использоваться в учебных целях.
источник
Я хотел бы добавить, что для моей установки (nucleo-h743) этого было недостаточно для установки:
Я также должен был включить настройку переполнения:
Без этого HAL_ADC_PollForConversion все еще блокировался. Я не совсем понимаю, почему это было необходимо, но это позволяет мне проводить опрос в непрерывном режиме.
источник
Это работает для меня, надеюсь, это поможет:
источник