0% encontró este documento útil (0 votos)
63 vistas35 páginas

Modulo 07 Diapo

Este documento describe la configuración de periféricos en el microcontrolador LPC4337 utilizando la librería lpcOpen. Explica que cada periférico requiere inicialización mediante una estructura de configuración específica y funciones como Chip GPIO Init. También cubre la configuración del reloj, la fpu y la unidad de control del sistema para multiplexación de pines. El proceso general implica identificar los pines requeridos, configurar su función a través de los valores correspondientes y luego inicializar el periférico asociado.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
63 vistas35 páginas

Modulo 07 Diapo

Este documento describe la configuración de periféricos en el microcontrolador LPC4337 utilizando la librería lpcOpen. Explica que cada periférico requiere inicialización mediante una estructura de configuración específica y funciones como Chip GPIO Init. También cubre la configuración del reloj, la fpu y la unidad de control del sistema para multiplexación de pines. El proceso general implica identificar los pines requeridos, configurar su función a través de los valores correspondientes y luego inicializar el periférico asociado.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Fundamentos de Programación de Sistemas Embebidos


Librerı́a lpcOpen

Mg. Ing. E. Sergio Burgos

Universidad Nacional de Entre Rı́os


Facultad de Ingenierı́a
Especialización en Sistemas Embebidos

14/09/2018

1 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Drivers LPCOpen
Hasta hace algunos años, la forma de trabajo con microcontroladores se basaba en el conocimiento
de la arquitectura y, a partir de esta se configuraban diferentes aspectos del microcontrolador
escribiendo en direcciones de memoria particular.
Si bien esta forma de trabajo sigue utilizándose en algunos casos, con el advenimiento de mi-
crocontroladores más complejos y núcleos de terceros, se ha vuelto común que los fabricantes de
microcontroladores proporcionen drivers implementados como funciones que permiten controlar
diferentes aspectos del dispositivo.
En general, para dispositivos basados en núcleos ARM, la estructura de drivers contiene dos partes:

CMSIS: (Cortex Microcontroller Software Interface Standard) conjunto de definiciones desti-


nadas al control y gestión del núcleo y sus partes.
drivers del fabricante: permite la gestión de los periféricos incorporados al núcleo.

2 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Drivers LPCOpen y la CIAA


LPC incluye en su paquete de drivers dos categorı́as. Por un lado los drivers a nivel de placa de
desarrollo para algunos modelos particulares que cuentan con kits de desarrollo y por otro lado a
nivel de chip. Dependiendo el conjunto de funciones a utilizar debe incluirse el header chip.h o
board.h.
Para trabajar con el LPC4337 el proceso de inicialización consiste en configurar la frecuencia de
reloj, iniciar la fpu y los periféricos que se desee utilizar.
La configuración del reloj puede realizarse a través de la función Chip SetupXtalClocking, la cuál
invocando a su vez a Chip SetupCoreClock realiza las siguientes tareas:
Habilita el oscilador asociado al cristal presente en la placa de la EDU-CIAA.
Establece el oscilador como fuente de reloj principal.
Configura el PLL a fin de establecer la máxima frecuencia de trabajo (204 Mhz.)

Una vez establecida la frecuencia de reloj del sistema (y siempre que esta se modifique) es con-
veniente invocar a la función SystemCoreClockUpdate, que actualiza el valor de la variable global
SystemCoreClock al valor de la frecuencia de trabajo configurada en el núcleo.

En lo que respecta a la inicialización de la fpu, se realiza invocadon a la función fpuInit(). Si


bien no es imprescindible inicializar la fpu en todas las aplicaciones, de no hacerlo, al realizar una
operación matemática utilizando operadores de punto flotante se tendrá una excepción.

3 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración de periféricos
Cada periférico presente en el lpc4337 debe ser configurado según las especificaciones de la hoja
de datos del mismo (documento UM10503.pdf).
Más allá de las opciones particulares de cada periférico, existe cierto comportamiento general.
Cada uno tiene asociada una estructura de configuración, la cuál debe ser utilizada como argu-
mento en la invocación a las diferentes funciones de configuración. El nombre de algunas de es-
tas estructuras es LPC USART0, LPC USART2, LPC TIMER0, LPC DAC, LPC ADC0, LPC GPIO PORT,
etc.
Cada periférico cuenta con una función de inicialización y de ‘des inicialización’. Por ejemplo:
Chip GPIO Init y Chip GPIO DeInit, Chip I2C Init y Chip I2C DeInit, Chip TIMER Init
y Chip TIMER DeInit, etc.

