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.
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 */
#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_ */
#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,WHITE} color;
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_ */
#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,WHITE} color;
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]);
}
#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
*****************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include "fsl_lptmr_driver.h"
/******************************************************************************
* Codigo
*****************************************************************************/
void LPTMR0_IRQHandler(void)
{
LPTMR_DRV_IRQHandler(0U);
}
/******************************************************************************
* EOF
*****************************************************************************/
No hay comentarios:
Publicar un comentario