[Aporte] Tutorial ARM Cortex-M3 - LPC1768

Gracias, Cosmefulanito.

Hay forma de leer el programa demo que me vino cargado en la placa, es muy buen demo y quisiera usar algunas sentencias. El tema es que solo tengo el FlashMagic y no vi la opción de leer uC.

laplaca también me vino con el accesport 1.34 pero no me ayudó en nada. El keil uvision 4 no me deja tarabajar con la plca sin el ULINK2.

Voy a probar este tip que me diste.

gracias
 
Gracias, Cosmefulanito.

Hay forma de leer el programa demo que me vino cargado en la placa, es muy buen demo y quisiera usar algunas sentencias. El tema es que solo tengo el FlashMagic y no vi la opción de leer uC.

Lo único que podés hacer es leer el ejecutable ".hex".

Para leer el programa necesitas los archivos fuentes, fijate que en el cd trae bastantes ejemplos, es cuestión de verlos.
 
Yendo al tema de las librerías y periféricos en ARM, creo que hay que mencionar que existe el CMSIS que es un estandar abierto para lo que es núcleo del procesador.
Realmente no tengo experiencia con ARM (todavía :p), pero estuve recientemente en una charla donde tocaban ese tema.

No incluye los periféricos que son particulares de cada fabricante, pero sí las funciones del núcleo (reloj, inicialización del núcleo, definición de interrupciones, manejo de memoria).

Ventaja?: portabilidad, por lo menos para los aspectos relacionados con el núcleo. No debería haber diferencia al pasar de un micro ARM cortex Mx de NXP a uno de Toshiba, ST, etc.

http://www.keil.com/support/man/docs/gsac/gsac_cmsisoverview.htm
 
Yendo al tema de las librerías y periféricos en ARM, creo que hay que mencionar que existe el CMSIS que es un estandar abierto para lo que es núcleo del procesador.
Realmente no tengo experiencia con ARM (todavía :p), pero estuve recientemente en una charla donde tocaban ese tema.

No incluye los periféricos que son particulares de cada fabricante, pero sí las funciones del núcleo (reloj, inicialización del núcleo, definición de interrupciones, manejo de memoria).

Ventaja?: portabilidad, por lo menos para los aspectos relacionados con el núcleo. No debería haber diferencia al pasar de un micro ARM cortex Mx de NXP a uno de Toshiba, ST, etc.

http://www.keil.com/support/man/docs/gsac/gsac_cmsisoverview.htm

Algo estuve viendo de lo que mencionó Hellmut1956 y hasta ahora llegué a tu misma conclusión acerca del CMSIS, solo tienen los registros y un archivo de startup en común con todos los fabricantes.

Las funciones para manejar los periféricos las tenés que hacer vos o a lo sumo usar alguna librería que pueda traer el entorno de desarrollo, por ej. Coocox. Después también hay algo llamado mbed que son librerías.

Por otro lado, si vemos el videotutorial de Cortex M0 usando STM32f:LOL:iscovery que subió Pablet, el manejo de los registros es muy similar, a pesar de hablar de otro fabricante y Cortex M0 (no M3).
 
Última edición:
Muchachos

me recomendaron esta interface para comunicarme con la placa, leer y hacer debugging

USB-MiniJTAG-EX J-Link JTAG/SWD Debugger/Emula​tor ( la empresa es haoyu electronics)

que opinan?

Saludos
 
Me compre una LPC1768-MINI-DK2 estoy usando el keil y el flash magic. El tema es que arme un proyecto para probar y cuando lo compilo tengo problemas. me tira el siguiente error:
ej1.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o).
inclui el startup del lpc1768 (*.s) y el header file LPC17xx (*.h)

Tenes una idea de lo que puede ser?
Gracias
SAludos
 
Me compre una LPC1768-MINI-DK2 estoy usando el keil y el flash magic. El tema es que arme un proyecto para probar y cuando lo compilo tengo problemas. me tira el siguiente error:
ej1.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o).
inclui el startup del lpc1768 (*.s) y el header file LPC17xx (*.h)

