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.