INTRODUCCIÓN
Esta práctica fue una sesión practica impartida, en el DWF Guadalajara 2015. Se proporciona una guía paso a paso del procedimiento general de la creación y configuración de un proyecto con KDS y PROCESSOR EXPERT.
COMO INICIAR UN NUEVO PROYECTO PARA KINETIS DESING STUDIO
Primero vamos a conocer como crear un proyecto nuevo para KINETIS DESING STUDIO (KDS). Se da CLICK en el icono de acceso directo.
Figura 1.“ICONO DE KINETIS DESING STUDIO 3.0.0”
Entonces comenzará a cargar el programa apareciendo una ventana de bienvenida.
Figura 2.“PANTALLA DE CARGA DEL PROGRAMA ‘KDS’ ”
Aparece una pantalla para seleccionar el espacio de trabajo. En el espacio de trabajo se guardan los proyectos actuales con los que se esta trabajando. Se recomienda crear un espacio de trabajo por cada conjunto de proyectos afines, esto permite una mejor organización en cuanto al desarrollo de código.
Figura 3.“PANTALLA DE SELECCIÓN DE WORKSPACE”
Se selecciona OK, posteriormente se abrirá el área de trabajo que luce como la figura 4.
Figura 4. “AREA DE TRABAJO DEL KDS”
Ahora para abrir un nuevo proyecto se selecciona: File → new→ Kinetis Project como se muestra en la figura 5.
Figura 5.“RUTA DE CREACIÓN DE NUEVO PROYECTO”
Se abrirá una nueva ventana donde se selecciona el nombre que llevará nuestro nuevo proyecto que se guardara en el espacio de trabajo seleccionado.
Figura 6.“PANTALLA DE CREACIÓN DE NUEVO PROYECTO”
Se escribe el nombre deseado y se continua. Ahora se selecciona la tarjeta o el microcontrolador con el que se desea trabajar.
Figura 7.“SELECCIÓN DE TIPO DE TARJETA O PROCESADOR”
En este caso se selecciona FDRM-K64.
Figura 8.“SELECCIÓN DE LA TARJETA ‘FRDM H64F’ “
Se selecciona la opción PROCESSOR EXPERT, esta herramienta permite acelerar el desarrollo de proyectos, puesto que contiene componentes de software, que solo requieren la configuración por parte del usuario.
Figura 9. “HABILITACIÓN DEL PROCESSOR EXPERT”
Enseguida aparece el explorador de proyectos, contiene la carpeta del nuevo proyecto, en la cual están guardados todos los archivos de código fuente.
Figura 11. “UBICACIÓN DEL CODIGO PRINCIPAL main.c”
Se observa el panorama general del espacio de trabajo. Especialmente se pone atención al archivo main.c que es donde se escribe la rutina principal del programa.
Figura 12. “CODIGO PRINCIPAL, VENTANA DE COMPONENTES, INSPECTOR DE COMPONENTES Y BIBLIOTECA DE COMPONENTES”
La pestaña componentes contiene los módulos de PROCESSOR EXPERT que se utilizan en el proyecto. La manera en la que se configuren, influye en el funcionamiento de los periféricos y del cpu del K64.
Figura 13. “COMPONENTES DE PROCESSOR EXPERT”
El inspector de componentes muestra las opciones para configurar los periféricos del K64. También contiene los procedimientos para programar los periféricos.
Figura 14. “INSPECTOR DE COMPONENTES”
Por último se muestra la ventana de la biblioteca de componentes de PROCESSOR EXPERT.
Figura 15. “PESTAÑA DE BIBLIOTECA DE COMPONENTES”
En la bliblioteca se encuentran los componentes ordenados de forma alfabética o por categoría, también se pueden buscar por entrada de teclado.
Figura 16. “BIBLIOTECA DE COMPONENTES”
DESARROLLO DE LA PRÁCTICA
Utilizando el procedimiento señalado anteriormente se crea un nuevo proyecto al que se le nombra LAB4. Se comienza configurando el CPU por medio del componente de Processor Expert. El nombre del componente por default es clockMan1, esto sirve para referirnos al mismo cuando utilizamos funciones y procedimientos a la hora de programar.
Figura 17. “COMPONENTE DE CPU EN PROCESSOR EXPERT”
Se cambia la variante del procesador a ocupar, en CPU type se selecciona la opción ‘MK64FN1M0VLL12 in LQFP 100-pin package’ .
Figura 18. “SELECCIÓN DE LA VARIANTE 100 PIN PACKAGE”
Continuando con los ajustes del reloj del CPU. Para esto se debe seleccionar el componente clockMan1: fsl_clock_manager. Esto ocasionará que se abra la configuración en la ventana de Component Inspector.
Figura 19. “CONFIGURACIÓN DE AJUSTES DEL clockMan1”
Se selecciona la opción ‘System oscilator 0´ , a continuación se cambia la opción de clock source de external crystal a ‘external reference clock’. Además se ajustala frecuencia del reloj a 50 MHz.
Figura 20. “SYSTEM OSCILATOR Y EXTERNAL REFERENCE CLOCK Y FRECUENCIA DEL RELOJ”
Después se busca la pestaña ‘clock configuration’ y dentro de ella seleccionamos la pestaña ‘MCG settings’
Figura 21. “MGC SETTINGS”
Dentro de este apartado de configuración debemos realizar los siguientes cambios: cambiar MCG mode a PEE, cambiar la PLL output a 120 MHz.
El generador de reloj multipropósito ‘MULTIPURPOSE CLOCK GENERATOR (MCG)’ en inglés soporta un referencia externa de reloj. Si es bit C6 en el módulo del MCG está en 1. El monitor del reloj está habilitado. Si la referencia externa cae debajo de floc_low o floc_high, como controlado por el campo c2 en el módulo MCG, el MCU se resetea.
El MCG incluye un detector loss-of-lock del PLL. El detector está habilitado cuando se configura para PEE y el bloqueo se ha alcanzado. Si el bit MCG_C8 en el módulo MCG está en 1 y el bit del estado del PLL lock se activa, el MCU se resetea. El bit RCM_SRSO se activa para indicar esta fuente de reset.
Figura 22. “CONFIGURACIÓN DE MCG MODE Y PLL OUTPUT”
Ahora se selecciona a la pestaña ‘sytem clocks’ para configurar los campos siguientes:
- Core clock: 120 MHz
- Bus clock: 60 MHz
- External bus clock: 60 MHz
- Flash clock: 24 MHz
Requerimientos de relojes internos. Los divisores de reloj están programados via módulos SIM en los registros CLKDIV. Cada divisor es programable desde un divisor-entre-1 a través de un ajuste de divisor-entre-16. Los siguientes requerimientos deben ser respetados cuando se configuren los relojes para este dispositivo.
- Las frecuencias del reloj del núcleo y el reloj del sistema deben estar en 120 MHz o menos.
- La frecuencia del reloj del Bus debe estar programada a 60 MHz o menos.
- La frecuencia del reloj flash debe estar programada a 25 MHz o menos y debe dividir en enteros el reloj del núcleo.
- La frecuencia del reloj FlexBus debe estar programada a 60 MHz o menos y dividir de forma entera al reloj del núcleo.
Figura 23. “CONFIGURACIÓN DE LOS RELOJES DEL SISTEMA”
A continuación se modifica la configuración de pines dando clic sobre el respectivo componente.
Figura 24. “COMPONENTE DE CONFIGURACIÓN DE PINES”
Se aprecia que hay gran cantidad de errores en la configuración, esto es debido a que el actual procesador es el MK64FN1M0LQ12, es diferente al procesador de la tarjeta usada en el ejercicio MK64FN1M0LL12. Para cambiar la configuración se da click en ‘switch configuration’.
Figura 25. “CAMBIO DE CONFIGURACIÓN DEL PROCESADOR”
Una vez hecho esto se observa que los errores han desaparecido. Se da clic en la pestaña del GPIO (GENERAL PURPOSE INPUT/OUTPUT) para configurar algunos pines de entrada y salida. Los pines a configurar se muestran en la tabla 1.
Figura 26. “GPIO”
Tabla 1. “CONFIGURACIÓN DE PINES”
Dentro del a configuración del GPIO buscamos la sección del puerto PTA se busca el pin 4
Figura 27. “PTA pin 4”
En la columna Pin/Signal Selectión para el pin PTA 4 se selecciona la opción del PTA 4 y después se da clic derecho y se selecciona Pin Functional Properties .
Figura 28. “CONFIGURACIÓN DEL PIN PTA 4”
Ahora en la columna de dirección del pin se verifica que esté habilitado para entrada (input) y después, sobre el pin PTA 4, se pulsa la tecla ‘F2’ y se edita el nombre a SW3.
Figura 29. “EDICIÓN DEL NOMBRE DEL PIN”
Figura 30. “CONFIGURACIÓN DE DIRECCIÓN Y NOMBRE DEL PIN PTA 4”
Haremos lo mismo con los demás pines mostrados en la tabla 1. Para el caso del pin PTC 6 (SW2), damos clic derecho sobre el pin y seleccionamos la opción PIN Functional Properties y configuramos las opciones Pull select y Pull enable como se ve en la figura 15.
Figura 31. “Configuración del pin PTC 6”
Una vez terminado de configurar los pines del GPIO configuraremos el UART (UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER), para eso, así como seleccionamos la pestaña del GPIO seleccionamos la pestaña del UART y configuraremos los siguientes pines.
TABLA 2. “CONFIGURACIÓN DEL UART”
Ahora nos vamos a la biblioteca de componentes, seleccionamos el orden alfabético y agregaremos tres componentes dando doble clic sobre ellos. Los componentes a agregar son el fls_gpio, el fls_pit y el fls_uart.
Figura 32. “SELECCIÓN DE LOS COMPONENTES fsl_gpio, fls_pit y fsl uart”
Los componentes que acabamos de agregar aparecerán en la ventana de componentes como se aprecia en la figura 17.
Figura 33. “VENTANA DE COMPONENTES CON LOS NUEVOS COMPONENTES AGREGADOS”
Ahora seleccionamos de la ventana de componentes el gpio1:fls_gpio para que se nos muestre la configuración en el Component Inspector. Una vez en la configuración seleccionamos la pestaña ‘input pins’ y en el apartado de ´input pins number´ agregaremos dos más, esto se hace pulsando el signo ‘+’. Ahora tendremos un total de 3 pines (0, 1, 2).
Figura 34. “AUMENTANDO EL NUMERO DE PINES DE ENTRADA A 3”
Configuraremos los dos nuevos pines agregados como se muestra en la figura 19 y veremos cómo desaparecen los errores en las filas 1 y 2.
Figura 35. “CONFIGURACIÓN DE PINES DE ENTRADA”
Ahora para los pines de salida realizaremos un proceso similar, agregaremos 3 nuevos pines de salida y los configuraremos como se muestra a continuación:
Figura 36. “CONFIGURACIÓN DE PINES DE SALIDA”
Ahora dentro de la ventana de componentes seleccionaremos el pit_timer y dentro la ventana del Component Inspector ajustaremos dentro de la configuración del pit_timer el periodo con un valor de 1000 ms
Figura 37. “AJUSTE DEL PERIODO DEL PIT_TIMER A 1000 ms”
Por último seleccionaremos el componente del uart, ya en el Component Inspector dentro de la pestaña de configuraciones daremos el valor de ‘11520’ para el ‘Baud rate’. Esto eliminará el error que teníamos en e componente.
Figura 38. “CONFIGURACIÓN DEL UART”
En la ventana de componentes daremos clic en el botón de generación de código para que Processor Expert agregue los archivos pertinentes al proyecto.
Figura 39. “BOTÓN DE GENERACIÓN DE CÓDIGO DE PROCESSOR EXPERT”
Un vez que termine, podemos ver que en la carpeta de nuestro proyecto en el ‘Project Explorer’ en la carpeta ‘Generated_Code’ tendremos nuevos archivos que pertenecen a los componentes que agregamos.
Figura 40. “NUEVOS ARCHIVOS AGREGADOR EN LA CARPETA Generated_Code”
Ahora dentro de las carpetas de nuestro proyecto hay una llamada ‘sources’, dentro de ella encontraremos el archivo principal ‘main.c’ lo abrimos dando doble clic.
Figura 41. “ARCHIVO main.c”
Aprecerá en la ventana de código el archivo main.c
Figura 42. “VENTANA DE TRABAJO CON EL CÓDIGO DEL PROGRAMA”
De la misma manera abriremos el archivo Events.c también ubicado en la carpeta ‘sources’, ya que ocuparemos ambos para la práctica. Dentro del código del archivo Events.c debemos buscar la función de la interrupción del PIT timer, aparecerá con el nombre PIT0_IRQHandler, la cual es de tipo void con un argumento de tipo void.
Figura 43. “FUNCION DEL PIT TIMER”
Ahora, dentro de la ventana de componentes, expandimos el componente del gpio, nos aparecerán diversas funciones que tiene disponibles, la que nos interesa se llama ‘GPIO_DVR_TogglePinOutput’. Damos clic sostenido sobre la instrucción y la arrastramos hasta el código del archivo Events.c. Debemos asegurarnos que quede dentro de la función del pit timer, en la parte que dice ‘write your code here’. La función toggle sirve para hacer que la salida (en este caso el led) parpadeé.
Figura 44. “FUNCIÓN TOGGLE DEL GPIO”
Ahora debemos arrastrar el archivo Lab4_main.c al espacio de trabajo y damos importar archivos. Damos clic en la opción ‘copy files’ y pulsamos OK.
Figura 45. “ARCHIVO Lab4_main”
Ya que agregamos el archivo debe aparecer dentro de nuestra carpeta de ‘Sources’. Ahora abriremos tanto el archivo main.c como el archivo Lab4_main.c. Dentro del código de main.c debemos agregar lo siguiente:
Figura 46. “LLAMADO DE FUNCIÓN DE LA FUNCION Lab4_main”
Ahora nos falta compilar, lo abrir el menú ‘PROJECT’ de la barra de menús, seleccionamos la opción ‘Clean’. En la nueva ventana que nos abre damos clic en OK. Después compilamos el archivo abriendo nuevamente el menú ‘PROJECT’ y dando clic en la opción ‘Build Project’
Figura 47. “CLEAN PROJECT”
Figura 48. “BUILD PROJECT”
Una vez que haya terminado procedemos a cargar el proyecto en la tarjeta. Para esto daremos clic en el icono en forma de bicho y seleccionaremos ‘Debug Configurations…’
Figura 49. “DEBUG CONFIGURATIONS”
Se abrirá una nueva ventana. Del lado izquierdo podemos visualizar una lista de opciones de debug. Seleccionaremos la opción ‘GDB SEGGER J-Link Debugging’ dando doble clic sobre ella. Corroborar que aparece la opción de debug de nuestro Lab4. Una vez nos aseguremos de esto damos clic en el botón ‘debug’ ubicado en la parte inferior derecha de la ventana.
Figura 50. “BOTÓN DE DEBUG”
El resultado de esta práctica es un led parpadeante de color verde, esta acción se ejecuta sin tener que presionar ningún botón. El switch 3 (SW3) será un switch que se activa mientras se mantenga presionado el botón. El switch 2 (SW2) será un botón sostenido que permanecerá así hasta que vuelva a ser presionado. Echemos un vistazo al código.
CODIGO DE PRÁCTICA LAB_4
Comencemos con las librerias. En este caso se incluye la librería string.h que nos sservirá para manejar cadenas de caracteres.
Después se hacen las declaraciones de las subrutinas que ocuparemos más adelante
A continuación presentamos el código de la función LAB4_main
Vamos a analizarlo por partes.
En la parte superior ponemos apreciar la instrucción ‘enum’ en la cual declaramos dos estados: down=0 y up=1. Además declaramos una variable que puede tomar los valores down y up. La variable recibe el nombre de sw_state.
Después declaramos dos constantes, una llamada SW_DOWN y otra llamada SW_UP. La primera recibe un valor de 1 y la segunda de 0
Después enviaremos una cadena de caracteres la la función sendstring, la cual dice lo siguiente: "Welcome to Processor Expert and Kinetis Design Studio IDE! \r\n\n"
Después entraremos en un loop infinito gracias al while (1). Esto para que el programa sea reiterativo y esté ejecutando las mismas instrucciones una y otra vez.
La primera instrucción es un if que pregunta si el pin de entrada que está asignado a SW2 es igual al valor de SW_DOWN (0) y además si sw_state es igual a up (1), si las condiciones se cumplen ejecutará:
Primero la función delay. La cual tiene un loop gracias a un for que tiene un ciclo para perder tiempo.
Después entra dentro de otro if anidado dentro del primero que pregunta si el pin de entrada asignado al SW2 sigue presionado (después de que haya pasado la rutina de retardo), si esta condición se cumple manda a llamar a la función SW2_pressed y después cambia el valor de la variable sw_state a down (0).
A continuación viene un tercer if (que no está anidado dentro del primero) que pregunta si el pin SW2 esta arriba y además si el estado de la variable sw_state está en down, de cumplirse estas condiciones cambia el valor de sw_state a up.
Ahora nos encontramos con otro fin que pregunta el estado del SW3, si este es igual a 0 manda a llamar a la subrutina SW3_pressed, si no activa la salida asignada a LED_BLUE.
Hasta aquí el cuerpo principal de la función, a continuación veremos las instrucciones que están dentro de las subrutinas.
Dentro de la rutina SW2_pressed tenemos dos instrucciones la primera es que manda a activar la salida que corresponde al LED_RED, la segunda manda una cadena de caracteres a la función sendstring. La cadena dice: "\r\nSW2 has been pressed and released, turn on/off the RED led!\r\n"
Ahora veremos la subrutina SW3_pressed la cual tiene solo una instrucción, mandar a activar la salida asignada a LED_BLUE.
La función sendstring manda la cadena de caracteres que recibe a la UART así que depende del argumento que le envíen al momento del llamado de función.
Por último la función delay, la cual tiene dentro una declaración de variable llamada i, y un ciclo for para gastar ciclos de reloj (puesto que no tiene instrucciones dentro). Esta función es la que genera un pequeño retardo. Como puede apreciarse tiene un comentario que dice que no se recomienda para programación en la vida real solo, es recomendado para un ejemplo.
Link del código realizado en esta practica:
https://www.dropbox.com/sh/ep3e6gn3y6qz58f/AACD0jjnyHDVZj4DsG8om6Zga?dl=0
Mas información sobre herramientas:
http://www.freescale.com/
No hay comentarios:
Publicar un comentario