Ejemplos SysTick PSoC 4 y PSoC 5LP

El uso del SysTick en PSoC 4 y PSoC 5LP es muy similar, solo cambian algunos defines los cuales son utiles para saber la frecuencia del clock del sistema. Para PSoC 5LP son:
  • BCLK__BUS_CLK__HZ 
  • BCLK__BUS_CLK__KHZ
  • BCLK__BUS_CLK__MHZ
 y para el PSoC 4:
  • CYDEV_BLCK__HFCLK__HZ
  • CYDEV_BLCK__HFCLK__KHZ
  • CYDEV_BLCK__HFCLK__MHZ 
  • CYDEV_BLCK__SYSCLK__HZ
  • CYDEV_BLCK__SYSCLK__KHZ
  • CYDEV_BLCK__SYSCLK__MHZ
Vamos a hacer el mismo ejemplo para cada familia de PSoC, el tipico led que parpadea.

PSoC 4

Comenzamos con el PSoC 4, con la tarjeta CY8CKIT-042. Esta tarjeta tiene un LED RGB, el LED rojo en el pin P1[6], el LED azul en el P0[3] y el LED verde en P0[2], hay que recordar que estos pines encienden con un cero logico. Comenzamos creando un nuevo proyecto para la CY8CKIT-042, luego un Workspace y proyecto nuevo, yo nombrare el Workspace como SysTick_test y al proyecto lo nombrare SysTick_4.

Colocamos en el esquematico dos pines de salida digital, los ocuparemos para manejar los LEDs rojo y azul de la tarjeta, los configuramos uno con el nombre LEDrojo, deshabilitamos la conexión por HW (hardware) y el estado inicial con un cero logico para que al arrancar el programa este encendido el LED:

Configuración del LEDrojo
Y el otro con el nombre LEDazul, tambien deshabilitamos la conexión por HW y con estado inicial en uno logico:
Configuración del LEDazul
Abrimos el .cydwr y asignamos el pin LEDrojo al pin P1[6] y el LEDazul al P0[3]:

Asignación de pines
Y generamos la aplicación (en este paso se generan las API, sin compilar, nos ahorramos un poco te tiempo):
Generamos las API
Ya terminado este paso nos vamos al main.c y escribimos el siguiente código:
#include 

/* Declaramos las funciones que vamos a ejecutar en la interrución del SysTick */
void LED(void); /* Togglea el LEDrojo */
void LED_B(void); /* Togglea el LEDazul */

/* CYDEV_BCLK__SYSCLK__HZ: Macro que nos indica a que velocidad esta corriendo el CPU */
/* Esta interrupcion se ejecuta cada 100 ms
*  CYDEV_BCLK__SYSCLK__HZ = 24 000 000 Hz
*  se tarda un segundo para dar 24 000 000 ciclos, por lo tanto, si lo dividimos entre 10
*  nos tardaremos 100 ms para dar 2 400 000 ciclos o cuentas en el contador del SysTick
*  Con el reloj a 24MHz el tiempo maximo que puede tardar el SysTick en generar una interrupción
*  es de aprox. 0.7 s, ya que la cuenta maxima del SysTick es de 0xFFFFFF
*/
#define SYSTICK_RELOAD      ( CYDEV_BCLK__SYSCLK__HZ / 10 )

int main(){
    
    CySysTickStart();
    
    /* Configuramos el Reload del Systick */
    CySysTickSetReload(SYSTICK_RELOAD);
    
    /* Asignamos posiciones a las funciones */
    CySysTickSetCallback(0, LED);
    CySysTickSetCallback(1, LED_B);
    
    CySysTickClear();
    
    CyGlobalIntEnable;

    for(;;){
    }
}

void LED(void){
    RED_Write(~RED_Read());
}

void LED_B(void){
    BLUE_Write(~BLUE_Read());
}

/* [] END OF FILE */


La tarjeta deberá prender el LEDrojo al mismo tiempo que apaga el LEDazul y viceversa.


PSoC 5LP

Esta tarjeta tiene un led en el pin P2[1]. Comenzamos creando proyecto nuevo dentro del Workspace que ya tenemos, al proyecto lo nombrare SysTick_5LP.

Colocamos en el esquematico un pin de salida digital, lo ocuparemos para manejar el led de la tarjeta, lo configuramos con el nombre LED y deshabilitamos la conexión por HW (hardware):
Configuración del LED
Abrimos el .cydwr y asignamos el pin LED al pin P2[1]:

Asignación del LED al pin P2[1]
Y generamos las API:
Generamos las API
 El main será un poco diferente al del proyecto con el PSoC4, solo cambia un define y el tiempo en el que va a togglear el LED será de 250 ms en lugar de los 100 ms:

#include 

/* Declaramos la funcion que vamos a ejecutar en la interrución del SysTick */
void LED(void); /* Togglea el LED */

/* CYDEV_BCLK__SYSCLK__HZ: Macro que nos indica a que velocidad esta corriendo el CPU */
/* Esta interrupcion se ejecuta cada 250 ms
*  BCLK__BUS_CLK__HZ = 24 000 000 Hz
*  se tarda un segundo para dar 24 000 000 ciclos, por lo tanto, si lo dividimos entre 4
*  nos tardaremos 250 ms para dar 6 000 000 ciclos o cuentas en el contador del SysTick
*  Con el reloj a 24MHz el tiempo maximo que puede tardar el SysTick en generar una interrupción
*  es de aprox. 0.7 s, ya que la cuenta maxima del SysTick es de 0xFFFFFF
*/
#define SYSTICK_RELOAD      ( BCLK__BUS_CLK__HZ / 4 )

int main(){
    
    CySysTickStart();
    
    /* Configuramos el Reload del Systick */
    CySysTickSetReload(SYSTICK_RELOAD);
    
    /* Asignamos posiciones a las funciones */
    CySysTickSetCallback(0, LED);
    
    CySysTickClear();
    
    CyGlobalIntEnable;

    for(;;){
    }
}

void LED(void){
    LED_Write(~LED_Read());
}

/* [] END OF FILE */


Y esto es lo indispensable para comenzar a usar el SysTick timer y usar los timers basados en UDBs en cosas mas criticas!!!
El proyecto esta en el siguiente repositorio de GitHub: PSoC_SysTick

Comentarios

  1. Carlos hombre muchas gracias fue muy útil la información, quería preguntarte dos cosas la primera CySysTickSetCallback(0, LED); esta función el cero es la prioridad de interrupción?
    y la segunda es que veo que tienes conocimiento acerca de ARM y estoy intentando incursionar en este tema hasta ahora de casualidad conoces libros o documentación que me puedas recomendar para poder empezar, eso era todo y te repito muchas gracias por la información en realidad es muy útil.

    ResponderBorrar
    Respuestas
    1. Como va Jhoan, creo recordar que todos los callbacks se ejecutan al mismo tiempo, ahi nada mas estamos poniendo la funcion en un array de funciones y supongo que el 0 es la posicion que ocupa la funcion en dicho array.
      Y sobre ARM igual voy comenzando, la documentación que leo son los manuales que publica ARM en este link: http://infocenter.arm.com/help/index.jsp, dejeme su mail y le mando algunos libros.

      Saludos

      Borrar

Publicar un comentario

Entradas más populares de este blog

PSoC Creator Tools

PSoC5LP Usando el SAR ADC y la señal EoS para manejar una LUT