Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: libopencm3 + stm32f4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ekka
Привет всем. Битый час сижу, не могу понять ПОЧЕМУ у меня в отладке значение с АЦП считывается нормально (0-4090),
а как только я запускаю программу - там 42.
Подозреваю, конечно, что в отладке я медленнее код прохожу. Может, я настраиваю не правильно,
или флаг не тот сбрасываю или проверяю? Что я делаю не так?

Код
void adc_init(void)
{
    rcc_periph_clock_enable(RCC_ADC1);
    gpio_mode_setup(PLC_AIN1_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_PULLDOWN, PLC_AIN1_PIN);

    nvic_set_priority(NVIC_ADC_IRQ, 0);
    nvic_enable_irq(NVIC_ADC_IRQ);

    rcc_periph_clock_enable(RCC_ADC1);
    adc_power_off(ADC1);
    adc_enable_scan_mode(ADC1);
    adc_enable_eoc_interrupt(ADC1);
    adc_set_right_aligned(ADC1);
    adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_3CYC);

    adc_set_continuous_conversion_mode(ADC1);
    adc_power_on(ADC1);

    my_delay(800000);

    channel_array[0] = 1;
    adc_set_regular_sequence(ADC1,2,channel_array);
    adc_start_conversion_regular(ADC1);
}

uint32_t adc1_result=0;
void adc_isr(void)
{
    if(adc_eoc(ADC1) == 1)
    {
        ADC_SR(ADC1) &= ~ADC_SR_EOC;
        adc1_result = adc_read_regular(ADC1);
    }
}
Ekka
Понимаю, что такой корявенькой libopencm3 особо никто не пользуется, просто заводской проект под нее написан.
Уже все просмотрено, никак не возьму в ум, почему в отладке есть значение, а в режиме работы - нет.
Проект делался по примерам.

Никто не пользовался LIBOPENCM3? Может, у кого-то просто возникала такая же проблема с другой библиотекой?
esaulenka
libopencm3 для АЦП не использовал, но...

1) Константа ADC_SMPR_SMP_3CYC выбрана осознанно?
2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено.
3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register
jcxz
Цитата(esaulenka @ Apr 16 2018, 13:21) *
2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено.

...более того: лучше это делать с предварительной очисткой ждущего (pending) запроса.

Цитата(esaulenka @ Apr 16 2018, 13:21) *
3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register

...более того: для сброса любого флага запроса в SR совсем не нужно его читать. Если конечно ознакомиться с даташитом. laughing.gif
Ekka
Может, есть у кого-то пример работы АЦП с прерыванием? Ну или хотя бы просто рабочий пример для STM32F4 - то, что в екземплах библиотеки - работает не так(


Цитата(esaulenka @ Apr 16 2018, 11:21) *
libopencm3 для АЦП не использовал, но...

1) Константа ADC_SMPR_SMP_3CYC выбрана осознанно?
2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено.
3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register


1) А что с ней не так?


Немного изменены настройки по аналогии с SPL - в ней так работало((

Код
void adc_init(void)
{
    rcc_periph_clock_enable(RCC_ADC1);
    gpio_mode_setup(PLC_AIN1_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, PLC_AIN1_PIN);

    rcc_periph_clock_enable(RCC_ADC1);

    adc_power_off(ADC1);

    adc_set_clk_prescale(ADC_CCR_ADCPRE_BY2);
    adc_disable_scan_mode(ADC1);
    adc_set_right_aligned(ADC1);
    adc_set_resolution(ADC1,ADC_CR1_RES_12BIT);
    adc_enable_eoc_interrupt(ADC1);

    adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_3CYC);
    adc_set_continuous_conversion_mode(ADC1);
    adc_power_on(ADC1);

    my_delay(800000);

    nvic_set_priority(NVIC_ADC_IRQ, 0);
    nvic_clear_pending_irq(NVIC_ADC_IRQ);
    nvic_enable_irq(NVIC_ADC_IRQ);

    adc_set_regular_sequence(ADC1,1,channel_array);
    adc_start_conversion_regular(ADC1);
}

uint32_t adc1_result=0;
void adc_isr(void)
{
    ADC1_SR &= ~(ADC_SR_EOC);
    adc1_result = adc_read_regular(ADC1);
}

Ekka
Прошу прощения. Нашлась моя ошибка, как всегда просто ..... тактирование.... rcc_periph_clock_enable(RCC_ADC1);

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