Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1758 ADC зависает
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
kt368
Здравствуйте!
Пробую измерять напряжение с помощью встроенного АЦП в бесконечном цикле с помощью следующего кода:
Код
    while(1)
    {
        LPC_ADC -> ADCR |= (0x1)<<24;
        while((LPC_ADC->ADDR2 & (1 << 31)) == 0);
        temp = LPC_ADC -> ADDR2 & 0xfff0;
        LPC_ADC -> ADCR &= ~((0x1)<<24);
    }
В итоге, после нескольких секунд программа зависает на ожидании окончания измерения (2-я строчка, while((LPC_ADC->ADDR2 & (1 << 31)) == 0)wink.gif. Все прерывания запрещены. Тактовая PCLK_ADC0 83.33 МГц, тактовая АЦП 83/16=5.208 МГц. Отлаживаю с помощью клона J-link.

Вот дизассемблерный листинг участка кода ожидания окончания измерения:
Код
    63:                 temp = LPC_ADC -> ADDR2 & 0xfff0;
0x00002544 4807      LDR      r0,[pc,#28] ; @0x00002564
0x00002546 6980      LDR      r0,[r0,#0x18]
0x00002548 F64F71F0  MOVW     r1,#0xFFF0
0x0000254C 4008      ANDS     r0,r0,r1
0x0000254E 9001      STR      r0,[sp,#0x04]
    64:                 LPC_ADC -> ADCR &= ~((0x1)<<24);

В чем может быть причина зависания?
Сергей Борщ
Цитата(kt368 @ May 29 2014, 23:42) *
Все прерывания запрещены.
....
Отлаживаю с помощью клона J-link.
Криминала не видно. Единственная мысль - если отладчик периодически опрашивает регистры АЦП (например, чтобы обновить картинку в открытом окне), и такое чтение произойдет после установки бита DONE и до его чтения программой, то это чтение сбросит бит DONE и программа его не увидит.
В отладчике окно регистров АЦП не открыто случайно? Если да - закройте и попробуйте снова.

А кстати, а как вы определяете, что программа повисла? Если прерывания запрещены, а никаких шевелений ногами в этом кусочке кода нет. Вероятно останавливаете исполнение и обнаруживаете программу в этом цикле? Вот вероятно в момент останова отладчик и считывает регистр ADDR2, сбрасывая DONE.
kt368
Да, всё оказалось именно так, как вы описали! Закрыл окно просмотра регистров АЦП в отладчике (кейл), после этого уже 10 минут всё работает, при установке брейкпоинта цикл приостанавливается там где нужно.

Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.