Está en la página 1de 9

Sistemas Embebidos y Laboratorio

Prácticas de Laboratorio

Curso de Sistemas Embebidos


Código Curso: 2504944 – 2547023
Práctica de laboratorio: KL27 Hardware

Ricardo Andrés Velásquez Vélez (randres.velasquez@udea.edu.co)


Jorge Eliécer Hernández Palacio (jorgeeliecer@gmail.com)

El KL27 es un microcontrolador con características bien interesantes, en las que podemos destacar
su oscilador interno que soporta USB, el módulo RTC, el bootloader entre otras.
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio
La distribución de memoria en los MCU ARM CORTEX M es diferente con respecto a los MCU
S08 y COLDFIRE V1. Dicho mapa de memoria podemos apreciarlo en la siguiente figura

En la sección correspondiente a CODE, se albergan los vectores de interrupción y el código del


programa, después de un reset el MCU lee la posición 0x00000000, la cual contiene el valor final del
stack pointer, cabe mencionar que, éste es decremental; a continuación, lee la posición 0x00000004
(¿Por qué lee la posición 0x00000004 y no la 0x00000001?), el cual contiene el valor inicial del
program counter.

Es de notar que las regiones de memoria delimitadas en el grafico anterior aplican para todos
los MCU cuyo core sea un CORTEX M*, sin importar el fabricante del mismo. Sin embargo, es el
fabricante quien determina cuanta RAM y el tamaño de la FLASH, así como también los periféricos
que este pueda incluir.

Otra de las grandes diferencias de los Kinetis con respecto a las familias S08 y COLDFIRE está en
el uso de los pines, no solo un pin puede tener más de una función, como es el caso de los S08 y
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio
COLDFIRE, también es posible que un periférico tenga múltiples alternativas para llevar a cabo una
tarea determinada, por ejemplo, el pin TX de la UART1 puede utilizar el PTE0, PTA19 o el PTC4, esta
característica se denomina “signal multiplexing”. Para mayor información se sugiere al estudiante
revisar la sección número 10 del manual de referencia 10.3 KL27 Signal Multiplexing and Pin
Assignments.

La característica descrita anteriormente y otras como la fuente de reloj que utilizara el


periférico, la prioridad asignada a la interrupción o interrupciones de este, entre otras, hace que su
inicialización requiera una serie de pasos adicionales. Algunos autores, como es el caso de Jonathan
Valvano, hace referencia a estos procedimientos como “ritual de inicialización”.

1. Procedimiento:

 Antes de comenzar, es necesario verificar que contamos con el ultimo software para
programación de los microcontroladores NXP. De no ser así, debemos actualizarla. Es
necesario actualizar el bootloader del OPEN SDA, así como también la aplicación de
DEBUG, para esta última existen muchas opciones; entre ellas contamos con el J-link de
Segger, el USBDM_OpenSDA, entre otros. Para empezar con la actualización del
bootloader, debemos conectar la freedom por el puerto SDA con el botón de reset
presionado, Windows debería de detectarla como una memoria USB.

 La unidad bootloader debería lucir similar a la imagen que aparece a continuación. Para
actualizar el bootloader es suficiente con copiar el archivo
BOOTUPDATEAPP_Pemicro_v111.SDA (o su última versión) en la unidad. Una vez hecho
esto, desconectamos el cable USB y lo conectamos nuevamente al OpenSDA, debería
de ingresar en modo bootloader sin necesidad de presionar el botón de reset; debería
de mostrarnos, nuevamente, algo similar a la imagen que aparece a continuación. Ahora
copiamos el archivo DEBUG-APP_Pemicro_v108.SDA (o su última versión) para finalizar
la actualización, desconectamos y conectamos nuevamente el cable USB. En esta
ocasión Windows debería de encontrar nuevo hardware, una vez termine de instalar los
correspondientes drivers podremos continuar (los drivers están incluidos en el software
de desarrollo para el microcontrolador).
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Actividad: Realizar un programa que permita controlar el encendido del LED rojo mediante la
orden del pulsador SW3. Y el LED verde median el pulsador SW1 el cual está conectado a la
interrupción no enmascarable “Non-maskable interrupt (NMI)”.

Tenga en cuenta que los vectores de interrupción se encuentran definidos en la carpeta startup de
su proyecto.
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Realice debug del programa paso a paso y observe el estado de los registros de los puertos en la
posición de memoria correspondiente.

Para establecer los pines de conexión de los suiches consulte los planos de la FRDM-KL27Z “SPF-
28303_B.pdf”
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Main:
/**
* @file MKL27Z64_GPIO_ISR.c
* @brief Application entry point.
*/
#include <stdio.h>
#include "board.h"
#include "peripherals.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "MKL27Z644.h"

#define RED_LED 1<<18


#define GREEN_LED 1<<19

#define SW3_PRESS GPIOC->PDIR && 0x2)

#define NMI_LED_HANDLER NMI_Handler

volatile bool NMIIsrFlag = false;

/* TODO: insert other include files here. */

/* TODO: insert other definitions and declarations here. */

/*
* @brief Application entry point.
*/

void NMI_LED_HANDLER(void)
{
NMIIsrFlag = true;
}

int main(void) {

/* Init board hardware. */


BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
/* Init FSL debug console. */
BOARD_InitDebugConsole();

printf("Hello World\n");

/* Force the counter to be placed into memory. */


volatile static int i = 0 ;
/* Enter an infinite loop, just incrementing a counter. */

while(1) {
i++ ;
if(GPIOC->PDIR && 0x2) // if SW3 PRESS
GPIOB->PDOR |= RED_LED; // PTB18 = 1 (Red LED OFF)
//GPIOB->PSOR= RED_LED; // PTB18 = 1 (Red LED OFF)
else
GPIOB->PDOR &= ~RED_LED; // PTB18 = 0 (Red LED ON)
//GPIOB->PCOR= RED_LED; // PTB18 = 1 (Red LED OFF)

/* Check whether occur interupt and toggle LED */


if (true == NMIIsrFlag)
{
GPIOB->PTOR=GREEN_LED; //LED TOGGLE
NMIIsrFlag = false;
}

}
return 0 ;
}
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Función que debe ir en el archivo pinmux.c

