Tener problemas con el uso de temporizadores simultáneos [STM32]

1

En mi núcleo L432KC, he configurado el temporizador 1 para la generación PWM, el temporizador 15 como una interrupción basada en el temporizador y el temporizador 2 como el modo de entrada PWM. El temporizador 1 y el temporizador 15 funcionan bien hasta un punto. Mi frecuencia de reloj es 2MHz. Por ejemplo, quería un evento de actualización de 50 kHz, así que configuré el Precaler 0 del temporizador 15 y el período 39. En ese caso, el ciclo While (1) nunca se ejecuta, es decir, el programa se bloquea.

Cuando comienzo el temporizador 2 como:

HAL_TIM_IC_Start_IT (& htim2, TIM_CHANNEL_3);

HAL_TIM_IC_Start_IT (& htim2, TIM_CHANNEL_4);

Mi temporizador 1 se comporta mal. El programa en general se comporta mal. ¿Qué podría estar pasando aquí? Es como si la interrupción del temporizador 15 está tomando todo el control? ¿Hay algo relacionado con las interrupciones de prioridades? El propósito del temporizador 15 es disparar una interrupción a 50 kHz. Durante esta interrupción, estoy leyendo datos SPI.

Pseudocódigo de la rutina de interrupción:

Tire del chip hacia abajo

Lee SPI con HAL_SPI_Receive

Seleccionar chip

    

2 respuestas

3

Si tiene una activación de interrupción a una frecuencia de 50 kHz con un reloj de 2 MHz para su núcleo, deja 40 ciclos de reloj para trabajar entre dos interrupciones.

Eso es bastante poco, ya se necesitan algunos ciclos para entrar y salir de la interrupción, por lo que obtiene aún menos por el trabajo real.

En el comentario usted declaró que está "simplemente" leyendo algunos datos SPI. Si se tratara simplemente de transferir datos fuera del registro de datos SPI, eso podría estar bien, pero luego lo haría en una interrupción SPI. Así que supongo que esta lectura implica más que eso.

Y con eso estoy bastante seguro de que necesita más ciclos en la rutina de interrupción que los disponibles. Lo que hace que la próxima interrupción del temporizador se ponga en cola mientras aún se maneja el anterior.

En ese caso, nunca dejará la interrupción y el resto del programa nunca tendrá la oportunidad de ejecutarse. Las prioridades de las interrupciones pueden cambiar esto un poco (se manejarán otras interrupciones) pero no accederás a tu código principal.

Para cambiar esto, puede reducir la frecuencia de la interrupción o aumentar la frecuencia de reloj del núcleo.

    
respondido por el Arsenal
1

Leer el SPI en la interrupción del temporizador es incorrecto y su aplicación requiere reconsideración. Tiene interrupciones SPI para hacerlo o si la velocidad es mayor, necesita usar DMA para la comunicación.

Por lo tanto, cambiar la frecuencia no hará que su código sea correcto. Solo el uso correcto de periféricos lo hará.

    
respondido por el P__J__

Lea otras preguntas en las etiquetas