Tutorial MSP430 – Prender un Led “Bienvenido a mi casa. Venga libremente, váyase a salvo, y deje algo de la alegría que trae consigo” Dracula, de Bram Stoker Vamos a trabajar con el microcontrolador MSP430F2011, debido a que tiene sólo 14 pines, de los cuales podemos utilizar 10 pines como I/O, 2KB de memoria de programa (Flash Memory) y 12MB de memoria de datos (RAM). Naturalmente si en algún momento nos queda chico este micro migraremos a otro con mayor recursos. En esta direccion de la empresa Texas Instruments se encuentran dos archivos que necesitamos tener a nuestro lado como material de consulta absoluto: 1. Datasheet del MSP430F2011 2. Guia de Usuario de la Familia MSP430X2XX Como podemos ver en la imagen, vamos a realizar un código que active un nivel high en el pin 2 del MSP430F2011.
Tutorial con ejemplos demostrativos de microcontrolador MSP430
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Tutorial MSP430 – Prender un Led
“Bienvenido a mi casa. Venga libremente, váyase a salvo, y deje algo de la alegría que trae
consigo”
Dracula, de Bram Stoker
Vamos a trabajar con el microcontrolador MSP430F2011, debido a que tiene sólo 14 pines, de los
cuales podemos utilizar 10 pines como I/O, 2KB de memoria de programa (Flash Memory) y 12MB
de memoria de datos (RAM). Naturalmente si en algún momento nos queda chico este micro
migraremos a otro con mayor recursos.
En esta direccion de la empresa Texas Instruments se encuentran dos archivos que necesitamos
tener a nuestro lado como material de consulta absoluto:
1. Datasheet del MSP430F2011
2. Guia de Usuario de la Familia MSP430X2XX
Como podemos ver en la imagen, vamos a realizar un código que active un nivel high en el pin 2
del MSP430F2011.
El código que realizará esta tarea se muestra a continuación:
123456789101112131415161718
#include "io430.h"//libreria del propio IDE //#define LED1 P1OUT_bit.P1OUT_0//definicion del pin LED#define LED1 P1OUT_bit.P0//definicion del pin LED
int main( void ) //funcion principal{ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
//CAPD = 0x00;//Habilitamos el output driver de todos los pines del puerto 1. P1SEL = 0x00;//Seteamos la funcion de I/O en todos los pines del puerto 1. P1DIR = 0xFF;//Seteamos todos los pines del puerto 1 como salida.
LED1 = 1;//nivel high en el pin LED
while(1);//bucle infinito}
Como pueden notar se trata de un lenguaje C que respeta el formato del ANSI C, practicamente no
hemos tocado aún varios aspectos como el oscilador, modo de arranques, etc. Estos temas los
iremos vislumbrando conforme avance el curso.
Pero por ahora toca entender que significan estos 3 registros: CAPD, P1SEL, P1DIR, y que
significa el label LED1.
CAPD, P1SEL, P1DIR se necesitan configurar de la siguiente manera para poder utilizar el pin 2
que corresponde con el P1.0, como output:
Observen que para que el pin P1.0 se comporte como un pin de salida (o de entrada) necesita que
el bit 0 del registro P1DIR sea cero, debido a que ese registro define el comportamiento de entrada
o salida del pin, donde un “1 ” significa “salida” y un “0″ es “entrada” (contrario a como trabajan los
PICs por ejemplo).
Así mismo el bit 0 de P1SEL tiene que ser cero, pues esto le indica al pin que se comporte como
un pin I/O, otro valor configuraría al pin para que trabaje con algun periférico que tiene
multiplexado. En otro proyecto usaremos esta configuración.
Y el bit 0 del registro CAPD también tiene que ser seteado a cero, para que habilite los buffers de
entrada/salida del pin. Este registro tiene mayor relevancia cuando se usa el pin P1.0 en el modo
comparador.
Después de todo esto ya tenemos el pin P1.0 configurado como salida (en el código lo hemos
aplicado a todos los pines del puerto 1), entonces creamos el label LED1 que referencia al bit 0 del
registro P1OUT (quien controla los pines de salida del puerto 1).
#define LED1 P1OUT_bit.P1OUT_0, donde:
P1OUT_bit = registro P1OUT
P1OUT_0 = bit 0 del registro P1OUT
Finalmente un video para que la visita sea más didáctica:
Tutorial MSP430 – Prender y Apagar un Led“Bienvenido a mi casa. Venga libremente, váyase a salvo, y deje algo de la alegría que trae
consigo”
Dracula, de Bram Stoker
En esta nueva entrada vamos a estudiar un programa en el cual haremos prender y apagar
(parpadear) un led con un determinado retardo. El programa aparenta ser simple y sencillo, sin
embargo la pondremos dificil porque hasta ahora no sabemos a que frecuencia estamos trabajando
con el MSP430F2011, es más, ni siquiera sabemos si estamos usando un oscilador externo o
interno, no hemos mencionado nada del sistema oscilador del microcontrolador en cuestión.
No es cuestión de poner un delay y ver como parpadea, se trata de entender como trabaja todo el
sistema, al inicio puede parecer complejo explorar como funciona la oscilacion del MSP430F2011,
pero veremos que ordenando la información y con algunos gráficos, todo se vuelve fácil de
comprender.
El Basic Clock System
La frecuencia de oscilación del MSP430F2011 (y de todos los MSP430xxx) depende de lo que se
conoce como el Basic Clock System, el cual si miran en el gráfico siguiente, se puede observar que
está constituido por 5 elementos globales:
1. Clock Sources
2. Clock Signals
3. Modos de Operacion
4. Registros para configurar Clock Sources y Clock Signals
5. Registros para configurar el Modo de Operacion
Parece mucha información, lo és!, pero ya dice el sabio refrán: “divide y vencerás”, por eso anticipo
que en esta entrada no exploraremos los puntos 3 y 5, simplemente lo dejaremos con su
configuración por defecto que es “Active Mode (AM)”, es decir no tocaremos sus registros de
configuración. La aplicación o utilidad de los puntos 3 y 5 se ve reflejado en el tema de ahorro de
consumo de energía, las diferentes configuraciones de low power mode permiten tener varios
consumos en el orden de micro amperios, según sea la necesidad de la aplicación.
Clock Sources y Clock Signals
“Y Odin creo primero los clock sources y después aparecieron los clock signals“. Igual tenemos que
hacer nosotros, primero debemos configurar los clock sources y después aparecieron los clock
signals. Porque? Por el siguiente gráfico, una imagen habla más que 1000 palabras:
El gráfico fue extraido del family users guide que les sugerí descargar en el primer post del tutorial,
el esquema representa los bloques de trabajo del Basic Clock System para el MSP430F2xxx,
observen además que he colocado unos apuntes de “no está implementado” para que sepan que
etapas no están implementadas en el MSP430F2011. Además podrán apreciar de izquierda a
derecha que los Clock Sources (VLOCLK, LFXT1CLK, DCOCLK) se concentran en un punto para
dar lugar a los Clock Signals (ACLK, MCLK, SMCLK). Tenemos que seleccionar de que fuente
(VLOCLK, LFXT1CLK, DCOCLK) provienen las señales de oscilación del sistema (ACLK, MCLK,
SMCLK).
Clock Sources
Entonces, los entendemos como la fuente de oscilación para las señales de reloj (Clock Signals)
del sistema, y tenemos que seleccionar sólo una de ellas, pero podemos cambiar entre una y otra
en el tiempo de ejecución del programa del microcontrolador:
• LFXT1CLK: Low-frequency/high-frequency oscillator that can be used with low-frequency “watch
crystals” or “external clock sources” of 32768 Hz or with standard crystals, resonators, or “external
clock sources” in the 400-kHz to 16-MHz range. En el caso del MSP430F2011 el LFXT1CLK solo
soporta bajas frecuencias en el rango de 10KHz hasta 50KHz.
• DCOCLK: “Internal” digitally controlled oscillator (DCO). Es un oscilador interno con un gran rango
de configuración de trabajo de hasta 16MHz.
• VLOCLK: Internal very low power, low frequency oscillator with 12kHz typical frequency. Es un
oscilador interno de solo 12KHz, utilizado para bajo consumo del sistema.
En esta entrada vamos a trabajar con el oscilador interno DCOCLK, por ello los demás clock
sources no serán analizados por el momento, ya tendrán su respectivo post.
Este oscilador interno es muy versátil, tiene un gran rango de trabajo que va desde 0.06MHz hasta
16MHz, en distintos niveles o pasos. El siguiente gráfico lo explicará todo:
El gráfico de arriba nos muestra en el eje horizontal los 8 (del 0 al 7) valores para el grupo de bits
DCO (son 3 bits) que se encuentran en el registro DCOCTL, y en el eje vertical los valores (en
realidad son 16 valores, del 0 al 15) del grupo de bits RSEL que se encuentran en el registro
BCSCTL1. Fijense el escalon que tiene por ejemplo RSEL = 0 para cada valor de DCO, a la
izquierda en el eje vertical podemos apreciar la frecuencia “aproximada” que conseguimos en
alguna de las configuraciones.
A esto me refería cuando les decía que tenemos un oscilador muy versátil para trabajar, ahora la
pregunta es y cómo saber la frecuencia aproximada que estaremos configurando al utlizalos los
bits DOC y RESL? Existen 2 caminos, utilizar los valores por defecto que ofrece el datasheet del
MSP430F2011 o averiguar por tu cuenta un valor de frecuencia experimental con que desees
trabajar.
En la siguiente tabla extraída del datasheet del MSP430F2011 están los valores que debemos
cargar alos registros BCSCTL1 (CALBC1_xMHZ) y DCOCTL (CALDCO_xMHZ) para obtener las
correspondientes frecuencias:
Como mencioné antes, existen otros valores de frecuencia para el DCO que no están en esta tabla,
sin embargo no son tema de esta entrada, tendrán su propio post y aplicación didáctica. Para este
proyecto utilizaremos la configuracion de 1MHz.
Clock Signals
Son 3 salidas para el source que seleccionemos, donde cada clock signal tiene su propia
configuración y aplicación:
• ACLK: Auxiliary clock (ACLK), sourced either from a 32768-Hz watch crystal or the internal LF
oscillator. Puede ser utilizado con los clock source: LFXT1CLK, VLOCLK. El source para esta señal
dependera de la configuracion de los bits LFXT1S (2 bits) del registro BCSCTL3 y del bit XTS (1
bit) del registro BCSCTL1.
• MCLK: Main clock (MCLK), the system clock used by the CPU. Puede utilizar todos los source
disponibles. Por defecto despues de un reset del chip siempre selecciona iniciar con el source
DCOCLK. Por código podemos cambiarlo a otro source si lo requerimos y se realiza esto con los
bits SELM (2 bits) que están en el registro BCSCTL2. Así mismo tiene un divisor de frecuencias en
los bits del DIVM (2 bits) también en el registro BCSCTL2.
• SMCLK:Sub-Main clock (SMCLK), the sub-system clock used by the peripheral modules. Puede
utilizar todos los source disponibles. Para seleccionar el source se utiliza los bits SELS (2 bits) que
están en el registro BCSCTL2 y un divisor de frecuencias en los bits del DIVS (2 bits) en el mismo
registro.
En este programa utlizaremos el DCO a 1MHz junto con el MCLK con divisor valor 1, así que hay
muy poco que manipular.
Programa de aplicacion
12345678910
#include "io430.h"//libreria del propio IDE#include "intrinsics.h" //#define LED1 P1OUT_bit.P1OUT_0//definicion del pin LED#define LED1 P1OUT_bit.P0//definicion del pin LED
int main( void ) //funcion principal{ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_8MHZ;// Use 1Mhz cal data for DCO
111213141516171819202122232425262728
DCOCTL = CALDCO_8MHZ;// Use 1Mhz cal data for DCO
CAPD = 0x00;//Habilitamos el output driver de todos los pines del puerto 1. P1SEL = 0x00;//Seteamos la funcion de I/O en todos los pines del puerto 1. P1DIR = 0xFF;//Seteamos todos los pines del puerto 1 como salida.
Todos los archivos los pueden encontrar en: 4shared, boxnet .
Estos nuevos enlaces estan compilador con la versión del software IAR 5.40 :
Tutorial MSP430 – Barra de Leds – Maskable Interrupts for Input Port“Bienvenido a mi casa. Venga libremente, váyase a salvo, y deje algo de la alegría que trae
consigo”
Dracula, de Bram Stoker
Vamos a realizar un proyecto en el cual con un boton (normalmente en bajo nivel) iremos
desplazando la activación de un led en la salida de un 74xx138 según un contador interno en el
MSP430. En este sencillo ejemplo aprenderemos a utilizar los pines del MSP430 como entradas
lógicas y también a configurar sus respectivas interrupciones de cambio de estado por flanco de
entrada.
Interrupciones en el MSP430
Así como en otros microcontroladores, el MSP430 también viene provisto de interrupciones por
hardware que permiten realizar diversas aplicaciones según la caraterística de la interrupción que
utilizemos. Podemos usar las interrupciones por ejemplo para los siguientes casos:
• Tareas urgentes que deben ser atendidas inmediatamente y con mayor prioridad que el código
principal.
• Tareas de poca frecuencia, como el manejo de pulsadores en un humano. Esto nos libera de
realizar un código con polling (bucle para evaluar constantemente en el orden de microsegundos
una entrada lógica).
• Despertar el CPU del modo Sleep. Esto es muy importante en el MSP430, ya que por lo general
se lo utiliza la mayor parte del tiempo en modo de bajo consumo (low-power mode) y puede volver
al modo activo (AM mode) con una interrupción.
Tipos de Interrupciones
En el MSP430 tenemos 3 tipos de interrupciones, éstas son:
Si revisamos el datasheet del MSP430F2011, en la pagina 13, está plasmada una tabla con todas
las interrupciones que soporta el microcontrolador (en realidad ese datasheet es para las series
MSP430F20x3/2/1):
Debemos observar en esta tabla que existen 32 posiciones de memoria (0-lowest … 31-highest) o
también llamados “vectores” reservados para almacenar la dirección de los ISR correspondientes a
la interrupción que los define (también conocidos como los “interrupt handler”). Como pueden
apreciar en dicha tabla están plasmados los 3 tipos de interrupciones del MSP430F2011,
separados por tipo y en orden descendente, donde dicho orden indica así mismo el rango de
prioridad de las interrupciones, es decir la interrupcion con prioridad 31 en la posicion de memoria
0xFFFEh correspondiente con el System Reset tiene la prioridad más alta de toda la tabla.
Y cómo sabemos cuales son las interrupciones que maneja exactamente el MSP430F2011? Pues
basta darle un vistazo al archivo “io430x20x1.h” que está en los programas que hacemos con el
IAR cuando seleccionamos el MSP430F2011, y buscan lo siguiente:
Para escribir el “interrupt handler” de la interrupción que queremos gestionar, necesitamos saber el
nombre del vector de la interrupción que tiene en el microcontrolador que estamos programando
(siempre y cuando sea desde el IAR), para eso sirven esos #defines.
En esta entrada sólo abarcaremos el estudio de las interrupciones enmascarables (MASKABLE
INTERRUPTS) , para los demás tipos prepararemos otras entradas ya que tienen su propio campo
de aplicación.
Maskable Interrupts for Input Port
Las interrupciones enmascarables (MASKABLE INTERRUPTS) tienen la propiedad de activarse
individualmente y también como en una capa superior se pueden activar colectivamente. Esto es,
despues de configurar el pin de entrada P2.7 para que genere una interrupcion en cada flanco de
subida, debemos utilizar la función intrinseca: “__enable_interrupt“, la cual setea a nivel global la
activación de todas las interrupciones enmascarables del MSP430. Sino la utlizamos ninguna de
las interrupciones enmascarables previamente y correctamente configuradas funcionarán. Siempre
se pone la linea “__enable_interrupt” al final de la configuración de todas las interrupciones
enmascarables. Para tener la función “__enable_interrupt” disponible necesitamos colocar en la
cabecera la inclusión: #include “intrinsics.h”.
Luego requerimos escribir el “interupt handler” o ISR, que es el lugar donde haremos el tratamiento
de la interrupción. En C para el IAR, existe un formato para escribir el “interrupt handler” o ISR de
la interrupción que queremos utilizar. El formato es el siguiente:
A continuación explicaremos los campos resaltados:
#pragma vector: esta directiva es usada para especificar la dirección del vector de interrupción
que se escriba en el campo <VECTOR_NAME>.
<VECTOR_NAME>: aquí escribimos el nombre del vector de la interrupción que deseamos utilizar,
el nombre lo obtenemos del archivo cabecera del micro que usemos, por ejemplo en esta entrada
usaremos una interrupción en el pin P2.7, por lo tanto el vector name será “PORT2_VECTOR”.
__interrupt: es usado para indicar al compilador que haga la llamada convencional que necesita
una función de tipo interrupción.
<ISR_NAME>: es simplemente el nombre del “interrupt handler”, es decir puede ser cualquier
nombre que prefiera el programador. En nuestro caso le he puesto de ISR_NAME el literal
“InterrupcionPuerto2″.
Dentro del “interrupt handler” escribimos el código que gestionará las acciones conjunto que
realizará la interrupción del hardware especificado. Finalmente NUNCA olvidar de borrar el flag de
la interrupción invocada.
Interrupcion de Cambio de Estado en el Pin de Entrada P2.7
Para configurar la interrupcion en el pin P2.7 necesitamos manipular los siguientes registros:
De la imagen entendemos que debemos configurar el bit 7 del registro P2DIR con valor 0 para
indicar “entrada”, luego el bit 7 del registro P2SEL con valor 0 para indicar funcion de I/O
(entrada/salida).
También debemos utlizar el bit 7 del registro P2REN, para especificar si el pin P2.7 tendrá una
resistencia de pullup (3.3V con el pin al aire) o pulldown (0V con el pin al aire) conectada a su
entrada. Esto por lo general se utiliza con pulsadores normalmente abiertos o cerrados.
Así mismo hacemos con el bit 7 del registro P2IES, que permite especificar el flanco de disparo de
la interrupción en el pin P2.7. Podemos seleccionar entre una transición de bajada a subida o
viceversa. En nuestro caso tenemos una señal normalmente en bajo nivel, por ello elegimos la
transición de bajada a subida.
A continuación habilitamos la interrupción del pin P2.7 escribiendo un 1 en el bit 7 del registro P2IE.
Luego borramos el flag de interrupcion en el bit 7 del registro P2IFG para evitar sorpresas
inesperadas. Recordar borrar este flag antes de salir del “interrupt hanlder” o ISR.
Finalmente agregaremos la linea de comando “__enable_interrupt();” para activar de forma global
todas las interrupciones enmascarables previamente configuradas, como és el caso del pin P2.7.
Programa de Aplicación:12345678910111213141516171819202122232425
#include "io430.h"//libreria del propio IDE#include "intrinsics.h" #define OUT_A P1OUT_bit.P1OUT_1//definicion del pin LED#define OUT_B P1OUT_bit.P1OUT_2//definicion del pin LED#define OUT_C P1OUT_bit.P1OUT_3//definicion del pin LED
unsigned char aux;
int main( void ) //funcion principal{ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;// Use 1Mhz cal data for DCO DCOCTL = CALDCO_1MHZ;// Use 1Mhz cal data for DCO
CAPD = 0x00;//Habilitamos el output driver de todos los pines del puerto 1. P1SEL = 0x00;//Seteamos la funcion de I/O en todos los pines del puerto 1. P1DIR = 0xFF;//Seteamos todos los pines del puerto 1 como salida. P1OUT = 0x00; P1DIR_bit.P1DIR_7 = 0;//pin de entrada
//Configuramos pin P2.6 y P2.7 como entradas logicas. P2DIR_bit.P2DIR_6 = 0;//logic input P2SEL_bit.P2SEL_6 = 0;//input/output function P2DIR_bit.P2DIR_7 = 0;//logic input
//Primera capa de activacion de interrupcion //Configuramos la interrupción en el pin P2.7 P2REN_bit.P2REN_7 = 0;//deshabilitamos la resistencia pullup/pulldown. P2IES_bit.P2IES_7 = 0;//interrupcion en pulso de subida (low to high). P2IE_bit.P2IE_7 = 1;//habilitamos la interrupcion del pin P2.7 P2IFG_bit.P2IFG_7 = 0;//limpiamos la bandera de interrupcion del pin P2.7
//Segunda capa de activacion de interrupcion __enable_interrupt();
LcdStringXY(source2,5,5,1); break; case 3: LcdStringXY(source3,5,5,1); break; }
switch(estadoDIV){ case 0: LcdStringXY(div0,2,15,1); break; case 1: LcdStringXY(div1,2,15,1); break; case 2: LcdStringXY(div2,2,15,1); break; case 3: LcdStringXY(div3,2,15,1); break; }
switch(estadoMODO){ case 0: LcdStringXY(modo0,10,6,2); break; case 1: LcdStringXY(modo1,10,6,2); break; case 2: LcdStringXY(modo2,10,6,2); break; case 3: LcdStringXY(modo3,10,6,2); break; }
unsigned int espacioFB;unsigned int espacioFS; unsigned int digitocode39;unsigned int lenghtcode39[9]; int main( void ){ unsigned char titulo[16] = " microembebidos ";
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;// Use 1Mhz cal data for DCO DCOCTL = CALDCO_1MHZ;// Use 1Mhz cal data for DCO
En esta práctica, vamos a cubrir dos temas principales:
- Interrups y rutinas de servicio de interrupción
- C programación del MSP430
Tutorial y Antecedentes
1 - Las interrupciones en la Asamblea
Las interrupciones serán discutidos en la conferencia - pero en pocas palabras - que son un mecanismo para tomar el control del procesador en función de la petición de hardware. El procesador completa con gracia la instrucción actual y luego los "servicios" de la interrupción, ejecute el código definido en una rutina de servicio de interrupción. Hay muchas fuentes de las interrupciones en el MSP430, pero en este laboratorio vamos a centrar en la entrada de propósito general en P1.3 que está unido al pulsador.
Una interrupción en P1.3 se puede activar mediante el control de varios puertos 1 registros encontrados:
P1IE es un registro que permite a las interrupciones para el puerto 1 pins.
P1IES es el opositor que determina (si las interrupciones están habilitadas para el pin correspondiente) para que el borde (ascendente o descendente) causa una interrupción.
P1IFG es el registro en el que cada bit PxIFGx es la bandera de interrupción para su correspondiente pin de E / S y se establece cuando el borde de la señal de entrada seleccionada aparece en el pin. Todos PxIFGx interrumpen banderas solicitar una interrupción cuando su correspondiente bit PXIe y el bit GIE se establecen. Cada bandera PxIFG se debe restablecer con el software. El software también puede configurar cada bandera PxIFG, proporcionando una manera de generar un programa iniciado interrupción.
Bit = 0: Sin interrupción está pendiente
Bit = 1: Una interrupción está pendiente
Sólo las transiciones, los niveles estáticos, no causan interrupciones. Si cualquier bandera PxIFGx cuaja durante la rutina de servicio de interrupción Px, o si se establece después de la instrucción RETI de una rutina de servicio de interrupción Px se ejecuta, la bandera conjunto PxIFGx genera otra interrupción. Esto asegura que se reconoce cada transición.
Finalmente, las banderas de interrupción debe ser limpiado y, finalmente, las alarmas deben estar habilitadas en todo el mundo. Estas tres líneas realizan esta función en este caso.
Cómo implementar rutinas de servicio de interrupción
Para utilizar interrumpe necesita configurar su interrupción específica (puerto 1.3 en este caso), desactive las interrupciones pendientes y habilitar las interrupciones globalmente. Este código hace esto.
bis.b # 008H, y P1IE; P1.3 Interrupción habilitada
bis.b # 008H, y P1IES; Hi P1.3 / borde inferior
bic.b # 008H, y P1IFG; IFG P1.3 Autorizado
bis.w # GIE, SR; LPM4, habilitar las interrupciones
Añadir este código de ejemplo al final de su programa de la asamblea para incluir una rutina de servicio de interrupción para el puerto 1. Usted tendrá que añadir el código del programa específico por encima de la instrucción RETI. El bic.b es necesario borrar el indicador de interrupción. Esto se conoce como "reconocer" la interrupción y evita una solicitud de interrupción siendo administrados más de una vez.
TI tiene una amplia documentación sobre el Code Composer Studio. Usted puede encontrar todo aquí.
Para crear un proyecto de CCS, seleccione Proyecto CCS "en el nuevo menú Archivo->. Seleccione un "Proyecto vacío" con el fin de crear un proyecto de C.