4 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración de periféricos
Cada periférico presente en el lpc4337 debe ser configurado según las especificaciones de la hoja
de datos del mismo (documento UM10503.pdf).
Más allá de las opciones particulares de cada periférico, existe cierto comportamiento general.
Cada uno tiene asociada una estructura de configuración, la cuál debe ser utilizada como argu-
mento en la invocación a las diferentes funciones de configuración. El nombre de algunas de es-
tas estructuras es LPC USART0, LPC USART2, LPC TIMER0, LPC DAC, LPC ADC0, LPC GPIO PORT,
etc.
Cada periférico cuenta con una función de inicialización y de ‘des inicialización’. Por ejemplo:
Chip GPIO Init y Chip GPIO DeInit, Chip I2C Init y Chip I2C DeInit, Chip TIMER Init
y Chip TIMER DeInit, etc.
La definición e implementación de las funciones de cada periférico se encuentran en un archivo
con el mismo nombre (gpio 18xx 43xx.c, gpio 18xx 43xx.h)

4 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración de periféricos
Cada periférico presente en el lpc4337 debe ser configurado según las especificaciones de la hoja
de datos del mismo (documento UM10503.pdf).
Más allá de las opciones particulares de cada periférico, existe cierto comportamiento general.
Cada uno tiene asociada una estructura de configuración, la cuál debe ser utilizada como argu-
mento en la invocación a las diferentes funciones de configuración. El nombre de algunas de es-
tas estructuras es LPC USART0, LPC USART2, LPC TIMER0, LPC DAC, LPC ADC0, LPC GPIO PORT,
etc.
Cada periférico cuenta con una función de inicialización y de ‘des inicialización’. Por ejemplo:
Chip GPIO Init y Chip GPIO DeInit, Chip I2C Init y Chip I2C DeInit, Chip TIMER Init
y Chip TIMER DeInit, etc.
La definición e implementación de las funciones de cada periférico se encuentran en un archivo
con el mismo nombre (gpio 18xx 43xx.c, gpio 18xx 43xx.h)

4 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

System Control Unit (SCU)


El lpc4337 cuenta con un esquema de multiplexación para los pines disponibles en el chip. Según
el tipo de periférico que se desee utilizar es necesario establecer la configuración de multiplexación
para los pines a utilizar. Este es configurado a través de la Unidad de Control del Sistema (SCU).
Los pines digitales que soportan multiplexado están organizados en 16 grupos identificados como
P0 a P9 y PA a PF, con hasta 20 pines en cada grupo.
Cada pin digital soporta a su vez hasta 8 funciones digitales diferentes.
Finalmente es importante aclarar que el nombre del grupo de pines (P0 a P9 y PA a PF) no guarda
relación con el módulo GPIO asociado.
El detalle de las funciones asociadas a cada uno de los pines del microcontrolador puede encontrarse
en los capı́tulos 16 y 17 del manual del dispositivo.

5 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
El primer paso es identificar el conexionado en el esquema de la EDU-CIAA y, a partir de este, los
números de pin asociados.

6 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
El primer paso es identificar el conexionado en el esquema de la EDU-CIAA y, a partir de este, los
números de pin asociados.

6 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
Luego, a partir de la identificación del pin a configurar, determinar el valor de configuración que se
corresponde con la función de interés.

7 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
Luego, a partir de la identificación del pin a configurar, determinar el valor de configuración que se
corresponde con la función de interés.

7 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
Luego, a partir de la identificación del pin a configurar, determinar el valor de configuración que se
corresponde con la función de interés.

7 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
La configuración de los pines de entrada salida digitales requiere establecer el modo de funciona-
miento de los pines para luego configurarlos a través del módulo GPIO.
Notar la relación entre el puerto P2 10 y el GPIO0[14].
/* E s t a b l e c e m o s la funci ó n del pin */
C hi p _S CU _ Pi nM u xS e t (0 x02 , 0 x0A , SCU_MODE_FUNC0 );

/* I n i c i a l i z a m o s el m ó dulo GPIO */
Chip_GPIO_Init ( LPC_GPIO_PORT );

/* E s t a b l e c e m o s su direcci ó n */
C h i p _ G P I O _ S e t P i n D I R O u t p u t ( LPC_GPIO_PORT , 0 , 14);

/* Ponemos la salida en 1 */
C h i p _ G P I O _ S e t P i n O u t H i g h ( LPC_GPIO_PORT , 0 , 14);

