Перейти к содержанию
    

libopencm3 + stm32f4

Привет всем. Битый час сижу, не могу понять ПОЧЕМУ у меня в отладке значение с АЦП считывается нормально (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);
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понимаю, что такой корявенькой libopencm3 особо никто не пользуется, просто заводской проект под нее написан.

Уже все просмотрено, никак не возьму в ум, почему в отладке есть значение, а в режиме работы - нет.

Проект делался по примерам.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

libopencm3 для АЦП не использовал, но...

 

1) Константа ADC_SMPR_SMP_3CYC выбрана осознанно?

2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено.

3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено.

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

 

3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register

...более того: для сброса любого флага запроса в SR совсем не нужно его читать. Если конечно ознакомиться с даташитом. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, есть у кого-то пример работы АЦП с прерыванием? Ну или хотя бы просто рабочий пример для STM32F4 - то, что в екземплах библиотеки - работает не так(

 

 

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);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

А кто-то пробовал с библиотекой libremodbus настраивать модбас?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...