Estoy tratando de usar la salida de COMP2 para activar el modo One-Pulse de un temporizador (en mi ejemplo, TIM4, pero es bastante flexible si necesita cambiar a otro temporizador) en la serie STM32L1.
En el manual de referencia, la explicación del modo One-Pulse utiliza TI2FP2 como disparador del temporizador, que está vinculado a la captura de entrada en el canal 2 del temporizador; sin embargo, la salida del comparador solo se puede redirigir a la captura de entrada en el canal 4. (excepto TIM10 pero no tiene un segundo canal para emitir el PWM en...), o para OCREF Clear.
He intentado redirigir la salida COMP2 a:
pero ninguna de esas opciones funcionó.
¿Alguna de estas configuraciones debería haber funcionado y simplemente no las configuré correctamente?
¿Se supone que debo hacerlo de manera diferente?
¿No hay forma de conectar los dos directamente y debería, por ejemplo, iniciar el modo One-Pulse desde la interrupción COMP2?
Mirando el diagrama de bloques de los temporizadores, tampoco pude encontrar un método directo, aparentemente no hay señales que vayan desde CH4 a la unidad de activación.
Si desea evitar interrupciones y tiene un canal DMA libre adecuado, puede usarlo para iniciar otro temporizador. Puede usar TIM2_CH4
o TIM3_CH4
(estoy usando TIM3 en el ejemplo), pero no hay un canal DMA para TIM4_CH4
. Puede ceñirse TIM4
o usar cualquier otro temporizador como objetivo.
TIM4
el modo de un solo pulso, pero no lo inicie todavía. Averigüe qué valor entraría TIM4->CR1
y guárdelo en una variable de memoria, por ejemplo, volatile uint8_t tim4_cr1_start = TIM_CR1_OPM|TIM_CR1_CEN;
para el caso más simple.DMA1_Channel3
, la dirección de la memoria es &tim4_cr1_start
desde arriba, la dirección del periférico es &TIM4->CR1
, la longitud de la transferencia es 1
. Use el modo de 8 bits, habilite el modo circular.TIM3_CH4
la captura de entrada, seleccione la polaridad, etc. en TIM3_CCER
y TIM3_CCMR2
.CC4DE
, capture/compare 4 solicitudes DMA en TIM3->DIER
.TIM3
_TIM3_CH4
(podría usar TIM2_CH4' too, but there is no DMA channel for
TIM4_CH4`).Ahora, un evento de comparación activaría una captura en TIM3_CH4
, lo que le indicaría a DMA que escriba un valor adecuado en TIM4->CR1
. Como el DMA está configurado en modo circular, copiaría el mismo valor en TIM4->CR1
cada evento de captura posterior.
Benoît Vernier
siguió a Mónica a Codidact
MOVS
, 2 paraLDR
y 2 paraSTR
). Es un mínimo teórico, yo diría que 20-25 ciclos son realistas. Realmente no sé acerca de las latencias de DMA, supongo que 3 o 4 ciclos, y me sorprendería mucho si tomara más de 5. Luego, el temporizador necesita quizás otros 2 ciclos para comenzar en ambos casos.siguió a Mónica a Codidact