8 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
Además de establecer la configuración de multiplexación de un pin, la función Chip SCU PinMuxSet
permite establecer opciones particulares del mismo. La combinación de diferentes valores puede
establecerse utilizando el operador or (¦). Algunos valores posibles son:
SCU MODE PULLUP: habilita resistencias de pullup.
SCU MODE REPEATER: habilita resistencias de pullup y pulldown.
SCU MODE INACT: desactiva resistencias de pullup y pulldown.
SCU MODE PULLDOWN: habilita resistencias de pulldown.
SCU MODE ZIF DIS: desactiva el filtro de glitch, debe desactivarse para trabajar con frecuencias
mayores o iguales a 30 Mhz.
SCU MODE INBUFF EN: activa el buffer de entrada digital. Si un pin será configurado como
entrada digital deberá activarse. Si constituirá una entrada analógica, debe desactivarse.
SCU MODE 4MA DRIVESTR, SCU MODE 8MA DRIVESTR, SCU MODE 14MA DRIVESTR,
SCU MODE 20MA DRIVESTR: configura la corriente de salida máxima (soportado en algu-
nos pines).
SCU MODE FUNCX: establece la función de un pin. Los valores posibles de X van de 0 a 7.

9 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Configuración GPIO
En lo que respecta a las funciones de trabajo sobre los GPIO, se incorporan definiciones que permiten
configurar la dirección, realizar operaciones de escritura o lectura. Tanto a nivel de pin como a nivel
de puerto.

Un particularidad del módulo GPIO es que cuenta con un registro de enmascaramiento. Este permite
establecer, a través de la función Chip GPIO SetPortMask, un valor de máscara asociada a un puerto
particular.

Si un bit de esta máscara toma valor 0, permite realizar operaciones de lectura y escritura a través
de las funciones Chip GPIO SetMaskedPortValue y Chip GPIO GetMaskedPortValue.

Si la máscara toma valor 1, los bits correspondientes de ese puerto no serán afectados por las
operaciones de lectura y escritura anteriores. En el caso de las operaciones de lectura, los bits
enmascarados serán leı́dos como 0.

10 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones y el NVIC
El núcleo Cortex-M4, presente en el LPC4337, incorpora un controlador de interrupciones (NVIC)
a través del cual se realiza la configuración y gestión de las interrupciones.
Entre las caracterı́sticas que incorpora se encuentran:
Capacidad para gestionar hasta 240 interrupciones.
Asignación de prioridades de 0 a 255 a cada interrupción (0 mayor prioridad - 255 menor
prioridad).
Configuración de disparo por nivel o flanco.
Desde el punto de vista del procesador, al dispararse una interrupción, automáticamente se guarda
su estado en el stack, restableciéndose al momento de finalizar la rutina asociada al procesamiento
de la misma.

11 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones y el NVIC
En lo que respecta a la configuración del controlador de interrupciones, este puede gestionarse
ya sea a través del acceso directo a los registros de configuración o a través de las funciones
incorporadas en CMSIS.
void NVIC EnableIRQ(IRQn Type IRQn) y void NVIC DisableIRQ(IRQn Type IRQn)
Habilitan y deshabilitan una interrupción. El argumento es el número de interrupción de interés.
La primer interrupción asociada a un periférico es la 0 y la cantidad depende del fabricante del
microcontrolador. Las identificaciones de -14 a -1 corresponden con excepciones del núcleo.
uint32 t NVIC GetPendingIRQ(IRQn Type IRQn)
Permite saber si una interrupción o excepción se encuentra pendiente de ser atendida.
void NVIC ClearPendingIRQ(IRQn Type IRQn) y void NVIC SetPendingIRQ(IRQn Type
IRQn)
Permiten establecer o eliminar el indicador de estado de una interrupción.
void NVIC SetPriority(IRQn Type IRQn, uint32 t priority) y
uint32 t NVIC GetPriority(IRQn Type IRQn)
Permiten establecer o acceder a la prioridad configurada para una interrupción o excepción.

12 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Excepciones en Cortex-M4
El vector de interrupciones contiene en las primeras 15 posiciones, direcciones asociadas a las
excepciones del núcleo. Algunas de ellas son de uso reservado. Para el núcleo Cortex-M4 estas
excepciones son:
Reset: rutina inicialización.
NMI: excepción no enmascarable.
HardFault: se genera ante un error durante el procesamiento de una excepción.
MemManage: asociada a un error de protección de memoria.
BusFault: se origina al detectar un error en el bus de memoria del sistema. Se puede originar
debido errores al ejecutar una instrucción o transacción sobre el área de memoria de datos.
UsageFault: está asociada a errores durante la ejecución de instrucciones. Puede producirse
ante la ejecución de instrucciones indefinidas.
SVCall: Supervisor Call, se produce al ejecutarse la instrucción SVC
PendSV: disparada a través del NVIC, suele utilizar para la realización de cambios de contexto
o para la separación del procesamiento de ISR.
SysTick: se dispara cuando el módulo SysTick alcanza el valor cero.

