SysTick precision en STM32

4

He codificado una simple verificación de tiempo para mi placa de descubrimiento STM32F4.

#define IT_PER_SEC 100

int main(void)
{
   if (SysTick_Config(SystemCoreClock / IT_PER_SEC)) 
   {          
      while (1){}; // error
   }

   initGPIO();

   for(;;)
   {
   }

   return 0;
}

void SysTick_Handler(void)
{
   static uint32_t csec  = 0;
   static uint32_t ctime = 0;

   ++csec;
   if(csec == IT_PER_SEC) // every second
   {
      // every second
      GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
      csec = 0;

      // clock
      ++ctime;

      if((ctime % 10) == 0) // every 10 seconds
      {
         GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
      }

      if((ctime % 60) == 0)     // every minute
      {
         GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
      }

      if(ctime == 3600)         // every hour
      {
         GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
         ctime = 0;
      }
   }
}

Esto parece estar funcionando bien. Lo comprobé con la aplicación del cronómetro en mi teléfono Android. Pero después de una hora y algo, noté que la sincronización del LED fue de aproximadamente un segundo de anticipación y después de dos horas y media estoy casi a dos segundos.

Supongo que mi aplicación no tiene la culpa aquí, ¿o sí? El SysTick debería estar bien también, supongo. Así que debe ser mi código ...

Los esquemas son los esquemas estándar de la placa de descubrimiento STM32F4. Se pueden encontrar en el manual del usuario en la página 32. Allí, una lata encuentre un cristal de 8 MHz junto con los dos condensadores comunes de 20 pF.

    
pregunta aLu

5 respuestas

4

Los cristales son generalmente mucho mejores que 50 ppm de precisión ... PERO ... los cristales tienen dos modos de resonancia: resonancia en serie y resonancia paralela (con un gráfico de impedancia, verá que la impedancia aumenta hasta el infinito en resonancia paralela y cae hacia cero en la resonancia de la serie).

Ahora, la importancia de esto es que los dos modos de resonancia suelen estar separados por unos pocos cientos de PPM, ¡y solo uno de ellos estará en la frecuencia marcada!

Si acaba de comprar un cristal de "8 MHz" sin prestar la debida atención a la letra pequeña, puede obtener un corte a 8 MHz en el modo incorrecto; y su oscilador tendrá varios cientos de PPM desafinados.

(La resonancia paralela también se puede ajustar a más de 50 ppm o más, por lo que generalmente se especifica a una capacidad de carga determinada).

Usted pensaría que la mayoría de los diseñadores profesionales prestarían más atención y seleccionarían el cristal correcto, y por lo general tendría razón, ¡pero incluso he visto algunos equipos de audio digital de alto precio en los que se cometió este error!

O tal vez la compra de componentes encontró un "buen negocio" o simplemente se decidió que para una junta de evaluación de presupuesto, el precio era más importante que la precisión de tiempo ...

Pero de todos modos, mi conjetura es que el cristal está funcionando en el modo incorrecto para producir un error de frecuencia de 300 ppm.

    
respondido por el Brian Drummond
3

Systick se deriva del reloj del procesador, que a su vez probablemente se deriva de un xtal (o del oscilador RC interno).

El error de 1 segundo en 1 hora es 1: 3600, o 277 ppm. Se garantiza que un xtal de uso normal tiene una precisión de hasta 50 ppm, por lo que es poco probable que sea causado solo por la inexactitud del xtal.

¿Estás seguro de que tu chip se ejecuta en el xtal? Los chips LPC con los que estoy familiarizado se ejecutan de forma predeterminada en su oscilador RC interno, que es mucho menos preciso que un xtal.

Otro culpable podría ser una inicialización incorrecta, ¿estás seguro de que se hizo correctamente?

Nota al margen: para un mantenimiento preciso, los cristales de 32 kHz parecen ser más populares, pero no veo uno en una foto de un tablero de descubrimiento STM32F4. Hay un lugar vacío marcado como X3, tal vez para ese xtal.

    
respondido por el Wouter van Ooijen
2

En la hoja de datos del STM32F4 encontré esto, tal vez sea su respuesta:

  

Registro de valores de calibración de SysTick

     

El valor de calibración de SysTick se fija en 18750, lo que da una base de tiempo de referencia de 1 ms   con el reloj SysTick configurado a 18,75 MHz (HCLK / 8, con HCLK configurado a 150 MHz).

    
respondido por el Seb
1

Parece que su uC se está ejecutando desde el oscilador HSI. Tengo un Discovery F4 y me parece recordar que tuve una pequeña dificultad para que funcionara desde el oscilador externo al principio.

Una forma fácil de probar es probar el pin de salida del oscilador externo para ver si está funcionando.

Si echa un vistazo a la documentación de la biblioteca periférica, en CMSIS, verá las funciones SystemInit y SetSysClock . IIRC, al reiniciar, el comportamiento normal es usar el HSI a menos que se defina lo contrario. Asegúrese de tener definido el STD_PERIPH_DRIVER y verifique su archivo system_stm32f4xx.c para asegurarse de que esté seleccionado el oscilador correcto. Asegúrese de que su HSE_VALUE esté definido (y configurado al valor correcto) también.

Básicamente, hojee alrededor de los archivos de configuración del sistema CMSIS y la documentación en la biblioteca. Olvidé de la parte superior de mi cabeza exactamente lo que necesita configurar (estoy medio dormido aquí, y muy pronto será el otro mitad ...), pero está todo ahí en alguna parte (los comentarios en el código lo guiarán sobre cómo configurar el oscilador correcto) por ejemplo, en el archivo system_stm32f4xx tiene este comentario en la parte superior:

* 5. This file configures the system clock as follows:
  *=============================================================================
  *=============================================================================
  *        Supported STM32F4xx device revision    | Rev A
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 168000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 168000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 25000000
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 25
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 336
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 7
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        High Performance mode                  | Enabled
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 5
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | OFF
  *-----------------------------------------------------------------------------
  *        Instruction cache                      | ON
  *-----------------------------------------------------------------------------
  *        Data cache                             | ON
  *-----------------------------------------------------------------------------
  *        Require 48MHz for USB OTG FS,          | Enabled
  *        SDIO and RNG clock                     |
  *----------------------------------------------------------------------------- 
    
respondido por el Oli Glaser
1

Hay un par de formas de calibrar el reloj HSI para que sea más realista, use la red de 50 Hz o RTC. La nota de inicio de ST es aquí .

Básicamente cuente hasta un segundo, tanto con Systick como RTC, y divida en hardware con los bits HSITRIM.

    
respondido por el whatnick

Lea otras preguntas en las etiquetas

Comentarios Recientes

T3 CPU. Esta sincronización LCD se basa en el estado FÍSICO de un marco de imagen conocido, donde cada 1.3 microsegundos es un proceso de activación iniciado por la CPU para obtener esos datos para el siguiente marco de imagen. La ventana de memoria que se procesa mientras usa los marcos de imagen varía con la longitud de cada cuadro, en cuyo caso un solo cuadro dura 1.6 microsegundos para generar memoria por cada 2.6 microsegundos de imágenes tomadas en la ventana. Los ejemplos usan veinte cuadros por segundo... Lees verder