Порт прерывание

Нагисса
Ср 11 апреля 2018 г., 6:07
Привет,


Я хочу прикрепить прерывание к 10 или 11 булавкам на том же порту (PB). Есть ли способ сделать это в инструкции, или мне нужно прикрепить столько прерываний, сколько булавок?


заранее спасибо.

Стивестронг
Ср 11 апреля 2018 г., 7:11
Поскольку ISR могут быть разными, нормально использовать различные вызовы функций для прикрепления ISR к каждому штифту отдельно.

Нагисса
Ср 11 апреля 2018 г., 7:44
[Стивестронг - Ср 11 апреля 2018 г. 7:11] - Поскольку ISR могут быть разными, нормально использовать различные вызовы функций для прикрепления ISR к каждому штифту отдельно.
Я пытаюсь контролировать параллельное соединение при любом изменении, поэтому все подпрограммы будут той же функцией.

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

Я надеялся иметь возможность прикрепить прерывание к целому порту, лучше, если я смогу использовать маску, чтобы выбрать желаемые выводы.

Если нет, мне нужно очистить флаг прерывания других пинсов, когда называется ISR.

Кто -нибудь может указать мне в направлении, как это сделать (любое из них)?

Спасибо.

Стивестронг
Ср 11 апреля 2018 г. 8:20 утра
Посмотрите в Exti.c, ext_interrupts.CPP.

Нагисса
Ср 11 апреля 2018 г. 10:14
В конце я нашел лучший способ, потому что это обязательно контролировать критический вывод, используя внешнее прерывание, и я могу проверить другие на цикле или на временном прерывании.

Но то, что я пытался, но не сработал хорошо, было этим:
afio_remap( AFIO_REMAP_TIM2_PARTIAL_1); //etc

Стивестронг
Ср 11 апреля 2018 г. 11:18
«Arduino»-пути для прикрепления прерываний: static inline uint16 timer_get_compare(timer_dev *dev, uint8 channel) { __io uint32 *ccr = &(dev->regs).gen->CCR1 + (channel - 1); return *ccr; }

Эдогальдо
Ср 11 апреля 2018 г. 11:21
Похоже, вам нужна логика или ваши входы, вы можете оценить подключение всех входов к одному PIN..

Нагисса
Ср 11 апреля 2018 г., 11:44
[Стивестронг - Ср 11 апреля 2018 г. 11:18] - «Arduino»-пути для прикрепления прерываний: /* Example of the Timer Input Capture mode * * Thanks to @cesco on the stm32duino.com * * This example uses Timer2. Other timers also support this mode, bnt on the F103C * only Timer 2 has usable external trigger pins. PA0 and PA15 * Because the only other usable pin on the F103C is one of the USB pins. * * Upload to your favourite F103Cx * Open the Serial plotter * Put your finger on either PA0 or PA15 (depenidng whether you USE the pin remapping) * * Observe your local mains frequency in terms of pulse width time. * */ /* Timer2 external trigger can be ether PA0 or PA15. To use use afio_remap(FIO_REMAP_TIM2_PARTIAL_1) or afio_remap(AFIO_REMAP_TIM2_FULL) Note. using afio_remap also changes the pins used by Timer2 CH1,CH2,CH3 amd CH4 * See page 184 of the STM32F10x Refernce manual (PDF downloadable from ST.com */ //#define USE_REMAP_PIN #ifdef USE_REMAP_PIN const int timer2ExternalTriggerPin = PA15; #else const int timer2ExternalTriggerPin = PA0; #endif volatile boolean hasCapture; volatile uint16_t captureValue; volatile uint16_t lastCaptureValue=0; volatile uint16_t captureDifference=0; void captureCallback(void) { hasCapture=true; captureValue = Timer2.getCompare(1); captureDifference = captureValue-lastCaptureValue; lastCaptureValue=captureValue; } void setup() { pinMode(timer2ExternalTriggerPin,INPUT); #ifdef USE_REMAP_PIN afio_remap(AFIO_REMAP_TIM2_PARTIAL_1); #endif hasCapture = false; Timer2.setPrescaleFactor(72); // prescaler to count 72,000,000 / 72 counts per second. i.e count microseconds Timer2.setMode(TIMER_CH1, TIMER_INPUT_CAPTURE); Timer2.attachCompare1Interrupt(captureCallback); } void loop() { // Printing inside the callback is not a good idea. // Hence the capture callback sets a flag , which is detected here if (hasCapture) { Serial.println(captureDifference); hasCapture=false; } }

