STM32 SysTick timer - No ejecuta el evento de alarma

2

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.

    
pregunta Thomas O

1 respuesta

3

Ha creado un gran problema para usted mismo al deshacerse de la biblioteca de periféricos estándar (SPL). Este microcontrolador es suficientemente difícil de aprender con él, y mucho menos sin él. La biblioteca puede tener un diseño horrible, pero tiene la ventaja de que realmente funciona. Le sugiero que primero obtenga un programa de prueba simple que funcione con SPL, y luego vuelva a implementar su funcionalidad gradualmente si realmente no puede usarlo (aún no he visto una razón técnica para ello).

Para utilizar una interrupción en un Cortex-M3 / M4, necesita lo siguiente:

  • una pila. El núcleo guarda automáticamente varios registros en la pila cuando se dispara una interrupción. El valor del puntero de pila inicial se lee desde la dirección 0x0 lo primero cuando se inicia el núcleo. Ese valor normalmente debería ser igual al final de RAM + 1.
  • corrija el desplazamiento de la tabla de vectores en el registro SCB->VTOR . Por defecto es 0, que (de nuevo por defecto) es el inicio de flash. Si su combinación de código de inicio / secuencia de comandos de vinculador configura la tabla de vectores correctamente, genial. El SPL hace eso. Parece que no (a menos que esté en el código que no publicaste). Mira cómo se hace en la biblioteca de periféricos estándar ( startup_stm32f4xx.s y el script de vinculador correspondiente para una cadena de herramientas basada en gcc).
  • un controlador. usted tiene eso.
  • la dirección de ese controlador + 1 debe estar en la posición correcta en la tabla de vectores. La forma en que asigna un valor a una ubicación en la tabla de vectores (supuesta) no funcionará de forma predeterminada, ya que está en flash. Me hace pensar que has reasignado tu RAM para comenzar en la dirección 0, pero no hay nada en tu pregunta que indique eso.
  • la interrupción debe habilitarse en el NVIC y su prioridad establecida. No veo eso en tu código en absoluto. Esto utiliza los registros NVIC->ISER[x] y NVIC->IPR[x] . Consulte la implementación de NVIC_Init() en el SPL y PM00214 sección 4.3.
  • finalmente, el periférico debe configurarse para generar solicitudes de interrupción reales. Parece que estás haciendo eso.

Si después de verificar todo lo que aún no puedes hacer que funcione, sería mejor publicar un proyecto completo (pero mínimo) para analizar.

    
respondido por el Thorn

Lea otras preguntas en las etiquetas