Tenes una idea de lo que puede ser?
Gracias
SAludos

Fijate en el tutorial que armé que subí varios ejercicios, entre ellos el proyecto en keil de c/u, miralos y tomalos como base de partida.

Lo que te está faltando son justamente esos 2 archivos (o uno de los dos) que por un lado definen el área de memoria y un par de cosas más y por el lado del ".h" los nombres de los registros. El startup lo encontrás en el directorio del keil.
 
Cosmefulanito,

Gracias por la ayuda con el Keil. Estuve probando alguno de tus proyectos y me funcionaron.
Te quería preguntar si tenes algún ejemplo de como usar el ADC de la placa.
Gracias
 
Tenés un tutorial gigante dividido en los distintos periféricos, leelo. Además dale bola a la hoja de datos que ahí tenés la información justa.

Sexta parte - ADC

Funciones destacadas que se explican en el tutorial:

PHP:
void iniciar_adc(u8 canal,u8 offset)

PHP:
int convertir_adc(u8 canal,u8 pre_escaler_interno,u16 *valor_adc)

PHP:
void ADC_IRQHandler (void)
 
Cosmefulanito, sos un groso!!!
Muchas gracias por el aporte, excelente post.
Ojala todos pudiesemos compartir nuestra experiencia en este foro.
Me baje el proyecto, lo pruebo y comento
Gracias!!!!
 
Estuve luburando con el ADC, que pusiste de ejemplo. Tengo un problema y quería ver si se puede solucionar como pensé. El tema es que la variable del valor convertido (valor_adc) es de tipo u16. Yo queiro mostrar este valor en la pantalla LCD. el problema es que la función GUI_text del lcd me pido este tipo de parametros.

void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor)

Si yo pongo esto GUI_Text(60,144,"Peso",White,Blue); me muestra perfectamente en pantalla la palabra peso. Pero no puedo hacer que me muestre el valor de la conversión

Como me pide un string estaba pensando en hace un sprintf de valor_adc y así pasarle ese valor directamente a la función del GUI_TEXT, para que me lo muestre en pantalla. EL tema es que el sprintf no le gusta muestra cualquier fruta. Vos para mandar por la UART convertis el dato adc a palabra. Se podría usar la misma función o conoces otra forma más eficiente
 
...Como me pide un string estaba pensando en hace un sprintf de valor_adc y así pasarle ese valor directamente a la función del GUI_TEXT, para que me lo muestre en pantalla. EL tema es que el sprintf no le gusta muestra cualquier fruta.

Eso debería funcionar, ¿cómo lo estás usando? (utilizá la herramienta "php" del foro para poner código)

...Vos para mandar por la UART convertis el dato adc a palabra. Se podría usar la misma función o conoces otra forma más eficiente

También te sirve, de hecho lo pensé para evitar el sprintf, o sea, en un ARM mucho sentido no tiene porque tenés Flash para rato, pero en uC más chicos se complica su uso y como ya tenía el código implementado en AVR, lo volví a usar en ARM.

Lo único que tenés que hacer es pasarle un vector u8 con 5 elementos, seguido del u16 que necesitás convertir, al finalizar en el vector tenés el u16 convertido en string.

La función:

PHP:
void convertir_digitos_u16_serie(u8 digitos[],u16 dato)
{
	u8 aux;
	
	for(aux=4;aux>0;aux--)
		{
		digitos[aux]=(dato%10)+0x30;
		dato=(int)(dato/10);
		}
		
	digitos[0]=dato+0x30;
}

La usas así:

PHP:
....
u8 string_u16[5];
u16 dato=5600;

convertir_digitos_u16_serie(string_u16,dato);

GUI_Text(60,144,string_u16,White,Blue);

De última cambiale el nombre a la función, sacale el "serie".
 
Última edición:
Gracias capo, funcionó perfecto, yo lo había hecho antes eso, pero se ve que tenía un quilombo de librerías porque hay cosas que no me las toma bien. Lo que pasa es que importé las librerías del CMSIS para que funcione el GLCD y el touchscreen. Algo tengo mal.