13 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

ISR e interrupciones
El vector de interrupciones se configura inicializando cada una de sus posiciones con la dirección
de memoria de una función (startUp.c). Las excepciones del núcleo asociadas a las primeras 14
posiciones suelen tener implementaciones particulares pero se las define utilizando el atributo weak
(débil).

En el compilador GCC, una sı́mbolo definido como débil será automáticamente sobre escrito si se
encuentra otro sı́mbolo con el mismo nombre. Por esto, si se inicializa el vector de interrupciones
utilizando como nombre de ISR asociada al SysTick el identificador SysTick Handler, de encon-
trarse una función con este nombre en otro archivo, se utilizará la nueva definición en vez de la
débil.

Las ISR asociadas a los periféricos suelen vincularse a una única función. De modo similar al
caso anterior se utiliza la directiva weak pero junto a alias. El conjunto logra que se cree una
definición débil de una función y vincularla a través del alias con una implementación real. Al igual
que en el caso anterior, el sı́mbolo definido de este modo será sobre escrito si se encuentra una
implementación con el mismo nombre en otro archivo.

14 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones y GPIO
Los periféricos que soportan el uso de interrupciones se encuentran conectados al NVIC. En función
del tipo de periférico son los orı́genes de interrupciones que puede generar.
Para el caso del módulo GPIO, puede configurarse para generar dos tipos de interrupciones:
Interrupciones basadas en el estado de pines
Se pueden configurar hasta 8 pines pertenecientes a diferentes puertos como disparadores de
interrupciones. Cada uno configurado por nivel o flanco y se encuentra asociado a una ISR
diferente.
Interrupciones basadas en el estado de grupos de pines
Permite configurar pines de diferentes puertos asociados a un grupo para generar una única
interrupción. Es posible configurar el disparo de la interrupción cuando todos los pines del
conjunto han sido excitados o solo uno. Pueden definirse dos grupos.

15 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones y GPIO
Los periféricos que soportan el uso de interrupciones se encuentran conectados al NVIC. En función
del tipo de periférico son los orı́genes de interrupciones que puede generar.
Para el caso del módulo GPIO, puede configurarse para generar dos tipos de interrupciones:
Interrupciones basadas en el estado de pines
Se pueden configurar hasta 8 pines pertenecientes a diferentes puertos como disparadores de
interrupciones. Cada uno configurado por nivel o flanco y se encuentra asociado a una ISR
diferente.
Interrupciones basadas en el estado de grupos de pines
Permite configurar pines de diferentes puertos asociados a un grupo para generar una única
interrupción. Es posible configurar el disparo de la interrupción cuando todos los pines del
conjunto han sido excitados o solo uno. Pueden definirse dos grupos.

15 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones basadas en el estado de pines


# include " chip . h " Chip_GPIO_Init ( LPC_GPIO_PORT );
Chip_PININT_Init ( LPC_GPIO_PIN_INT );
const uint32_t ExtRateIn = 0;
const uint32_t OscRateIn = 12000000; /* GPIO0 [4] */
Chip_GPIO_SetPinDIRInput (
void G P I O 0 _ IRQHandler ( void ) LPC_GPIO_PORT , 0 , 4);
{
/* C ó digo de p r o c e s a m i e n t o */ C h i p _ S C U _ G P I O I n t P i n S e l (0 , 0 , 4);
Chip_PININT_ClearIntStatus (
LPC_GPIO_PIN_INT , Chip_PININT_ClearIntStatus (
PININTCH (0)); LPC_GPIO_PIN_INT , PININTCH (0));
}
Chip_PININT_SetPinModeEdge (
int main ( void ) LPC_GPIO_PIN_INT , PININTCH (0));
{
C h i p _ S e t u p X t a l C l o c k i n g (); Chip_PININT_EnableIntLow (
S y s t e m C o r e C l o c k U p d a t e (); LPC_GPIO_PIN_INT , PININTCH (0));
fpuInit ();
/* Key1 GPIO0 [4] */ N V I C _ C l e a r P e n d i n g I R Q ( PIN_INT0_IRQn );
C h i p _ S C U _ Pi nM u xS e t (0 x01 , 0 x00 ,
SCU_M ODE_INACT | NVIC_EnableIRQ ( PIN_INT0_IRQn );
SCU_M ODE_FUNC0 |
S C U _ M O D E _ IN B UF F_ E N ); while (1){
__WFI ();
}
return 0;
}

