Estoy intentando escribir una interrupción para mantener el tiempo básico medido en tics en un STM32F407VGT (Discovery Board).
Mi interrupción parece ejecutarse una vez (aunque no puedo estar seguro), pero luego se bloquea / bloquea el procesador completamente. Toda la salida de UART se detiene ...
El código es esencialmente el mismo que en "La guía definitiva para ARM Cortex-M3, 2ª ed." (Joseph Yiu, Newnes.) ¿Podría ser un problema el hecho de que el STM32F4xx sea un ARM Cortex-M4? Si es así, ¿cómo puedo solucionar esto? Inicialmente intenté usar TMR2, con problemas similares, lo que me hace pensar que es algo que me falta. También he intentado usar SysTickConfig, con los mismos problemas.
uint32_t ticks;
void SysTickAlarm(void)
{
SysTick->CTRL = 0;
SCB->ICSR = SCB->ICSR & 0xFDFFFFFF;
ticks++;
return;
}
/*
* Initialise system timer
*/
void tick_init(void)
{
ticks = 0;
*((volatile unsigned int*)(SCB->VTOR + (15 << 2))) = (unsigned int) SysTickAlarm;
SysTick->CTRL = 0; // Disable SysTick
SysTick->LOAD = TICK_DELAY; // Delay for 10 ms
SysTick->VAL = 0; // Clear current value to 0
SysTick->CTRL = 0x7; // Enable SysTick+exception and use processor clock
}
/*
* get_ticks: Get the number of ticks since processor initialisation.
*/
uint32_t get_ticks()
{
return ticks;
}
main () llama a tick_init () y luego comienza a escupir printf("ticks=%d\n", get_ticks());
en un bucle. Pero se detiene bastante rápido, obtengo alrededor de 10 líneas antes de que se bloquee.
Soy muy nuevo en los procesadores ARM, por lo que probablemente sea algo muy simple, pero no puedo verlo.