Нагисса
Ср 11 апреля 2018 г., 6:07
Привет,
Я хочу прикрепить прерывание к 10 или 11 булавкам на том же порту (PB). Есть ли способ сделать это в инструкции, или мне нужно прикрепить столько прерываний, сколько булавок?
заранее спасибо.
Я хочу прикрепить прерывание к 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
Если это не сделало’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 сигналов в секунду, но без обработки, просто от/до памяти.
Мои первые тесты, кажется, работают даже со временем, работающими и включено немного серийной отладки. Все еще разрабатывая циклы управления, так как время чтения/письма очень мало сравнивать время, ничего не делая, и это контролируется кучей сигналов.