Tengo una placa con un STM32F0 (por cierto utilizo las librerias HAL), y utilizo el RTC para que el sistema mantenga el reloj y la fecha. el RTC funciona con un cristal de 32,768KHz (El LSI del micro) y para lo demás utilizo el reloj interno del microcontrolador
El problema, es que también tengo que mostrar un cronometro por un display de 7 segmentos, pero claro si utilizo un timer normal y corriente el cronometro no es nada exacto, pero tampoco puedo utilizar el RTC por que entonces el reloj se pierde.
El problema no es utilizar el oscilador principal y porque seas mucho mas grande o fuera de los 32Khz llamarlo inexacto. El problema esta en los osciladores que elegiste.
el LSI tiene una frecuencia tipica de 40Khz, la cual su minima es de 30Khz y su maxima de 50Khz, es decir tenes toda esa variacion de frecuencia, no es 32.768Khz!! Sin contar que seguramente tenga una gran desviacion de frecuencia segun el voltaje y temperatura.
Todos los osciladores internos hacen lo mismo, ya que su funcion es que el micro siga siendo util si falla el oscilador principal. Obviamente es posible usarlos si es que no se lleva tiempo.
Entonces... si o si necesitas un cristal. Este cristal mientras menos error tenga mejor exactitud vas a tener. Asi que mas adelante te voy a dar una solucion
Otra cosa el RTC al ir a una frecuencia demasiado menor a la del micro, tiene su tiempo y consideraciones.
- La frecuencia de bus debe ser 7 veces mas que la del RTC, sino deberas leer 2 o 3 veces el valor y comprobar que se mantenga.
- Con el bit BYPSHAD en 0: De leerlo continuamente la unica forma es borrar el bit RSF y esperar que se ponga en 1, ya que cuando se pone en 1 es cuando los registros que mantienen los datos (shadow) actualizan los que uno lee. Si uno continua leyendo, bloquea la actualizacion, pero se sigue actualizando sobre los shadow.
- Con el bit BYPSHAD en 1: Como dice el bit, le hace un bypass a los registros shadow, por lo tanto se actualizaria directamente sobre los registros que leemos. El problema es que hasta que se actualicen todos seguramente va a existir problemas de coherencia, por lo que deberias leer 2 o 3 veces y corroborar que en las 3 veces el valor sea el mismo antes de tomarlo como valido.
En resumen estas leyendo mientras el RTC esta actualizando los valores, como es mas lento lo estas haciendo a la mitad del proceso.
En fin... como solucionamos esto?
Usar un cristal de 32768 Hz con la menor variacion (ppm) que podamos encontrar, el RTC se alimentaria de este LSE y el oscilador interno, deberias trimmearlo con ayuda del cristal asi lo ajustas correctamente, por ejemplo, si lo alimentas con 8Mhz al micro, y eso es lo que entra al TIM serian 8 millones la cuenta del Timer en el segundo que te de el RTC. Si el oscilador esta con 8.5Mhz suponete, entonces con el Trimm que posee lo bajas a 8Mhz, de esa forma te aseguras que sean 8Mhz, conociendo ahora si correctamente el valor del oscilador interno no deberias tener GRAN error el contabilizar hasta 1 segundo ( los milisegundos )