16 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Interrupciones basadas en grupos


# include " chip . h " Chip_GPIO_SetPinDIRInput (
const uint32_t ExtRateIn = 0; LPC_GPIO_PORT , 0 , 8);
const uint32_t OscRateIn = 12000000;
Chip_GPIOGP_SelectLowLevel (
void G I N T 0 _ IRQHandler ( void ){ LPC_GPIOGROUP , 0 , 0 , 4);
/* C ó digo de p r o c e s a m i e n t o */ Chip_GPIOGP_SelectLowLevel (
Chip_GPIOGP_ClearIntStatus ( LPC_GPIOGROUP , 0 , 0 , 8);
LPC_GPIOGROUP , 0);
} Chip_GPIOGP_EnableGroupPins (
LPC_GPIOGROUP , 0 , 0 , 1 << 4);
int main ( void ) Chip_GPIOGP_EnableGroupPins (
{ LPC_GPIOGROUP , 0 , 0 , 1 << 8);
C h i p _ S e t u p X t a l C l o c k i n g ();
S y s t e m C o r e C l o c k U p d a t e (); /* C u a l q u i e r pin del grupo */
fpuInit (); Chip_GPIOGP_SelectAndMode (
/* Key1 GPIO0 [4] */ LPC_GPIOGROUP , 0);
C h i p _ S C U _ Pi nM u xS e t (0 x01 , 0 x00 ,
SCU_M ODE_INACT | Chip_GPIOGP_SelectEdgeMode (
SCU_M ODE_FUNC0 | LPC_GPIOGROUP , 0);
S C U _ M O D E _ IN B UF F_ E N ); NVIC_ClearPendingIRQ (
/* Key2 GPIO0 [8] */ GINT0_IRQn );
C h i p _ S C U _ Pi nM u xS e t (0 x01 , 0 x01 , NVIC_EnableIRQ ( GINT0_IRQn );
SCU_M ODE_INACT |
SCU_M ODE_FUNC0 | while (1);
S C U _ M O D E _ IN B UF F_ E N ); return 0;
}
Chip _GPIO_Init ( LPC_GPIO_PORT );
Chip_GPIO_SetPinDIRInput (
LPC_GPIO_PORT , 0 , 4);

17 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Gestión de tiempo
Existen diferentes formas de trabajo en lo que a medición de tiempo y retardos se refiere. En el
caso de la CIAA podemos utilizar:
SysTick: módulo incorporado en el núcleo Cortex-M4. Permite establecer un valor de cuenta,
disparando una interrupción cada vez que se alcanza el valor cero. También es posible acceder
al registro de cuenta.

Timers: el microcontrolador LPC4337 incorpora 4 timers que pueden utilizarse utilizando


interrupciones o configurarse para acceder al valor de los contadores.

stopwatch: librerı́a incorporada en lpcOpen, permite generar retardos (delays) de diferentes


órdenes de magnitud. Utiliza el módulo timer0

18 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

SysTick
Las estructuras de control del SysTick son proporcionadas por la librerı́a CMSIS. Incorpora una
función y la declaración de una estructura para el acceso al valor de sus registros.

La función SysTick Config toma como argumento el valor de carga automática que utilizará el reloj
expresado en ciclos de reloj (ticks). Esta función también habilita la interrupción asociada e inicia
el ciclo de cuenta decremental. Cada vez que se alcanza el valor cero se disparará la interrupción
asociada y se cargará nuevamente con el valor configurado. Es importante considerar que el registro
de carga tiene un tamaño de 24 bits, lo que limita el valor de inicialización.

En lo que respecta a la estructura SysTick ha sido definida como:


typedef struct
{
__IO uint32_t CTRL ; /* ! < (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD ; /* ! < (R/W) SysTick Reload Value Register */
__IO uint32_t VAL ; /* ! < (R/W) SysTick Current Value Register */
__I uint32_t CALIB ; /* ! < (R/ ) SysTick C a l i b r a t i o n Register */
} SysTick_Type ;

Una vez configurado, el SysTick generará interrupciones hasta que se lo detenga. Para esto es
necesario modificar su registro de control:
SysTick->CTRL = SysTick->CTRL & (~SysTick CTRL ENABLE Msk);

19 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

