sábado, 17 de agosto de 2013

Temporizaciones en STM32F0

Siguiendo con los primeros pasos con la placa STM32F0Discovery, una vez tenemos controlados los GPIO, lo siguiente que más vamos a utilizar en cualquier diseño son las temporizaciones, y para ello, el Cortex M0 tiene bastantes posibilidades, en concreto dispone de 8 timers de proposito general, cada uno con características diferentes, además del timer de sistema llamado SysTick. Los timers de proposito general son el 1, 2, 3, 6, 14, 15, 16 y 17, siendo el 6 el más básico, y el 1 el más completo, con el que podemos generar señales PWM, captura de señales, salidas de comparación con hasta 4 comparadores... en la siguiente tabla podéis ver una comparativa de los timers.

Como veis cada uno lo podríamos utilizar para una aplicación diferente, por ejemplo los que disponen de salidas complementarias, los podríamos utilizar para el control de fuentes conmutadas o control de motores. Los que disponen de 4 comparadores se pueden utilizar para el control de inversores por ejemplo.
Para configurar los timers tan solo tenemos que modificar 2 registros, el registro de preescaler PSC, y el registro de autorecarga ARR, que se corresponde con el número de cuentas que debe hacer el temporizador, de forma que el número total de cuentas es (PSC+1) * ARR Además de estos dos, debemos habilitar el timer, desde el registro de control 1 CR1, además de llevar la señal de reloj a este.
En el siguiente vídeo tenéis explicado un ejemplo de Hola Mundo utilizando el timer 3.



El código que se ha desarrollado en el vídeo es el siguiente:

//=============================================================================
// Autor: P.Trujillo
// mipsandchips.blogspot.com.es
// Parpadeo de los leds de la placa discovery alternativamente
//=============================================================================
 
#include "stm32f0xx.h"
 
//=============================================================================
// main function
//=============================================================================
int main(void)
{ 
   
  RCC->AHBENR |= RCC_AHBENR_GPIOCEN ; //Habilitamos el reloj para el puerto C
 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //Habilitamos el reloj para el timer 3
  
  GPIOC->MODER = GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0; //Puerto C8 y C9 como salida
  GPIOC->ODR = GPIO_ODR_8|GPIO_ODR_9;
 
 TIM3->PSC = 47999;
 TIM3->ARR = 1000;
 TIM3->CR1 |= TIM_CR1_CEN;
 
 
  while (1) {
    
  while(!(TIM3->SR & TIM_SR_UIF));
  TIM3->SR &= ~TIM_SR_UIF;
  GPIOC->ODR = GPIO_ODR_8|!GPIO_ODR_9;
  while(!(TIM3->SR & TIM_SR_UIF));
  TIM3->SR &= ~TIM_SR_UIF;
  GPIOC->ODR = !GPIO_ODR_8|GPIO_ODR_9;

    
  }
}

Como ya os dije, la programación de estos micros no es mas complicada que a de los DSP de texas o los PIC de microchip, tan solo hay que cambiar un poco la forma de llamar a los registros, y por supuesto, su nombre. Espero que os sea útil!

No hay comentarios:

Publicar un comentario