¿Por qué mi RTC genera interrupciones más rápido que una vez por segundo?

1

He configurado un módulo RTC en un uC para generar interrupciones cada segundo (~ 32 kHz de reloj del módulo con un preescalador 0x7FFF entre el contador y el reloj; espero que así sea, parece que ~ 32k es el valor predeterminado, y sería una pena si el error surge de un reloj incorrecto que se conecta al módulo). Sin embargo, parece que el registro del contador de segundos se incrementa cada vez que se lleva a cabo una sola instrucción de ensamblaje (a veces cada dos instrucciones de ensamblaje), generando interrupciones a una velocidad sorprendentemente rápida. ¿Cuál podría ser la causa de este comportamiento? Y si tuviera que solucionarlo sin poder hacer esta pregunta en foros como lo estoy haciendo, ¿cómo buscaría el problema?

En respuesta a los comentarios, el reloj RTC solo puede conectarse a osciladores internos o externos, ambos oscilando a ~ 32 kHz. El uC es una serie Infineon XMC con procesador Cortex M-4. Casi no puedo pensar en ninguna sección de mi código que pueda publicar, ya que es una configuración de registro simple que (a) Habilita eventos RTC periódicos, (b) Habilita SCU (Unidad de control del sistema - a cargo de los relojes, dominio de hibernación y encendido / reinicio dominios, etc.) interrupciones periódicas RTC, (c) Configurar las propiedades de NVIC. Como he señalado en uno de los comentarios; La parte que más me confunde de este problema es que el valor de 'segundos' parece ser correcto cuando se pasa a un hiperterminal, pero la frecuencia de actualización (el terminal de masilla se actualiza cada vez que se maneja una interrupción) es muy rápida, pero los segundos el conteo parece incrementarse cada segundo, lo que significa que el cronometraje es correcto.

Una pequeña actualización más sobre el problema. Parece que el temporizador RTC está funcionando correctamente e incluso se las arregla para mantenerse al día con la vida real durante al menos una hora cuando lo dejo en segundo plano. Sin embargo, lo que sucede es que la secuencia de interrupción se atasca en un bucle de tiempo sin ninguna razón en particular: si configuro las interrupciones para que se activen cada minuto en lugar de cada segundo, entonces el programa emitirá una interrupción un minuto después de que empiece a ejecutarlo, y luego ejecute esa interrupción una y otra vez, parpadeando el terminal muy rápido.

    
pregunta andrey

2 respuestas

3

El indicador de interrupción no se borra automáticamente para esta interrupción en particular / uC. El contador RTC funciona bien, sin embargo, una vez que se emite una interrupción, si la bandera no se borra al final de la rutina del manejador, al regresar del manejo de excepciones, el procesador verá que la bandera está activada y volverá a ingresar a la misma rutina. Poniéndose así en un gran bucle. Una de mis otras observaciones es que este no es siempre el caso: algunas marcas se borran automáticamente, mientras que otras se deben borrar a través del software.

    
respondido por el andrey
2

Parece que ha seleccionado la fuente de reloj incorrecta. Algunos microcontroladores le permiten usar el reloj de la CPU como entrada al bloque del temporizador, para permitir temporizadores de alta precisión.

    
respondido por el Simon Richter

Lea otras preguntas en las etiquetas