void BOARD_InitPins(void)
{
/* Port A Clock Gate Control: Clock enabled */
CLOCK_EnableClock(kCLOCK_PortA);
SIM->SCGC5|= SIM_SCGC5_PORTB_MASK; //Port B Clock Gate Control: Clock enabled
SIM->SCGC5|= SIM_SCGC5_PORTC_MASK; //Port C Clock Gate Control: Clock enabled

PORTB->PCR[18] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK; //Red Cathode (PTB18 is configured as GPIO)


GPIOB->PDDR|=1<<18; //Red Cathode (PTB18 is configured as Output)
GPIOB->PSOR=1<<18; //Red LED OFF

PORTB->PCR[19] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK; //Green Cathode (PTB19 is configured as GPIO)


GPIOB->PDDR|=1<<19; //Green Cathode (PTB19 is configured as Output)
GPIOB->PSOR=1<<19; //Green LED OFF

PORTC->PCR[1] |= PORT_PCR_MUX(1)| PORT_PCR_PE_MASK; //SW3 (PTC1 is configured as GPIO with Pull Enable)

// FTFA->FOPT &= ~NV_FOPT_NMI_DIS_MASK; //NMI pin function is disabled, then PTA4 is free to be
GPIO

PORTA->PCR[4] |= PORT_PCR_MUX(1)| PORT_PCR_PE_MASK; //SW1 (PTA4 is configured as GPIO with Pull Enable)

/* PORTA1 (pin 23) is configured as LPUART0_RX */


PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2);

/* PORTA2 (pin 24) is configured as LPUART0_TX */


PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2);

SIM->SOPT5 = ((SIM->SOPT5 &


/* Mask bits to zero which are setting */
(~(SIM_SOPT5_LPUART0TXSRC_MASK | SIM_SOPT5_LPUART0RXSRC_MASK)))

/* LPUART0 Transmit Data Source Select: LPUART0_TX pin. */


| SIM_SOPT5_LPUART0TXSRC(SOPT5_LPUART0TXSRC_LPUART_TX)

/* LPUART0 Receive Data Source Select: LPUART_RX pin. */


| SIM_SOPT5_LPUART0RXSRC(SOPT5_LPUART0RXSRC_LPUART_RX));
}
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Taller GPIO:

1. ¿Qué hace el programa anterior?


2. ¿A qué se refiere el término clock gating para los periféricos en
los MCUs Kinetics?. ¿Cómo se activa esta característica a un
periférico en particular? (Consulte el manual de referencia del
microcontroador).
3. Diríjase al manual del MCU y responda ¿Qué es y para qué sirve el
módulo PORT de los MCUs Kinetics?. ¿Qué opciones podemos configurar
en los registros PORTx_PCRn?.
4. Diríjase al manual. ¿Para qué sirven los registros GPIOx_PDOR,
GPIOx_PSOR, GPIOx_PCOR, GPIOx_PTOR, GPIOx_PDIR y GPIOx_PDDR?.

Interrupciones:

Actividad:

Ahora cambie la funcionalidad del código para habilitar interrupciones en


el pin PTC1 conectado al suiche SW3. En la subrutina de atención a
interrupciones implemente cambio de estado del LED Rojo.

Ayuda:

1. Habilite la IRQ para el pin en particular


2. Identifique el vector de interrupciones en su proyecto, debe estar
en la carpeta startup.
3. Escriba la subrutina de atención a interrupciones
4. Habilite las interrupciones para el módulo (puerto GPIO) en el
vector controlador de interrupciones anidadas NVIC.

#define PTC1_SW3_IRQ PORTB_PORTC_PORTD_PORTE_IRQHandler

void PTC1_SW3_IRQ(void)
{
GPIOB->PTOR=RED_LED;
PORTC->PCR[1] |= PORT_PCR_ISF_MASK;
}

NVIC_EnableIRQ(PORTB_PORTC_PORTD_PORTE_IRQn);

PORTC->PCR[1] |= PORT_PCR_MUX(1)| PORT_PCR_PE_MASK|PORT_PCR_IRQC(0B1001); //SW3


(PTC1 is configured as GPIO with Pull Enable and Interrupt on rising-edge.)
Sistemas Embebidos y Laboratorio
Prácticas de Laboratorio

Taller Interrupciones:

Con base en la información de la sección 3.2 Nested vectored interrupt


controller (NVIC) del manual “KL27P64M48SF6RM.pdf” y la información
suministrada en el manual de la CPU “DUI0662B_cortex_m0p_r0p1_dgug.pdf”

1. ¿Qué es la Non-maskable interrupt y como se configura?


2. ¿Qué es y cómo se configuran los nivele de prioridad en la
interrupción?
3. ¿Cuántas interrupciones soporta el KL27?
4. ¿Cuál es la utilidad de los siguientes registros?

DUI0662B_cortex_m0p_r0p1_dgug.pdf

Bibliografía:

http://www.keil.com/pack/doc/CMSIS/Core/html/group__NVIC__gr.html

http://infocenter.arm.com/help/topic/com.arm.doc.dui0662b/DUI0662B_cortex_m0p_r0p1_dgug.pdf

https://www.nxp.com/docs/en/reference-manual/KL27P64M48SF6RM.pdf

También podría gustarte