Si podes ver en al adjunto que mando, es lo que sale por la UART. El mismo programa me funcionaba perfecto antes, es el ejemplo que compartiste en el foro. Pero el tema que ahora me salen símbolos, puede ser que tenga que ver con el LPC1768.h? o el lpc1768_libcfg?

Desde ya muchas gracias por la ayuda con lo del ADC
Saludos
 

Adjuntos

  • UART.jpg
    UART.jpg
    36 KB · Visitas: 17
Gracias capo, funcionó perfecto, yo lo había hecho antes eso, pero se ve que tenía un quilombo de librerías porque hay cosas que no me las toma bien. Lo que pasa es que importé las librerías del CMSIS para que funcione el GLCD y el touchscreen. Algo tengo mal.

Si podes ver en al adjunto que mando, es lo que sale por la UART. El mismo programa me funcionaba perfecto antes, es el ejemplo que compartiste en el foro. Pero el tema que ahora me salen símbolos, puede ser que tenga que ver con el LPC1768.h? o el lpc1768_libcfg?

Desde ya muchas gracias por la ayuda con lo del ADC
Saludos

Puede ser que no esté bien configurada la velocidad.

La librería "lpc1768_libcfg" ¿qué hace?, tal vez te cambia el PLL.
 
No creo que sea un problema de velocidad, porque cuando cambio la opción, el valor que muestra por la UART cambia. O sea los simbolos cambian pero no son letras sino simbolos.
NO se pensé que quizás tenga un header file diferente. Voy a seguir investigando.

Che por casualidad estuviste viendo como colocar un boton en la pantalla LCD, ayer comencé a investigar y trabaja mucho con matrices. Mi idea es colocar un pulsador tactil y cuando toco el pulsador que me ejecute una tarea. Estuve revisando la función de calibración del LCD, que plantea algo parecido a lo que quiero. VOy a seguir investigando eso también. Si tengo novedades las comparto

Gracias
 
No creo que sea un problema de velocidad, porque cuando cambio la opción, el valor que muestra por la UART cambia. O sea los simbolos cambian pero no son letras sino simbolos.
NO se pensé que quizás tenga un header file diferente. Voy a seguir investigando.

No entendí bien esto, ¿vos decís que los símbolos cambian según el caracter que mandás?

Si así, eso es normal, tener la velocidad mal configuradad implica recibir cualquier cosa debido a que el receptor está tomando mal los bits que recibe, pero esa "cualquier cosa" que recibís es repetible, es decir que si mando 'b' y recibo '@', eso se repetirá siempre.

Hacé una prueba fácil, envía un caracter y fijate si del otro lado lo recibís bien, en ese caso no es un problema de velocidad.

Che por casualidad estuviste viendo como colocar un boton en la pantalla LCD, ayer comencé a investigar y trabaja mucho con matrices. Mi idea es colocar un pulsador tactil y cuando toco el pulsador que me ejecute una tarea. Estuve revisando la función de calibración del LCD, que plantea algo parecido a lo que quiero. VOy a seguir investigando eso también. Si tengo novedades las comparto

No compré la pantalla, preferí ver bien el tema del USB y el ethernet, pero de momento no lo toqué :oops:.
 
Hola!

Estoy aprendiendo a usar este dispositivo, de momento no he hecho gran cosa, en clase nos han recomendado hacer este ejercicio para ir practicando, como todavía no tengo la placa en casa y el simulador no se usarlo demasiado bien, me gustaría que me dijeran si voy por buen camino, el enunciado es el siguiente:

El programa a desarrollar en C deberá ser capaz de leer el pulsador SW2 dispuesto en la
tarjeta en el puerto 2 (pin 2.12), y en función de su estado encender parpadeando uno
u otro LED’s de los dos que también tiene la tarjeta en el puerto 1 (pines 1.18 y 1.29).
El modo de funcionamiento será el siguiente: si el pulsador se encuentra pulsado se
deberá parpadear uno de los LED (cualquiera de los dos) con intervalos de medio
segundo encendido medio segundo apagado. Si el pulsador no está pulsado deberá
parpadear el otro LED con intervalos de 1 segundo encendido 1 segundo apagado.

Esto es lo que he programado yo, he intentado aclarar con comentarios cada paso:
Código:
#include <LPC17xx.H>

#define CONST_500ms_100MHz 10000000  //Retardo de 500ms   

#define SW2 (1<<12)			 //Puerto 2.12  pinsel 4
#define LED_1 (1<<18)    //Puerto 1.18  pinsel 3
#define LED_2 (1<<19)    //Puerto 1.19  pinsel 3


void retardo(int32_t tiempo)
{
   int32_t i;
	
   //El bucle for tarda 25 ms a 100MHz
   for(i=0;i<tiempo;i++);
}

int main()
{    

	LPC_PINCON->PINSEL4=0;
	LPC_PINCON->PINSEL3=0;
	
	LPC_GPIO2->FIODIR=0x00000000;	//Defino al puerto 2 como entrada SW2
	
	LPC_GPIO1->FIODIR|=LED_1;		//Defino al puerto 1.18 como salida
	LPC_GPIO1->FIODIR|=LED_2;	 //Defino al puerto 1.19 como salida
    
    while(1)
    {        
        if(LPC_GPIO2->FIOPIN&=SW2)	//Si el pulsador SW2 es pulsado
        {
					
		LPC_GPIO1->FIOSET=LED_1;  //Apago el LED_1  (se enciende a nivel bajo)
		LPC_GPIO1->FIOSET=LED_2;	//Enciendo el LED_2  (se enciende a nivel alto)					
		retardo (CONST_500ms_100MHz); //retardo de 0.5 segundos
				
	}
        else
        {
					
		LPC_GPIO1->FIOCLR=LED_1;  //Enciendo el LED_1  (se enciende a nivel bajo)
		LPC_GPIO1->FIOCLR=LED_2;	//Enciendo el LED_2  (se enciende a nivel alto)
					
		retardo (CONST_500ms_100MHz*2); //retardo de 1 segundo
					
	}
        
    }
}
el programa compila, pero hay cosas que no estoy muy segura de si están bien, como por ejemplo el SW2, no se si al pulsarlo da como resultado nivel alto o bajo, porque al ejecutar paso a paso el programa siempre se mete en la condición if.

Muchas gracias!!
 
Última edición:
No me convence el operador "&=" en el if, ya que esa es una operación para asignar el valor del and binario entre dos variables, ejemplo:

PHP:
variable_1&=varible_2;

Lo que vos querés hacer es un simple and:

PHP:
if(LPC_GPIO2->FIOPIN&SW2)
...

El resto parece estar bien, habría que ver si esa rutina de espera te sirve o no, pero eso lo ves en la práctica.
 
Cosmefulanito, como estas, te quería preguntar si a vos te paso que el valor de conversión de adc oscile. Es decir, yo tengo mi programa cuando le pongo una tensión fija (conectandolo a los 3,3v de la placa minidk2) el valor adc es constante y esta quietoo. Lo mismo si le inyecto gnd.
Pero cuando lo conecto a mi amplificador, el cual amplifica una señal de una celda de carga, la entrada al adc esta fija porque la estoy midiendo con un tester. Pero el valor de conversión de adc oscila cíclicamente entre ciertos valores cada 1seg.

Puede ser algo de la velocidad de trabajo?
gracias
 
Es normal eso y depende mucho de lo que estas midiendo.

Varias formas de mejorar esa oscilación:

  • Reducir la velocidad de conversión es una buena idea, introducís menos ruido en la conversión.
  • Colocar un filtro pasa bajos R-C a la entrada para reducir el ancho de banda, menos ancho de banda, menos ruido.
  • Realizar un promedio móvil de las conversiones que vas haciendo, esto funciona como un filtro pasa bajos hecho por soft.
 
Atrás
Arriba