SysTick

# include " chip . h " S y s t e m C o r e C l o c k U p d a t e ();


fpuInit ();
const uint32_t ExtRateIn = 0;
const uint32_t OscRateIn = 12000000; /* P2 [11] -> GPIO1 [11] */
C hi p_ S CU _ Pi nM u x S e t (0 x02 ,
uint32_t cnt = 0; 0 x0B ,
SCU_MODE_INAC T | SCU_MODE_FUNC0 );
void Sy s Ti ck_Handler ( void )
{ Chip_GPIO_Init ( LPC_GPIO_PORT );
cnt ++;
cnt = cnt % 1000; Chip_GPIO_SetPinDIROutput (
if (( cnt % 200) == 0) LPC_GPIO_PORT , 1 , 11);
C h i p _ G P I O _ S e t P i n T o g g l e ( LPC_GPIO_PORT , Chip_GPIO_SetPinOutLow (
1 , 11); LPC_GPIO_PORT , 1 , 11);
}
SysTick_Config ( SystemCoreClock / 1000);
int main ( void )
{ while (1)
C h i p _ S e t u p X t a l C l o c k i n g (); {
__WFI ();
}
return 0;
}

20 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

stopwatch
Utiliza el timer0 para generar tiempos muertos. Una vez inicializada es posible llamar diferentes fun-
ciones determinar el tiempo transcurrido o generar retardos. Algunas de las funciones que incorpora
son:
void StopWatch Init(void)
Inicializa la librerı́a, configurando el timer utilizado. Debe ser invocada previa a cualquier otra
llamada de la librerı́a.
void StopWatch DelayUs(uint32 t uS)
Detiene la ejecución de la aplicación durante la cantidad de micro segundos indicados como
argumento.
void StopWatch DelayMs(uint32 t mS)
Detiene la ejecución de la aplicación durante la cantidad indicada de milisegundos.
uint32 t StopWatch Start(void)
Retorna el valor actual del contador asociado al timer utilizado.
uint32 t StopWatch Elapsed(uint32 t startTime)
Retorna la cantidad de ticks que han pasado entre el valor actual del contador y el argumento
dado.

21 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

USART y UART
Se incorporan 3 módulos USART (0, 2 y 3) y 1 módulo UART (1), este último con incluye lı́neas
de señalización full modem y soporte RS485.
Caracterı́sticas USART:
FIFO de 16 bytes, configurable para generar disparos con diferentes niveles de almacenamiento
(1, 4, 8 y 14 bytes).
En modo UART permite generar lı́neas de control por software.
Modos RS-485/EIA-485 de 9 bit con habilitación de salida.
IrDA en USART3.
Soporte de DMA.
Modo auto baud rate.
En la EDU-CIAA NXP el módulo USART2 está conectado al FT2232, por lo que puede ser accedido
como un puerto serie virtual a través del puerto USB.

22 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

USART - Configuración y uso

# include " chip . h " Chip_UART_Init ( LPC_USART2 );


# include " stopwatch . h "
C h i p _ U A R T _ C o n f i g D a t a ( LPC_USART2 ,
const uint32_t ExtRateIn = 0; UART_LCR_WLEN8 | U ART _LC R_SB S_1 BIT |
const uint32_t OscRateIn = 12000000; U A R T _ LC R _ P A R I T Y _D I S );

int main ( void ) Ch ip_ UART _Se tBa ud ( LPC_USART2 , 115200);


{ C hi p_ U AR T _T XE n ab l e ( LPC_USART2 );
C h i p _ S e t u p X t a l C l o c k i n g ();
S y s t e m C o r e C l o c k U p d a t e (); while (1)
fpuInit (); {
Stop Watch_Init (); C h i p _ U A R T _ S e n d B l o c k i n g ( LPC_USART2 ,
" Hola !\ n \ r " , 7);
C h i p _ S C U _ Pi nM u xS e t (7 , 1 , St opWa tch _De l ay Ms (1000);
S C U _ M O D E_ PUL LDO WN | SCU_MODE_FUNC6 ); }
return 0;
C h i p _ S C U _ Pi nM u xS e t (7 , 2 , }
SCU_M ODE_INACT | SC U _M OD E _I NB U FF _ EN |
S C U _ M O D E_ZIF_DIS | SCU_MODE_FUNC6 );

23 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

USART - configuración y uso

# include " chip . h " Ch ip_ UART _Se tBa ud ( LPC_USART2 , 115200);
# include < string .h > C hi p_ U AR T _T XE n a b l e ( LPC_USART2 );

