Ekka 0 13 апреля, 2018 Опубликовано 13 апреля, 2018 · Жалоба Привет всем. Битый час сижу, не могу понять ПОЧЕМУ у меня в отладке значение с АЦП считывается нормально (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 0 16 апреля, 2018 Опубликовано 16 апреля, 2018 · Жалоба Понимаю, что такой корявенькой libopencm3 особо никто не пользуется, просто заводской проект под нее написан. Уже все просмотрено, никак не возьму в ум, почему в отладке есть значение, а в режиме работы - нет. Проект делался по примерам. Никто не пользовался LIBOPENCM3? Может, у кого-то просто возникала такая же проблема с другой библиотекой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 16 апреля, 2018 Опубликовано 16 апреля, 2018 · Жалоба libopencm3 для АЦП не использовал, но... 1) Константа ADC_SMPR_SMP_3CYC выбрана осознанно? 2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено. 3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 16 апреля, 2018 Опубликовано 16 апреля, 2018 · Жалоба 2) (некритично, но некрасиво) enable NVIC лучше делать в конце, когда всё настроено. ...более того: лучше это делать с предварительной очисткой ждущего (pending) запроса. 3) флажок статуса EOC сбрасывается самостоятельно, после чтения data register ...более того: для сброса любого флага запроса в SR совсем не нужно его читать. Если конечно ознакомиться с даташитом. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 16 апреля, 2018 Опубликовано 16 апреля, 2018 · Жалоба Может, есть у кого-то пример работы АЦП с прерыванием? Ну или хотя бы просто рабочий пример для 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 20 апреля, 2018 Опубликовано 20 апреля, 2018 · Жалоба Прошу прощения. Нашлась моя ошибка, как всегда просто ..... тактирование.... rcc_periph_clock_enable(RCC_ADC1); А кто-то пробовал с библиотекой libremodbus настраивать модбас? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться