martes, 8 de septiembre de 2015

LPTMR con MQX KDS 3.0 SDK 1.2 con Eventos

Objetivo


Realizar la coordinación del encendido del LED RGB  en sus colores rojo, verde y azul, utilizando el LPTMR (Low Power Timer).


Descripción del Programa


El contenido de la práctica, se describe a continuación:

El programa principal (main.c) enlista, mediante una estructura, las tareas que desarrollará el mismo. En este caso, se tiene una sola tarea principal. Dicha tarea tiene la función de crear el evento, inicializar los pines a utilizar (LEDs) mediante la instrucción GPIO_DRV_Init(switchPins,ledPins); así también, se crea la estructura de configuración de inicio del LPTMR y establecer sus valores iniciales, definiendo tanto el periodo del timer como la función de regreso del mismo. Una vez realizado esto, se comienza el conteo del timer. En el lazo infinito, se espera por el la bandera del evento, contando las veces que se realiza dicha acción y también se llama a la función enciende el LED del color correspondiente y se imprime dicho color.

El archivo main.h se definen constantes que se utilizaran en la ejecución del programa.

El archivo LED_RGB.h contiene la enumeración de los colores que se utilizarán para el encendido del LED. Además contiene el protocolo de las funciones para el encendido del LED y la impresión del color correspondiente.

El archivo LED_RGB.c realiza, de acuerdo al valor del color deseado, encender la combinación de LEDs correspondiente para generar el color deseado. Así mismo, permite la impresión del color correspondiente.

El archivo fsl_lptmr_irq.c es el archivo propio de la solicitud de interrupción del Low Power Timer, que contiene la instrucción de manejo de la interrupción.

Códigos del Programa


-   main.c


#include <stdio.h>
#include <mqx.h>
#include <bsp.h>
#include <fsl_interrupt_manager.h>
#include "LED_RGB.h"
#include"lwevent.h"
#include "fsl_lptmr_driver.h"

#define EVENT_COUNTER 1
#define MAIN_TASK 10
#define LPTMR_INSTANCE 0U

static lptmr_state_t gLPTMRState;

void main_task(uint32_t initial_data);
void lptmr_isr_callback(void);

volatile uint32_t lptmrCounter=0;

LWEVENT_STRUCT lwevent;

const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
{
   /* Indice de la Tarea, Funcion, Stack, Prioridad, Nombre, Atributos, Parametro, Fraccion de tiempo */
    { MAIN_TASK,  main_task, 1000,  8,  "Main",   MQX_AUTO_START_TASK, 0,     0 },
    { 0 }
};


/*ISR*-----------------------------------------------------------
*
* Nombre de la ISR : new_tick_isr
* Comentarios : Rutina de interrupciónpara demostrar la funcionalidad de 
*                 _int_install_isr
*END*-----------------------------------------------------------*/
  

void lptmr_isr_callback(void)
{
    lptmrCounter++;
    _lwevent_set(&lwevent,EVENT_COUNTER);
}

/*TASK*----------------------------------------------------------
*
* Nombre de la tarea : main_task
* Comentarios  :
*   Esta tarea demuestra la instalacion de interrupciones en MQX.
*END*-----------------------------------------------------------*/

void main_task(uint32_t initial_data)
{

    lptmr_state_t lptmrState;
    uint32_t      currentCounter = 0;

    _lwevent_create(&lwevent,LWEVENT_AUTO_CLEAR);

    GPIO_DRV_Init(switchPins,ledPins);

    lptmr_user_config_t lptmrUserConfig =
        {
            .timerMode            = kLptmrTimerModeTimeCounter, /*! Usar LPTMR en modo Time Counter*/
            .freeRunningEnable    = false, 
            .prescalerEnable      = false, 
            .prescalerClockSource = kClockLptmrSrcLpoClk, /*! usar Reloj Low Power 1kHz*/
            .isInterruptEnabled   = true
        };

    // Inicialización de hardware.
    hardware_init();

    // Initialización del LPTMR
    LPTMR_DRV_Init(LPTMR_INSTANCE, &lptmrState, &lptmrUserConfig);

    // Configurar el periodo del timer en 1 segundo
    LPTMR_DRV_SetTimerPeriodUs(LPTMR_INSTANCE,1000000);

    // Especificación de la función de regreso cuando una interrupción del LPTMR ocurre
    LPTMR_DRV_InstallCallback(LPTMR_INSTANCE,lptmr_isr_callback);

    printf("Low Power Timer Example\n\r");

    // Empieza el conteo
    LPTMR_DRV_Start(LPTMR_INSTANCE);

    while(TRUE)
    {
       _lwevent_wait_for(&lwevent,EVENT_COUNTER,FALSE,NULL);
       currentCounter = lptmrCounter;
       printf("LPTMR interrupt No.%d \r\n",currentCounter);
       printf_color(lptmrCounter&0x7);
       led(lptmrCounter&0x7);
    }
    _task_block();
}

/* EOF */

-   main.h


#ifndef SOURCES_MAIN_H_
#define SOURCES_MAIN_H_

#define EVENT_COUNTER 1
#define MAIN_TASK 10
#define BOARD_PIT_INSTANCE  0 

#endif /* SOURCES_MAIN_H_ */


-   LED_RGB.h


#ifndef LED_RGB_H_
#define LED_RGB_H_

#define SIZE_ARR 8
typedef char string[SIZE_ARR];

typedef enum {BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITEcolor;
enum bits{B0=1,B1=2,B2=4,B3=8,B4=0X10,B5=0X20,B6=0X40,B7=0X80};

void led(color);
void printf_color(color dato);
#endif /* LED_RGB_H_ */

-   LED_RGB.c


#include "LED_RGB.h"
#include <bsp.h>
#include <stdio.h>

void led(color dato)
{
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_RED,!(dato&B0));
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_GREEN,!(dato&B1));
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_BLUE,!(dato&B2));
}

void printf_color(color dato)
{
       string color_names[]={"Black","Red","Green","Yellow","Blue","Magenta","Cyan","White"};

       printf("%s\n",color_names[dato]);
}



-   fsl_lptmr_irq.c


#include <stdint.h>
#include <stdbool.h>
#include "fsl_lptmr_driver.h"

/******************************************************************************
 * Codigo
 *****************************************************************************/

void LPTMR0_IRQHandler(void)
{
    LPTMR_DRV_IRQHandler(0U);
}

/******************************************************************************
 * EOF
 *****************************************************************************/


Refencias


Manual de microcontroladores de la serie K64:


Para conocer el curso completo de Essentials Course of MQX, visita la página:

No hay comentarios:

Publicar un comentario