# define LINELEN 100 while (1){


C h i p _ U A R T _ R e a d B l o c k i n g ( LPC_USART2 ,
const uint32_t ExtRateIn = 0; & buff , 1);
const uint32_t OscRateIn = 12000000; if ( buff == '\ r ' ){
line [ pos ]= ' \0 ';
int main ( void ) C h i p _ U A R T _ S e n d B l o c k i n g ( LPC_USART2 ,
{ " \ n \ rRx : " , 6);
unsigned char buff ; C h i p _ U A R T _ S e n d B l o c k i n g ( LPC_USART2 ,
unsigned char line [ LINELEN ]; line , strlen ( line ));
unsigned int pos = 0; C h i p _ U A R T _ S e n d B l o c k i n g ( LPC_USART2 ,
C h i p _ S e t u p X t a l C l o c k i n g (); " \ n \ r " , 2);
S y s t e m C o r e C l o c k U p d a t e (); pos = 0;
fpuInit (); }
else {
C h i p _ S C U _ Pi nM u xS e t (7 , 1 , /* Eco */
S C U _ M O D E_ PUL LDO WN | SCU_MODE_FUNC6 ); C h i p _ U A R T _ S e n d B l o c k i n g ( LPC_USART2 ,
C h i p _ S C U _ Pi nM u xS e t (7 , 2 , & buff , 1);
SCU_M ODE_INACT | SC U _M OD E _I NB U FF _ EN | line [ pos ] = buff ;
S C U _ M O D E_ZIF_DIS | SCU_MODE_FUNC6 ); pos ++;
Chip _UART_Init ( LPC_USART2 ); pos = pos % LINELEN ;
C h i p _ U A R T _ C o n f i g D a t a ( LPC_USART2 , }
UART_ LCR_WLEN8 | U ART _LC R_SB S_1 BIT | }
U A R T _ L C R _ P A R I T Y _D I S ); return 0;
}

24 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

USART - configuración e ISR


# include " chip . h " Chip_GPIO_SetPinOutLow (
# include " stopwatch . h " LPC_GPIO_PORT , 1 , 11);

const uint32_t ExtRateIn = 0; C hi p_ S CU _ Pi nM u xS e t (7 , 1 ,


const uint32_t OscRateIn = 12000000; SC U_MO DE_ PUL LDO WN |
SCU_MODE_FUNC6 );
void U A R T 2 _ IRQHandler ( void ) C hi p_ S CU _ Pi nM u xS e t (7 , 2 ,
{ SCU_MODE_INACT | SC U _M OD E _I NB U FF _ EN |
uint8_t data ; SCU_MODE_ZIF_DIS | SCU_MODE_FUNC6 );
data = C h i p_ U AR T_ R ea d By te ( LPC_USART2 );
/* P r o c e s a m i e n t o de ' data ' */ Chip_UART_Init ( LPC_USART2 );
} C h i p _ U A R T _ C o n f i g D a t a ( LPC_USART2 ,
UART_LCR_WLEN8 | U ART _LC R_SB S_1 BIT |
int main ( void ) U A R T _ LC R _ P A R I T Y _D I S );
{ Ch ip_ UART _Se tBa ud ( LPC_USART2 ,
C h i p _ S e t u p X t a l C l o c k i n g (); 115200);
S y s t e m C o r e C l o c k U p d a t e ();
fpuInit (); C h i p _U A R T _ I n t E n a b l e ( LPC_USART2 ,
Stop Watch_Init (); UART_IER_RBRINT );
NVIC_EnableIRQ ( USART2_IRQn );
/* Led2 -> P2_11 GPIO1 [11] */ C hi p_ U AR T _T XE n ab l e ( LPC_USART2 );
C h i p _ S C U _ Pi nM u xS e t (0 x02 ,
0 x0B , SCU_MODE_INACT | while (1){
SCU_M ODE_FUNC0 ); St opWa tch _De lay Ms (300);
Chip_GPIO_SetPinToggle (
Chip _GPIO_Init ( LPC_GPIO_PORT ); LPC_GPIO_PORT , 1 , 11);
Chip_GPIO_SetPinDIROutput ( }
LPC_GPIO_PORT , 1 , 11); return 0;
}