Стивестронг
Ср 11 апреля 2018 12:04
Если вы расскажете нам больше о том, чего вы пытаетесь достичь, мы сможем порекомендовать вам другую технику, например, использование DMA при изменении состояния PIN -кода для хранения значения порта iO (если все ваши входные контакты являются частью одного и того же порта IO). Это может освободить некоторое время на основном уровне для других вещей.

Нагисса
Ср 11 апреля 2018 12:27
[Стивестронг - Ср 11 апреля 2018 12:04] - Если вы расскажете нам больше о том, чего вы пытаетесь достичь, мы сможем порекомендовать вам другую технику, например, использование DMA при изменении состояния PIN -кода для хранения значения порта iO (если все ваши входные контакты являются частью одного и того же порта IO). Это может освободить некоторое время на основном уровне для других вещей.
У меня подключен куча сигналов. Они связаны и синхронизированы на 1 МГц или разделитель, за исключением одного из тех сигналов, которые работают с очень маленькими импульсами (все еще на той же частоте, но я не хочу терять эти импульсы).

Итак, у меня есть эта функция в качестве прерывания PIN (на быстром пульсирующем штифте) и внутри прерывания таймера 1 МГц (он делает мало дополнительных вещей):
/* * Interrupt handlers. */ void __irq_usart1(void) { usart_irq(&usart1_rb, &usart1_wb, USART1_BASE); } __weak void __irq_usart2(void) { usart_irq(&usart2_rb, &usart2_wb, USART2_BASE); }

Rogerclark
Ср 11 апреля 2018 г., 21:32
Вы пробовали просто прикрепить один и тот же обработчик прерывания ко всем выводам, которые вы хотите вызвать?

Если это не сделало’T Работаете, вы должны взглянуть на код в ядре, чтобы увидеть, что он делает, когда вы прикрепляете прерывание, так как Leaflabs, вероятно, не сделали’T ожидайте, что такие вещи будут необходимы, так как часто люди хотят прикреплять различные обработчики к каждому PIN

Нагисса
Чт 12 апреля 2018 г., 4:48
[Rogerclark - Ср 11 апреля 2018 г., 21:32] - Вы пробовали просто прикрепить один и тот же обработчик прерывания ко всем выводам, которые вы хотите вызвать?

Если это не сделало’T Работаете, вы должны взглянуть на код в ядре, чтобы увидеть, что он делает, когда вы прикрепляете прерывание, так как Leaflabs, вероятно, не сделали’T ожидайте, что такие вещи будут необходимы, так как часто люди хотят прикреплять различные обработчики к каждому PIN
С уважением, нет: я ожидаю, чем один вызов, если изменится больше, чем булавка.

Я попробую, если фактическая реализация не удастся...

Дэнниф
Пт 13 апреля 2018 г., 18:28

Эй, связаны и синхронизированы на 1 МГц
Вы, вероятно, хотите подумать об аппаратных решениях, таких как Cold или FPGA. Или программное решение через 29 лет, 😀

Нагисса
SAT 14 апреля 2018 г., 7:17 утра
[Дэнниф - Пт 13 апреля 2018 г. 18:28] -
Эй, связаны и синхронизированы на 1 МГц
Вы, вероятно, хотите подумать об аппаратных решениях, таких как Cold или FPGA. Или программное решение через 29 лет, 😀
Надеюсь, мне это не нужно.

Он нуждается только в передаче или получении 12 тыс. Данных в всплесках максимум 1 000 000 сигналов в секунду, но без обработки, просто от/до памяти.

Мои первые тесты, кажется, работают даже со временем, работающими и включено немного серийной отладки. Все еще разрабатывая циклы управления, так как время чтения/письма очень мало сравнивать время, ничего не делая, и это контролируется кучей сигналов.