¿Cómo usar TIMER 2 como un contador simple en STM8S103F3?

1

Soy nuevo en STM8S y todavía no soy tan bueno en la programación de microcontroladores en general. Estoy tratando de aprender sobre temporizadores / contadores en microcontroladores.

Escribí el siguiente código para alternar un LED en cada segundo que está conectado en el pin PB5.

#include "stm8s.h"

int main() {
  // Default clock is HSI/8 = 2MHz

  PB_DDR |= (1 << PB5); // PB5 is now output
  PB_CR1 |= (1 << PB5); // PB5 is now pushpull

  TIM2_PSCR = 0b00000111; //  Prescaler = 128
  TIM2_CR1 |= (1 << TIM2_CR1_CEN); // Enable TIM2

  while (1) {
    if ( ( ((uint16_t)TIM2_CNTRH << 8) + (uint16_t)TIM2_CNTRL ) >= 15625 ) {
      // Reset counter back to 0
      TIM2_CNTRH = 0;
      TIM2_CNTRL = 0;

      // Toggle LED.
      PB_ODR ^= (1 << PB5);
    }
  }
}

Mi microcontrolador no está conectado a un reloj externo y está usando el reloj interno para funcionar.

Después de leer la hoja de datos, veo que el reloj de MCU será HSI / 8 = 2MHz por defecto. Establecí 128 como preescalador para TIM2. Por lo tanto, el contador TIM2 se incrementará en cada 64us. Entonces, cuando llegue a 15625 será de 1 segundo (64 * 15625 = 1000000us = 1s).

Entonces, asumí que el LED cambiaba en cada segundo.

El problema es que el LED permanece encendido todo el tiempo.

¿Podría alguien ayudarme a identificar el problema con mi código?

Gracias de antemano.

    
pregunta Junaid

1 respuesta

1

Después de leer el Manual de referencia, más encontré que necesitamos configurar UG bit TIM2_EGR para generar y actualizar el evento para que MCU tome el valor del prescaler para el TEMPORIZADOR 4.

TIM2_EGR |= (1 << TIM2_EGR_UG);

Entonces, el código actualizado será:

#include "stm8s.h"

int main() {
  // Default clock is HSI/8 = 2MHz

  PB_DDR |= (1 << PB5); // PB5 is now output
  PB_CR1 |= (1 << PB5); // PB5 is now pushpull

  TIM2_PSCR = 0b00000111; //  Prescaler = 128
  TIM2_EGR |= (1 << TIM2_EGR_UG); // Generate an update event so prescaler value will be taken into account.
  TIM2_CR1 |= (1 << TIM2_CR1_CEN); // Enable TIM2

  while (1) {
    if ( ( ((uint16_t)TIM2_CNTRH << 8) + (uint16_t)TIM2_CNTRL ) >= 15625 ) {
      // Reset counter back to 0
      TIM2_CNTRH = 0;
      TIM2_CNTRL = 0;

      // Toggle LED.
      PB_ODR ^= (1 << PB5);
    }
  }
}

¡Ahora el LED comenzó a alternar en cada segundo!

    
respondido por el Junaid

Lea otras preguntas en las etiquetas