25 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Buffer circulares
La comunicación con dispositivos externos en sistemas embebidos, por ejemplo a través de un
módulo USART, es un medio pero no un fin. El sistema se diseña para la realización de una
tarea y además se soportan comunicaciones de diferente tipo, por lo que no es una alternativa de
implementación válida centrar el diseño de la aplicación a partir de las comunicaciones.
El uso de la memoria FIFO asociada a la USART puede ser una solución pero solo cubre el caso
en el que se acumule hasta 16 bytes.
Una solución más general es el uso de colas
circulares, estas agregan información de forma
cı́clica en un extremo mientras la quitan desde
el otro.
La librerı́a lpcOpen incorpora una implementa-
ción de colas circulares, entre sus caracterı́sticas
se encuentran:
Almacenamiento estático basado en vecto-
res.
Tamaño de los elementos configurable.
Posibilidad de agregar y quitar un elemento
o varios en una sola operación.

26 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

Colas circulares
En la implementación provista por lpcOpen, cada cola circular se encontrará asociada a dos varia-
bles. Por un lado tendremos una variable de tipo RINGBUFF T, la cuál contiene los datos significativos
respecto del estado y configuración del buffer.

Por otro, un arreglo de tantos elementos como se deseen, que contendrá la información del buffer
circular. No existe restricción respecto del tamaño que puede contener cada elemento en el buffer,
pero si se debe guardar consistencia en la configuración de modo que la cantidad de elementos
esté acorde al tamaño del arreglo.

27 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

USART y ring buffer


/* include " chip . h " y " s t o p w a t c h . h " */ C hi p_ S CU _ Pi nM u xS e t (7 , 2 ,
SCU_MODE_INACT | SC U _M OD E _I N BU FF _ EN |
# define BUFFLEN 128 SCU_MODE_ZIF_DI S | SCU_MODE_FUNC6 );
Chip_UART_Init ( LPC_USART2 );
RINGBUFF_T rbTx , rbRx ; C h i p _ U A R T _ C o n f i g D a t a ( LPC_USART2 ,
uint8_t txBuff [ BUFFLEN ] , rxBuff [ BUFFLEN ]; UART_LCR_WLEN8 | U ART _LC R_SB S_1 BIT |
U A R T _ LC R _ P A R I T Y _D I S );
void U A R T 2 _ I RQHandler ( void ){ Ch ip_ UAR T_Se tBa ud ( LPC_USART2 , 115200);
C h i p _ U A R T _ I R Q R B H a n d l e r ( LPC_USART2 , C h i p _ U A R T _ S e t u p F I F O S ( LPC_USART2 ,
& rbRx , & rbTx ); ( UART_FCR_FIFO_ EN | UART_FCR_RX_RS |
} UART_FCR_TX_RS | U ART _FC R_T RG_ LEV3 ));
int main ( void ){ C h i p _U A R T _ I n t E na b l e ( LPC_USART2 ,
unsigned char txt [] = " Hola mundo ! " ; ( UART_IER_RBRINT | UART_IER_RLSINT ));
unsigned char rxData ; NVIC_EnableIRQ ( USART2_IRQn );
C h i p _ S e t u p X t a l C l o c k i n g (); C hi p_ U AR T _T XE n ab l e ( LPC_USART2 );
S y s t e m C o r e C l o c k U p d a t e (); Chip_UART_SendRB ( LPC_USART2 , & rbTx ,
Stop Watch_Init (); txt , strlen ( txt ));
while (1){
C h i p _ S C U _ P i nM u xS e t (0 x02 , 0 x0B , St opW atch _De lay Ms (300);
S CU _M OD E _PULLUP | SCU_MODE_FUNC0 ); Chip_GPIO_SetPinToggle (
Chip _GPIO_Init ( LPC_GPIO_PORT ); LPC_GPIO_PORT , 1 , 11);
Chip_GPIO_SetPinDIROutput ( while ( Chip_UART _ReadRB ( LPC_USART2 ,
LPC_GPIO_PORT , 1 , 11); & rbRx , & rxData , 1) == 1)
Chip_GPIO_SetPinOutLow ( Chip_UART_Sen dRB ( LPC_USART2 ,
LPC_GPIO_PORT , 1 , 11); & rbTx , & rxData , 1);
R in gB uf f er _Init (& rbRx , rxBuff ,1 , BUFFLEN ); }
R in gB uf f er _Init (& rbTx , txBuff ,1 , BUFFLEN ); return 0;
C h i p _ S C U _ P i nM u xS e t (7 , 1 , }
S C U _ M O D E _ PUL LDO WN | SCU_MODE_FUNC6 );

28 / 28 Drivers, lpcOpen y periféricos


Drivers LPC Open Configuración de periféricos Configuración GPIO Interrupciones y GPIO Tiempo UART

28 / 28 Drivers, lpcOpen y periféricos

También podría gustarte