TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: planeta9999 en 05 de Mayo de 2017, 19:27:22

Título: Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 05 de Mayo de 2017, 19:27:22
.

Me decidí, ayer recibí los micros Atmel SAM S70 que pedí a Mouser, también un Kinetis MK26 porque descubrí que es igual que el MK66 pero sin Ethernet y más barato. Voy a usar el SAM S70 para reemplazar el Kinetis MK66 en uno de mis diseños actuales, a veremos que tal, me parece un micro fantástico, Cortex M7, 300Mhz, 2Mb de Flash, en TQFP100, TQFP144 y varios BGA, y además es más barato que muchos M4 (a 7-8€ en Microchip Direct desde una pieza).

Si todo me sale como espero, dejaré de usar los STM32 y los Kinetis y me quedaré únicamente con los SAM de Atmel. También tienen otros Cortex, M0, M3 y M4, que aún deben de ser más baratos. La compra directamente a Microchip Direct, los M7 están entre los 7 y 8€ desde una pieza. Además de nuevo he podido volver a pedir samples a Microchip/Atmel con un pequeño truco, porque mis dominios estaban sin web desde hacía tiempo y por hotmail/gmail y similares no te hacen ni caso, he agotado mi cupo de 3 pedidos/mes, con 18 micros SAM S70 TQFP100 y algunos TQFP144.

He pedido a Mouser una placa de evaluación SAME70-XPLD para los SAM E70 (igual que el S70, pero con Can bus y Ethernet). Me he pillado el manual de esta placa de evaluación, para ver los esquemas, y más o menos lo veo todo claro, salvo algunos detalles. En los esquemas se ve el oscilador a cuarzo de 12Mhz, con sus dos condensadores, ninguna resistencia de por medio, ni la típica en serie en una patilla del cuarzo, ni la típica de 1Mohm en paralelo.

El acceso para programar/debugear, sin problemas por SWD;  SWDCLK, SWDIO, GND, +3v3 y RESET. Aunque no tengo muy claro si el RESET es necesario, con los STM32 si no cableas el RESET no puedes hacer Debug (comprobado), en otros micros he leído que no es necesario. Por si acaso, cablearé ese pin, mejor que esté y no haga falta.

En el USB, veo ese bloque de diodos TVS, supongo que para proteger el puerto de la estática. Nunca los he instalado en mis diseños con micros y USB, no se si son importantes. Me llama la atención el montón de condensadores de desacoplo que necesita, cuento 14 en el esquema (me parece una barbaridad), supongo que en los TQFP100 serán menos.

El tarjetero SD, con acceso paralelo a 4 bit, bueno lo probaré, por ahora mis tarjeteros SD iban por SPI, supongo que el SDHC/SDIO a 4bit debe de ser mucho más rápido. Lo que me desconcierta del esquema son las resistencias de pull-up en todas las lineas. No he profundizado todavía en este micro, pero supongo que al igual que los STM32 o los Kinetis se podrán activar resistencias internas de pull-up o pull-down en cualquier puerto, ¿ entonces para que ponen resistencias en placa ?.

Y creo que nada más. El footprint con su símbolo para el SAM S70, como era de esperar no lo he encontrado, pero lo solucioné rápido pillando el encapsulado TQFP100 y TQFP144, y como símbolo modificando unos que he encontrado para otros SAM M0 y M4.

Entorno de desarrollo, Atmel Studio con GCC. Ya lo he estado tanteando y es muy similar a Eclipse, sin problemas, muy bien documentado, con todas sus librerías y un generador de código muy similar al Cube de ST.  Programador/Debugger, el Jlink de Segger o el Atmel ICE que compré en Mouser.


(http://i1322.photobucket.com/albums/u573/planeta9999/DSC_0074_zpsjl8j5v99.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_005_zpsdz0z8tr3.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_006_zps1eaqjlsg.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_007_zpsv0atdkex.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_008_zpsj8cigryw.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_009_zpsypcfsud0.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_010_zpsiv22cibn.jpg)
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: elgarbe en 05 de Mayo de 2017, 19:51:42
Felicitaciones por el salto!!!
Mantenenos al tanto de los avances!

En los esquemas se ve el oscilador a cuarzo de 12Mhz, con sus dos condensadores, ninguna resistencia de por medio, ni la típica en serie en una patilla del cuarzo, ni la típica de 1Mhz en paralelo.

Nunca usé esas resistencias en ningun diseño con ningun micro... Me parece que con los cuarzos comunes esas resistencias no son necesarias.

El tarjetero SD, con acceso paralelo a 4 bit, bueno lo probaré, por ahora mis tarjeteros SD iban por SPI, supongo que el SDHC/SDIO a 4bit debe de ser mucho más rápido. Lo que me desconcierta del esquema son las resistencias de pull-up en todas las lineas. No he profundizado todavía en este micro, pero supongo que al igual que los STM32 o los Kinetis se podrán activar resistencias

Seguro trae pull up/down, pero tengo entendido que son weak pull Down/Up, por ejemplo, no se pueden utilizar como terminacion de un I2C. Cuando necesitas un poco de fuerza en la señal debes ponerlas externas. O por lo menos eso tenía entendido.

En el USB, veo ese bloque de diodos TVS, supongo que para proteger el puerto de la estática. Nunca los he instalado en mis diseños con micros y USB, no se si son importantes. Me llama la atención el montón de condensadores de desacoplo que necesita, cuento 14 en el esquema (me parece una barbaridad), supongo que en los TQFP100 serán menos.

Esos TVS están en todos los equipos comerciales buenos. Son imprescindibles para equipos que van a estar fuera de tu taller.

Saludos!
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 05 de Mayo de 2017, 20:20:30
Felicitaciones por el salto!!!
Mantenenos al tanto de los avances!

Gracias, iré posteando todo lo que vaya probando. Ahora estoy con el esquema, y creo que la semana que viene enviaré a fabricar el PCB a los chinos.


Citar
Nunca usé esas resistencias en ningun diseño con ningun micro... Me parece que con los cuarzos comunes esas resistencias no son necesarias.

Pues no tengo ni idea, por ejemplo en los esquemas de las FRDM de NXP, les meten la de 1Mega en paralelo, y en el de las Discovery de ST le ponen una resistencia en serie con una de las patillas del cuarzo.


Citar
Seguro trae pull up/down, pero tengo entendido que son weak pull Down/Up, por ejemplo, no se pueden utilizar como terminacion de un I2C. Cuando necesitas un poco de fuerza en la señal debes ponerlas externas. O por lo menos eso tenía entendido.


Desconocía eso. De todas formas mirando los esquemas de las placas de evaluación FRDM de NXP, no les ponen resistencias externas de pull-up, ni al tarjetero por SDHC ni al que va por SPI. Pondré las resistencias en el PCB y probaré a ver si funciona con y sin resistencias.

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_001_zpstdhdxygt.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_002_zpsqsjojtyr.jpg)


Citar
Esos TVS están en todos los equipos comerciales buenos. Son imprescindibles para equipos que van a estar fuera de tu taller.

Si no me complica mucho el ensamblaje, igual los pongo, o al menos los dejo en el PCB y ya veré si los instalo.


Saludos.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: KILLERJC en 05 de Mayo de 2017, 21:18:18
Por lo que lei el unico pin que posee pull-up de las tarjetas es el CS ( Pin 1 ) en modo SPI. Los demas no necesitan ningun pull-up. Que las tarjetas ya traen de forma interna

Por las respuestas sobre una placa MSP430 realizada por TI, las resistencias simplemente estan para que cuando inicia el micro hasta que se configuran las salidas como SPI, los pines de SCK/DI/DO no esten en flotando. Es decir que tengan un estado conocido asi la tarjeta no entra en un "posible" estado erroneo.

Pero aca va el tema, la misma persona que respondio eso, dice que en sus diseños jamas puso una resistencia alli (pero considera buena practica dejarle lugar), pero si una pequeña de 33ohms en VCC ya que tuvo problemas de que la corriente (inrush current) al insertar la tarjeta le reseteaba el microcontrolador, Y como una resistencia es mas barata que agrandar el capacitor la usa... ( Lo comento por si alguno le pasa, aunque siempre sobredimensionamos el capacitor de entrada ).

Siguiendo sobre el tema, lo que es mas absurdo es que si posee una pull-up en el CS (me refiero a internamente las SD), implica que no deberia recibir nada por SCK/DI/DO y no entrar en ningun estado "erroneo". pero se dejaria flotando las entradas que si importa el tema del consumo se sabe bien que no debe dejarse entradas flotando sino que deben estar conectadas por un pull-up o a GND.

La otra version dando vuelta es por la del SPI, que con el mismo SPI se podria manejar otros dispositivos mas. Pero lo veo insensato a esto.

------------------

Buscando sobre alguna otra, veo que las tarjetas SD Toshiba

https://www.mikrocontroller.net/attachment/21920/SDHC_SDM04G7B7_08G7B7.pdf

Dice que hay algunas entradas que necesitan si o si el pull-up en modo SPI. (pin 8 y 9)
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: elgarbe en 05 de Mayo de 2017, 21:37:58
No recuerdo si tenía habilitadas las pull up internas, pero en un diseño que hice con el F411 si no ponia pull ups en las lineas de datos (MOSI, MISO) del orden de 47K, la uSD no me funcionaba, o por lo menos no a velocidades altas. Si mal no recuerdo leí sobre el uso de dichas resistencias. A partir de ese momento, siempre pongo PU en esas lineas en las SD...

Saludos!
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 05 de Mayo de 2017, 22:47:23
.

Gracias Killer y elgarbe.
Mis experiencias con los STM32 quitando las resistencias de pullup en el tarjetero SD por SPI, no fueron buenas, la tarjeta me hacía cosas raras y al final las dejé puestas. Si que pude quitar unas resistencias de pullup que tenía en unos pulsadores, eso fue perfecto con las resistencias internas activadas por software.

Por si acaso, en el diseño con el SAM S70, pondré las resistencias, que además están en el esquema de la placa de evaluación de Atmel. Cuando lo monte todo, probaré sin las resistencias a ver que pasa, y si falla las pongo y arreglado.

Cuando hago placas propias, me fijo en los esquemas de las placas de evaluación del fabricante, y copio lo mismo. Por ejemplo las resistencias que algunos fabricantes ponen en el cuarzo, otros no las ponen. Con el tarjetero SD, pasa lo mismo, ahí están los esquemas de NXP en sus placas FRDM, con el tarjetero SDHC y SPI sin resistencias de pullup externas, sin embargo Atmel si que las pone en su placa para los SAM S70, ST creo que también las pone en la Discovery.

No tengo ni idea de porque unos ponen resistencias y otros no, cuando el tarjetero y la tarjeta son las mismas. Lo mismo me pasa con el cuarzo, ni idea de porque unos le ponen resistencias y otros no. Para no meter la pata, pongo lo mismo que ha puesto el fabricante y luego ya probaré a quitar y poner.

Con el USB, nunca he tenido problemas a pesar de no poner nunca los TVS, pero los pondré en el esquema para que salgan en el PCB, luego ya veré si los monto o no. Lo he mirado en los polacos y es un componente barato, de ponerlo ya dependerá de la pereza que tenga a la hora de ensamblar, suelo poner lo justo y necesario para ahorrar tiempo en el ensamblaje.

Si tengo que poner resistencias en el tarjetero SD, miraré de usar unos arrays SMD, no los he usado nunca, y los que tengo de muestras me parecen super enanos, pero bueno, posicionándolos a microscopio espero que no pierda mucho tiempo, además el microcontrolador siempre lo posiciono a microscopio, aprovecharé para colocar bien los arrays.

Lo que no me gusta nada, son los 14 condensadores de desacoplo, que burrada. Como es posible que termine montando el chip de 100 pines, puede que me ahorre algunos condensadores.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 06 de Mayo de 2017, 01:43:23
.

Fundamental, para mi, para desarrollos comerciales con micros, disponer de un buen bootloader encriptado. He tenido suerte, en la web de Atmel te lo dan para los SAM V7/E7/S7, con código fuente y gratuito.

Este booloader se comunica por USB, es el único inconveniente, porque todas mis placas se actualizan con tarjetas micro SD, así que a este booloader le tendré que añadir código para gestionar tarjetas SD con FAT/FAT32. No creo que sea mayor problema, porque las librerías que suministran incluyen gestión de tarjetas SD y volúmenes FAT/FAT32, no recuerdo si es con FATFS u otras librerias. Encripta con el algoritmo AES CBC (creo que con una clave de 128 bit).

(http://www.todopic.com.ar/foros/imgtiny/rjeer8.jpg)

(http://www.todopic.com.ar/foros/imgtiny/2qu44z6.jpg)


Esta es la nota aplicativa del bootloader encriptado y las descargas del manual en PDF, fuentes, binarios y aplicativo para el PC para Windows y Linux. El aplicativo para PC, permite encriptar entrando la clave que queramos, previo a enviar el binario, o tambien guardarlo encriptado en el disco duro.

AT16743: SAM V7/E7/S7 Safe and Secure Bootloader
(file size: 925KB, 25 pages, revision A, updated: 06/2016)
This application note discusses the boot sequence, upgrade sequence, safety, and security in bootloader. It also provides an example bootloader implementation for Atmel SAM V7/E7/S7 ARM Cortex-M7 based microcontrollers.

http://www.atmel.com/Images/Atmel-42725-Safe-and-Secure-Bootloader-for-SAM-V7-E7-S7-MCUs_AT16743_ApplicationNote.pdf

http://www.atmel.com/Images/Atmel-42725-Safe-and-Secure-Bootloader-for-SAM-V7-E7-S7-MCUs_AT16743_ApplicationNote.zip


Las direcciones de ubicación del bootloader y de la aplicación de usuario están documentadas en el manual, así como las modificaciones a realizar en el linker script para compilar la aplicacion de usuario:

(http://www.todopic.com.ar/foros/imgtiny/2rxdx76.jpg)


El producto es casi perfecto, si soportara bootloader por tarjeta SD sería de 10. La verdad es que este aplicativo me ha ahorrado mucha faena. Siempre que toco una nueva familia de micros, lo primero que busco es un buen bootloader, encriptado y por tarjetero SD, si no existe lo tengo que programar, en este caso está hecho al 90% de lo que necesito.

Esta nota aplicativa sobre la seguridad en los sistemas de actualización de firmware con bootloaders, se ve interesante.
http://www.atmel.com/images/doc6253.pdf

Me atrae sobre todo ver los de la "hash function" y las firmas digitales para preservar la integridad del firmware encriptado, es algo que nunca he contemplado en mis bootloader encriptados.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 06 de Mayo de 2017, 04:12:05
.

En el manual del SAM S70, ponen que la resistencia (de 1K) en serie con el cuarzo, solo es necesaria si el cuarzo es de una frecuencia inferior a 8Mhz. En mi caso el cuarzo será de 12 Mhz, igual que en la placa de evaluación. 

Tal vez esta regla, sirva para otros micros, no lo se, las Discovery llevan cuarzo de 8Mhz y una resistencia en serie de 220 ohm.


(http://www.todopic.com.ar/foros/imgtiny/x1nced.jpg)
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 08 de Mayo de 2017, 09:29:52
.

Me llegó el nuevo juguete, a veremos que tal. Es una placa de evaluación Xplained de Atmel con un Cortex M7 SAME70, 300Mhz, 2Mb Flash, 384K RAM, TQFP144. 38 euros en Mouser.

El Atmel Studio no está mal, pero le faltan algunos detalles para ser tan bueno como el de ST, de aspecto es un calco de Visual Studio. Le tengo muchas ganas a este micro, las prestaciones y el precio son muy buenos.


(http://www.todopic.com.ar/foros/imgtiny/n3sqbn.jpg)


(http://www.todopic.com.ar/foros/imgtiny/2hgel4y.jpg)


(http://www.todopic.com.ar/foros/imgtiny/r1wvmr.jpg)


(http://www.todopic.com.ar/foros/imgtiny/2drrr60.jpg)


(http://www.todopic.com.ar/foros/imgtiny/4rc2lg.jpg)


(http://www.todopic.com.ar/foros/imgtiny/2u40wuf.jpg)

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: george.manson.69 en 08 de Mayo de 2017, 11:11:44


(http://www.todopic.com.ar/foros/imgtiny/n3sqbn.jpg)



Se ve muy buena la placa, espero que subas avances con esta tarjeta para ver si me compro una,

¡Saludos!
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: juaperser1 en 09 de Mayo de 2017, 08:46:26
¿como van las actualizaciones del software para atmel desde que lo compro microchip, están al día o parece que se van estancando?



Un saludo
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 09 de Mayo de 2017, 09:31:39
¿como van las actualizaciones del software para atmel desde que lo compro microchip, están al día o parece que se van estancando?

Un saludo

Yo de Atmel apenas se nada. Solo usé algunos micros de 8 bit en el 2001, y nunca mas volví a usar chips de Atmel.

La documentación que facilitan la veo muy bien, y los samples que he pedido ya me los han enviado.

Por cierto NXP, un cero patatero en samples, y eso que te cobran 18€ por el transporte, hace una semana que los pedí y todavia estan en estado "pendiente".
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 08:10:24
.

Aleluya, me llegaron los samples, han tardado 2 semanas, aunque ya tenía algunas unidades que pedí a Mouser. Hoy recibí 18 micros SAM S70 en TQFP100 y 144 pines. Hace unos días diseñé una placa de evaluación para el SAM S70 de 100 pines, que ya envié a fabricar a ALLPCB.

He estado probando Atmel Studio y sin problemas. También tengo la placa de evaluación SAM E70 Xplained y programador Atmel ICE.

En definitiva, ya tengo todo para poder empezar a probar este potentísimo y barato micro Cortex M7. Lo complicado es portar un proyecto hecho para Teensy con Arduino, a este micro.


(http://i1322.photobucket.com/albums/u573/planeta9999/samples_002_zpsxtx3w1lw.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/samples_003_zpsjik6oscn.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_002_zpshtl3ont3.jpg)





Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 10:50:17
Me suscribo. Enhorabuena.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 11:04:57
.

Cada vez que miro lo de los cores de Arduino, me dan mareos, es un galimatías terrible.

Ya lo podían haber documentado mejor, pillo algunas cosas, pero no hay un patrón a seguir. La asignación de puertos a direcciones de memoria es lo único que veo claro, algo menos claro el tema de las interrupciones, el resto ni papa. También meten muchos defines para constantes, como Pi y otras, pero sin ningún orden ni concierto, es una anarquía total.

Picuino, tú que eres un experto en Arduino, ¿ esto de los cores no lo has tocado ?.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 11:15:29
.

Ejemplos que cosas que me encuentro definidas en el core del Teeny, que se utilizan en el programa. No entiendo, como están definiendo el multiplexado de funciones por pin. Veo que en el fichero core_pins.h definen con otra definición que apunta finalmente al fichero kinetis.h, donde asignan a direcciones de memoria concretas.

Otra cosa que no entiendo es cuando definen con un numero, por ejemplo en estas lineas, ese número no se o que es, intuyo que es el pin del chip, pero no veo que lo relacionen con un puerto concreto.

#define CORE_PIN0_BIT      16
#define CORE_PIN1_BIT      17
#define CORE_PIN2_BIT      0
#define CORE_PIN3_BIT      12
#define CORE_PIN4_BIT      13
 



En el programa

// Input pins
const static uint8_t  DMD_ROW_DATA = 17;
#define DMD_ROW_DATA_BITMASK CORE_PIN17_BITMASK
const static uint8_t  DMD_ROW_CLK = 16;
#define DMD_ROW_CLK_BITMASK CORE_PIN16_BITMASK
const static uint8_t  DMD_DOT_LATCH = 18;
#define DMD_DOT_LATCH_BITMASK CORE_PIN18_BITMASK
const static uint8_t  DMD_OE = 19;
#define DMD_OE_BITMASK CORE_PIN19_BITMASK

// CORE_PIN11_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
CORE_PIN12_CONFIG = PORT_PCR_MUX(2) | PORT_PCR_PE;
CORE_PIN13_CONFIG = PORT_PCR_MUX(2);


En el fichero core_pins.h

#define CORE_PIN18_BIT      3

#define CORE_PIN12_CONFIG   PORTC_PCR7
#define CORE_PIN13_CONFIG   PORTC_PCR5

#define CORE_PIN16_BITMASK   (1<<(CORE_PIN16_BIT))
#define CORE_PIN17_BITMASK   (1<<(CORE_PIN17_BIT))
#define CORE_PIN18_BITMASK   (1<<(CORE_PIN18_BIT))
#define CORE_PIN19_BITMASK   (1<<(CORE_PIN19_BIT))


En el fichero kinetis.h

#define PORTC_PCR5      (*(volatile uint32_t *)0x4004B014) // Pin Control Register n
#define PORTC_PCR6      (*(volatile uint32_t *)0x4004B018) // Pin Control Register n
#define PORTC_PCR7      (*(volatile uint32_t *)0x4004B01C) // Pin Control Register n

#define PORT_PCR_MUX(n)         ((uint32_t)(((n) & 7) << 8 ))   // Pin Mux Control

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 11:36:51
No soy experto en Arduino, la diferencia con otros foreros es que he trabajado algo en esa plataforma.
Los cores los he tocado poco, pero no me parece difícil. ¿Qué es lo que quieres saber en concreto?
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 11:45:24
.

Hay unas cuantas cosas que no cazo.

Por ejemplo, a muchas definiciones, les asigna unos números.

#define CORE_PIN0_BIT      16
#define CORE_PIN1_BIT      17
#define CORE_PIN2_BIT      0
#define CORE_PIN3_BIT      12
#define CORE_PIN4_BIT      13


En cuando a definiciones, hay varios tipos:

#define CORE_PIN0_BIT      16
#define CORE_PIN1_BIT      17
#define CORE_PIN2_BIT      0

#define CORE_PIN0_BITMASK   (1<<(CORE_PIN0_BIT))
#define CORE_PIN1_BITMASK   (1<<(CORE_PIN1_BIT))
#define CORE_PIN2_BITMASK   (1<<(CORE_PIN2_BIT))

#define CORE_PIN0_PORTREG   GPIOB_PDOR
#define CORE_PIN1_PORTREG   GPIOB_PDOR
#define CORE_PIN2_PORTREG   GPIOD_PDOR

#define CORE_PIN0_PORTSET   GPIOB_PSOR
#define CORE_PIN1_PORTSET   GPIOB_PSOR
#define CORE_PIN2_PORTSET   GPIOD_PSOR

#define CORE_PIN0_PORTCLEAR   GPIOB_PCOR
#define CORE_PIN1_PORTCLEAR   GPIOB_PCOR
#define CORE_PIN2_PORTCLEAR   GPIOD_PCOR

#define CORE_PIN0_DDRREG   GPIOB_PDDR
#define CORE_PIN1_DDRREG   GPIOB_PDDR
#define CORE_PIN2_DDRREG   GPIOD_PDDR

#define CORE_PIN0_PINREG   GPIOB_PDIR
#define CORE_PIN1_PINREG   GPIOB_PDIR
#define CORE_PIN2_PINREG   GPIOD_PDIR

#define CORE_PIN0_CONFIG   PORTB_PCR16
#define CORE_PIN1_CONFIG   PORTB_PCR17
#define CORE_PIN2_CONFIG   PORTD_PCR0

#define CORE_ADC0_PIN      14
#define CORE_ADC1_PIN      15
#define CORE_ADC2_PIN      16

#define CORE_RXD0_PIN      0
#define CORE_TXD0_PIN      1
#define CORE_RXD1_PIN      9

#define CORE_INT0_PIN      0
#define CORE_INT1_PIN      1
#define CORE_INT2_PIN      2


Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 11:54:27
Has respondido casi a la vez.

Vamos por partes. Yo interpreto la siguiente cadena que debe existir para todos los pines:

1º El número de pin lo defines tú. No tiene nada que ver con el core. Depende de la placa de evaluación. Lo lógico es que los pines vayan creciendo en numeración a lo largo del borde de la placa. En arduino Uno son estos (del 0 al 13 y del A0 al A5):
(http://static.arduino.org/media/k2/galleries/90/A000066-Arduino-Uno-TH-1front.jpg)

2º Cada número de pin en la placa irá conectado a un pin del microcontrolador. En este caso hay que definir qué registros y qué bit en esos registros corresponden al pin de la placa:
https://github.com/PaulStoffregen/cores/blob/master/teensy3/core_pins.h
Código: C
  1. #define CORE_PIN18_BIT      3      // bit correspondiente al pin18 (de la placa)
  2. #define CORE_PIN18_BITMASK   (1<<(CORE_PIN18_BIT))   // Máscara de bit correspondiente al pin18
  3. #define CORE_PIN18_PORTREG      GPIOB_PDOR    // Port Data Output Register del pin 18
  4. #define CORE_PIN18_PORTSET      GPIOB_PSOR    // Port Set Output Register
  5. #define CORE_PIN18_PORTCLEAR    GPIOB_PCOR    // Port Clear Output Register
  6. #define CORE_PIN18_DDRREG       GPIOB_PDDR    // Port Data Direction Register
  7. #define CORE_PIN18_PINREG       GPIOB_PDIR     // Port Data Input Register
  8. #define CORE_PIN18_CONFIG       PORTB_PCR3      // Pin Control Register n

3º Ahora hay que definir qué direcciones físicas tienen esos registros definidos anteriormente (depende del microcontrolador):
https://github.com/PaulStoffregen/cores/blob/master/teensy3/kinetis.h
Código: C
  1. #define GPIOB_PDOR      (*(volatile uint32_t *)0x400FF040) // Port Data Output Register del pin 18 y muchos más
  2. #define GPIOB_PSOR      (*(volatile uint32_t *)0x400FF044) // Port Set Output Register
  3. #define GPIOB_PCOR      (*(volatile uint32_t *)0x400FF048) // Port Clear Output Register
  4. #define GPIOB_PDDR      (*(volatile uint32_t *)0x400FF054) // Port Data Direction Register
  5. #define FGPIOB_PDIR     (*(volatile uint32_t *)0xF8000050) // Port Data Input Register
  6. #define PORTB_PCR3      (*(volatile uint32_t *)0x4004A00C) // Pin Control Register n
Estos registros serán los mismos para varios pines de la placa (pero con diferentes bits, claro).


Y así para todos los pines de la placa

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 11:57:31
Hay unas cuantas cosas que no cazo.

Por ejemplo, a muchas definiciones, les asigna unos números.

#define CORE_PIN0_BIT      16

El pin0 de la placa, corresponde al bit 16 de los registros de puertos que se definen más adelante.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:04:17
Por ejemplo esta es la conexión entre pines de la placa Arduino UNO y los pines del microcontrolador:

(http://www.electroschematics.com/wp-content/uploads/2014/11/arduino-uno-r3-schematic.png)

Está bastante ordenada:
Pin 0 = PD0
Pin 1 = PD1
Pin 2 = PD2
Pin 3 = PD3
Pin 4 = PD4
Pin 5 = PD5
Pin 6 = PD6
Pin 7 = PD7
Pin 8 = PB0
Pin 9 = PB1
Pin 10 = PB2
Pin 12 = PB3
Pin 13 = PB4

Pin A0 = PC0
Pin A1 = PC1
Pin A2 = PC2
Pin A3 = PC3
Pin A4 = PC4
Pin A5 = PC5

Los pines de un microcontrolador se llaman PuertoB.bit2 o PuertoC.bit7. Eso es un lío para un usuario novel e incluso para uno experimentado, que tiene que ir mirando en el datasheet uno a uno todas las conexiones de cada patilla con su puerto correspondiente.
En Arduino a los pines se les numera cosecutivamente con números decimales y así es mucho más sencillo nombrarlos. El pin 40 es siempre el pin 40 y va después del pin 39 y antes del pin 41, sin registros ni bits ni mezclas del demonio en la disposición de los pines. Estarás conmigo en que esta es una numeración mucho más sencilla para una persona.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:04:44
.

He hecho un barrido con FileSeek en todos los fuentes y librerías del aplicativo y utilizan este tipo de definiciones del core:

#define CORE_PIN17_BIT      1
#define CORE_PIN17_BITMASK   (1<<(CORE_PIN17_BIT))

#define CORE_PIN0_CONFIG   PORTB_PCR16


#define PORTB_PCR16      (*(volatile uint32_t *)0x4004A040) // Pin Control Register n
#define PORT_PCR_MUX(n)         ((uint32_t)(((n) & 7) << 8 ))   // Pin Mux Control
#define PORT_PCR_DSE         ((uint32_t)0x00000040)      // Drive Strength Enable
#define PORT_PCR_SRE         ((uint32_t)0x00000004)      // Slew Rate Enable
#define PORT_PCR_IRQC(n)      ((uint32_t)(((n) & 15) << 16))   // Interrupt Configuration


Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:07:11
Los pines del microcontrolador se llaman PuertoB.bit2 o PuertoC.bit7. Eso es un lío para un usuario novel e incluso para uno experimentado, que tiene que ir mirando en el datasheet uno a uno todas las conexiones de cada patilla con su puerto correspondiente.
En Arduino a los pines se les numera cosecutivamente con números decimales y así es mucho más sencillo nombrarlos. El pin 40 es siempre el pin 40 y va después del pin 39 y antes del pin 41, sin registros ni bits ni mezclas del demonio en la disposición de los pines. Estarás conmigo en que esta es una numeración mucho más sencilla para una persona.

La virgen, menudo follón. El problema ahora es ligarlo todo. Identifico, asignar puertos a pines, interrupciones y multiplexado de puertos.

No se que es esto:

#define PORT_PCR_DSE         ((uint32_t)0x00000040)      // Drive Strength Enable
#define PORT_PCR_SRE         ((uint32_t)0x00000004)      // Slew Rate Enable


Tampoco tengo muy claro que hacen con esto:

#define CORE_PIN17_BITMASK   (1<<(CORE_PIN17_BIT))
#define CORE_PIN0_CONFIG   PORTB_PCR16
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:10:42
Muy sencillo con una macro Python.
Sólo tienes que hacer una pequeña base de datos que asocie cada Pin de la placa con su bit y su registro (A, B, C, D, E o F)

El resto lo puede hacer una macro sencilla.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:12:43
.

Si, asignar los pines a los puertos lo entiendo. Lo que no veo claro es lo que he puesto en mi anterior mensaje.


#define PORT_PCR_DSE         ((uint32_t)0x00000040)      // Drive Strength Enable
#define PORT_PCR_SRE         ((uint32_t)0x00000004)      // Slew Rate Enable

#define CORE_PIN17_BITMASK   (1<<(CORE_PIN17_BIT))
#define CORE_PIN0_CONFIG   PORTB_PCR16
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:13:33
No se que es esto:

#define PORT_PCR_DSE         ((uint32_t)0x00000040)      // Drive Strength Enable
#define PORT_PCR_SRE         ((uint32_t)0x00000004)      // Slew Rate Enable

Hace poco que lo descubrí.
Strength define si el pin tiene más o menos 'fuerza' (corriente)
El slew rate define la velocidad de subida o bajada (rise and fall time) de la señal de salida en el pin. Si lo activas, creo que va más rápido (7ns), si lo desactivas va más lento (15ns).

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:16:52
Si, asignar los pines a los puertos lo entiendo. Lo que no veo claro es lo que he puesto en mi anterior mensaje.
#define CORE_PIN17_BITMASK   (1<<(CORE_PIN17_BIT))

Ese es muy sencillo. Si al pin 7 le corresponde el bit 3, la máscara será 0b00 ... 0000001000

Este otro:
#define CORE_PIN0_CONFIG   PORTB_PCR16
Es el registro de configuración correspondiente al pin0 (mira el datasheet del K66 para ver qué controla)

PD:Página 230 del reference manual.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:22:07
.

Creo que será más sencillo si con FileSeek localizo en los fuentes todas las apariciones de estas definiciones tipo CORE_ y las reemplazo directamente por mis propias definiciones, igual para la manera de asignar los puertos.

Las deficiones tipo _PCR creo que ya las entiendo, son para configurar un puerto, por ejempo para acticvarle la resistencia de pull-up, si el puerto va a ser Open Drain, y algunas cosas más como las interrupciones.

Como en los fuentes que quiero portar solo se emplean unas pocas de las definiciones del core, terminaré antes si las localizo con FileSeek y las reemplazo por mis definiciones. Quito el core de los include, compilo y todo lo que casque lo localizo en el core y lo voy reemplazando. La idea es sacar el aplicativo de Arduino.


// Port control and interrupts (PORT)

#define PORTA_PCR0      (*(volatile uint32_t *)0x40049000) // Pin Control Register n
#define PORT_PCR_ISF         ((uint32_t)0x01000000)      // Interrupt Status Flag
#define PORT_PCR_IRQC(n)      ((uint32_t)(((n) & 15) << 16))   // Interrupt Configuration
#define PORT_PCR_IRQC_MASK      ((uint32_t)0x000F0000)
#define PORT_PCR_LK         ((uint32_t)0x00008000)      // Lock Register
#define PORT_PCR_MUX(n)         ((uint32_t)(((n) & 7) << 8 ))   // Pin Mux Control
#define PORT_PCR_MUX_MASK      ((uint32_t)0x00000700)
#define PORT_PCR_DSE         ((uint32_t)0x00000040)      // Drive Strength Enable
#define PORT_PCR_ODE         ((uint32_t)0x00000020)      // Open Drain Enable
#define PORT_PCR_PFE         ((uint32_t)0x00000010)      // Passive Filter Enable
#define PORT_PCR_SRE         ((uint32_t)0x00000004)      // Slew Rate Enable
#define PORT_PCR_PE         ((uint32_t)0x00000002)      // Pull Enable
#define PORT_PCR_PS         ((uint32_t)0x00000001)      // Pull Select
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:28:04
Esas son las máscaras de los diferentes bits de un registro concreto.
Cuando quieras configurar ese registro sólo tienes que sumar las definiciones que quieres activar:

PORTA_PCR0 = PORT_PCR_ISF   /* Activas el flag de interrupción  */
                      + PORT_PCR_DSE  /* Activas el drive de mayor fuerza */
                      + PORT_PCR_ODE  /* Estableces la salida como open-drain */
                      etc, etc.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:29:54
.

¿ Que es el drive de mayor fuerza ?.


En los fuentes veo algunas configuraciones de puertos, y lo entiendo, el multiplexado (selección de funciones alternativas del puerto), la activación de la resistencia de pullup... Todas estas definiciones tienen al final asignada una dirección en el fichero kinetis.h, entiendo que hay que reemplazar esas direcciones por las que tenga asignadas el SAM S70.

Código: [Seleccionar]
  // Configure pins for use by SPI0
  CORE_PIN10_CONFIG = PORT_PCR_MUX(2) | PORT_PCR_PE | PORT_PCR_PS;
  /*
   Don't enable MOSI for SPI0 because we use it to replace CS on
   platforms where the shift register timings aren't valid for SPI
  */
  // CORE_PIN11_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2);
  CORE_PIN12_CONFIG = PORT_PCR_MUX(2) | PORT_PCR_PE;
  CORE_PIN13_CONFIG = PORT_PCR_MUX(2);
  digitalWriteFast(DMD_CS, HIGH);
 
  // Enable clock to SPI0
  SIM_SCGC6 |= SIM_SCGC6_SPI0;
  SPI0_MCR = SPI_MCR_HALT | SPI_MCR_MDIS | SPI_MCR_PCSIS(1<<0);

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:36:41

Creo que será más sencillo si con FileSeek localizo en los fuentes todas las apariciones de estas definiciones tipo CORE_ y las reemplazo directamente por mis propias definiciones, igual para la manera de asignar los puertos.


Chungo. Seguro que te equivocas.

Mejor una macro Python que realice las sustituciones:

   data = re.sub("Definición1 de kinetis", "Definición1 de mi nuevo micro", data)
   data = re.sub("Definición2 de kinetis", "Definición2 de mi nuevo micro", data)

Luego lo guardas con otro nombre. Así, si te equivocas es más sencillo cambiarlo.
Esta macro anterior se puede escribir más sencilla para grandes cantidades de datos:

definitions = [
   ['Definición1 de kinetis', 'Definición1 de mi nuevo micro SAM'],
   ['Definición2 de kinetis', 'Definición2 de mi nuevo micro SAM'],
]

for kinetis_def, sam_def in definitions:
   data = re.sub(kinetis_def, sam_def, data)

Incluso las definiciones se pueden guardar fácilmente en un archivo YAML externo a la macro:

- - Definición1 de kinetis
  - Definición1 de mi nuevo micro SAM
- - Definición2 de kinetis
  - Definición2 de mi nuevo micro SAM

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:39:16

¿ Que es el drive de mayor fuerza ?.

No se muy bien. Supongo que se refiere a la corriente máxima que maneja.

Reference manual
48.1.2 IRO Drive Strength
The IRO pad requires higher current drive than standard pads. For this device, the pin
associated with the CMT_IRO signal is specifically designed to provide a higher drive
current.
No additional configuration is required to enable this capability.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:41:36
También puedes generar los *.h fácilmente con una hoja Excel.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:44:18
.

Bueno, ya vi en un libro sobre Kinetis la configuración del puerto con el registro PORTx_PRCx_

Esto ya lo tengo claro, solo tengo que buscar la direcciones de memoria que usa el SAM S70 para lo mismo, entiendo que al ser ambos ARM, trabajan con las mismas definiciones de registros y solo variarán las direcciones, ventajas de trabajarlo todo dentro del mundo ARM.


(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_007_zpsjwx0zroa.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_003_zpsxvpfl6gy.jpg)(http://i1322.photobucket.com/albums/u573/planeta9999/ScreenHunter_004_zpsr6qq9mae.jpg)


Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:53:06
Puede que algunos registros o valores no sean iguales.
Pero no importa porque estas definiciones sólo son el nivel 0 (dirección de memoria del registro) y el nivel 1 (nomenclatura de pines de la placa)

Al final, ambos se utilizarán en una función que inicializa los pines por defecto. En esa inicialización tendrás que especificar el Slew rate del pin o la asignación de pines multiplexados. Pero si esa opción no existe en el SAM, no importa. No lo configuras y no pasa nada.

Tendrás que estudiarte un poco el siguiente nivel. Por ejemplo "pins_teensy.c" o "analog.c"
https://github.com/PaulStoffregen/cores/tree/master/teensy3

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:53:26

Creo que será más sencillo si con FileSeek localizo en los fuentes todas las apariciones de estas definiciones tipo CORE_ y las reemplazo directamente por mis propias definiciones, igual para la manera de asignar los puertos.


Chungo. Seguro que te equivocas.


Con FileSeek lo encuentro todo enseguida, y con las búsquedas que he hecho por ahora, no hay tantas definiciones que se usen en los fuentes de este aplicativo.

El core tiene montones de definiciones, pero en mi fuente con la librería StmartMatrix no se usan tantas de esas definiciones, con localizarlas, apuntarlas para tenerlas localizadas y reemplazarlas a mano, creo que será suficiente.

O creo mi propio fichero que reemplace al actual con los defines y pongo los míos apuntando a las direcciones de SAM S70, pero solo metiendo los defines que se usan en mis fuentes, que son pocos del total, el resto los quito.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 12:55:26
Al final, ambos se utilizarán en una función que inicializa los pines por defecto. En esa inicialización tendrás que especificar el Slew rate del pin o la asignación de pines multiplexados. Pero si esa opción no existe en el SAM, no importa. No lo configuras y no pasa nada.


¿ Que es el Slew Rate ?, lo del multiplexado lo tengo claro, es seleccionar la función alternativa que queramos activar para un pin.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:56:30
O creo mi propio fichero que reemplace al actual con los defines y pongo los míos apuntando a las direcciones de SAM S70, pero solo metiendo los defines que se usan en mis fuentes, que son pocos del total, el resto los quito.

Algo así me refería. Esa es la solución rápida para pocos pines.
Pero si más adelante quieres cambiar todos los pines, es mejor automatizarlo (con excel, Python o lo que quieras)

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 12:57:11
¿ Que es el Slew Rate ?, lo del multiplexado lo tengo claro, es seleccionar la función alternativa que queramos activar para un pin.

Hace poco que lo descubrí.
Strength define si el pin tiene más o menos 'fuerza' (corriente)
El slew rate define la velocidad de subida o bajada (rise and fall time) de la señal de salida en el pin. Si lo activas, creo que va más rápido (7ns), si lo desactivas va más lento (15ns).

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 13:03:18
.

OK, entiendo que si lo configuro para que vaya más rápido, la contrapartida es que consumirá más, o no tiene mucho sentido que de dejen elegir si quieres que vaya rápido o muy rápido.

Pues que vaya siempre muy rápido que será mejor para cualquier aplicativo, salvo que eso suponga empeorar en otro aspecto, como el consumo.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 13:05:32
.

Bueno, ya lo empiezo a ver claro, y me parece que al final no va a ser tan complicado como pensaba, aunque ya veremos a la hora de la verdad que tal va.

Si consigo portar este aplicativo a un Cortex M7 300Mhz, para mi es la bomba, porque me va a permitir hacer cosas que con un M4 a 180Mhz iba muy pillado o no se podrían hacer. Además el chip es mucho más barato, prácticamente a mitad de precio.

Estoy muy ilusionado con el SAM S70, es bestial, y además al ser un ARM, buena parte de lo aprendido con los STM32 y los Kinetis me sirve. De todas formas estaré al tanto cuando ST ponga a la venta sus STM32H7, el top de los Cortex M7, a 400Mhz, la repera.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 22 de Mayo de 2017, 13:34:39
.

OK, entiendo que si lo configuro para que vaya más rápido, la contrapartida es que consumirá más, o no tiene mucho sentido que de dejen elegir si quieres que vaya rápido o muy rápido.

Pues que vaya siempre muy rápido que será mejor para cualquier aplicativo, salvo que eso suponga empeorar en otro aspecto, como el consumo.

Hay más razones. Por ejemplo para reducir EMI.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 22:00:27
Mejor una macro Python que realice las sustituciones:

   data = re.sub("Definición1 de kinetis", "Definición1 de mi nuevo micro", data)
   data = re.sub("Definición2 de kinetis", "Definición2 de mi nuevo micro", data)

Luego lo guardas con otro nombre. Así, si te equivocas es más sencillo cambiarlo.
Esta macro anterior se puede escribir más sencilla para grandes cantidades de datos:

definitions = [
   ['Definición1 de kinetis', 'Definición1 de mi nuevo micro SAM'],
   ['Definición2 de kinetis', 'Definición2 de mi nuevo micro SAM'],
]

for kinetis_def, sam_def in definitions:
   data = re.sub(kinetis_def, sam_def, data)

Incluso las definiciones se pueden guardar fácilmente en un archivo YAML externo a la macro:

- - Definición1 de kinetis
  - Definición1 de mi nuevo micro SAM
- - Definición2 de kinetis
  - Definición2 de mi nuevo micro SAM



Estoy pensando en hacer algo así, pero la idea sería buscar todas las definiciones de los ficheros core_pins.h y kinetis.h, en todos los fuentes de la aplicación, y que la macro guarde en otro fichero, por ejemplo resultados.txt, una linea por expresión encontrada, que indique fichero fuente en el que ha encontrado la expresión y la expresión.

Los ficheros core_pins.h y kinetis.h, no los puedo usar directamente, porque las lineas tienen comentarios. Crearía un fichero a mano metiendo las expresiones que tiene que buscar, que serían practicamente las de esos dos archivos, pero sin los comentarios, y en el caso de las definiciones de multiplexado, les tendría que quitar el "x" que luego en el fuente se reemplaza por un número.

¿ Es muy complicado hacer esto ?, no tengo ni idea de Python.

Otra opción que barajo es instalarme el entorno para ejecutar PHP en el ordenador, y crearme el programita en este lenguaje. Con PHP si que tengo mucha experiencia, por haberlo usado durante años para hacer páginas web.

Y una tercera opción sería hacerlo en C, con Visual Studio, creando una aplicación de consola, o a pelo escribiendo el fuente en cualquier editor de texto que identifique C, como Geany, y compilando a mano con Mingw para hacer una aplicación de consola para el PC.


Entiendo una cosa, ambos micros son ARM, aunque uno es Cortex M4 y el otro Cortex M7. El compilador es siempre el mismo, GCC, luego el código fuente del programa sería exactamente el mismo, solo habría que cambiar las direcciones de memoria a las que apuntan las expresiones en el fichero kinetis.h, para que apunten a las direcciones de memoria del SAM S70 que aparecen en su Datasheet.

Tendría que cambiar la parametrización de la llamada al compilador para indicarle que es un Cortex M7, y reemplazar el Linker Script para que el enlazador sepa tamaño y ubicación de la Flash y la Ram, aparte de otras cosas que se indican en el Linker Script.

Y finalmente tendría que cambiar la parte del fuente en el que se indica la velocidad del oscilador de reloj del micro, que pasaría de 180Mhz a 300Mhz. Creo que no hay nada más, salvo que de M4 a M7 hayan diferencias importantes que desconozco a la hora de hacer el fuente en C.

Tema Interrupciones, DMA, SPI y USB es lo que tendría que revisar en profundidad, por si en el SAM S70 se tratan de otra forma.



Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 22 de Mayo de 2017, 23:27:43
.

Me acabo de instalar Dev-C++. Para hacer aplicaciones sencillas en C/C++ para PC, va que chuta.

Así puedo crear un programita que barra y lea todo los fuentes buscando las expresiones, para saber cuales se utilizan, y ya miro en el Datasheet del S70 que direcciones de memoria necesito cambiar.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 23 de Mayo de 2017, 02:32:24
En C, definitivamente no.
Mucho mejor Python, aunque tengas que aprender.
En cuanto a PHP no lo conozco lo suficiente, aunque sé que es un lenguaje script peor que Python puede que te sirva.

En cualquier caso tienes que empezar por hacerte una tabla de Excel con todos los datos importantes. Números de pin, direcciones de memoria, etc.
Luego viene el programa.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 23 de Mayo de 2017, 07:09:49
.

Solo quiero convertir lo que se use en el aplicativo actual para Teensy, hay muchísimas expresiones en kinetis.h y el core, que no se emplean en este proyecto. Pero para averiguarlo tengo que hacer el programa que haga las búsquedas.

Puedo crear un fichero de texto, con una linea por expresión a buscar, y crear otro archivo con los nombres de los archivos de código fuente en los que hay que buscar, o que el programa sea capaz de buscar en todos los archivos del directorio actual.

¿ Conoces algún ejemplo de rutina en Python, que lea las expresiones almacenadas en un fichero de texto, las busque en todos los archivos del directorio local y grabe los resultados en un fichero de texto ?. Hacerlo en C, no es complicado, con el Dev-C++ que he instalado, creo que puedo hacerlo en un rato.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 23 de Mayo de 2017, 08:08:26
Código: Python
  1. import os, re
  2.  
  3. expresiones = ['expresion 1', 'expresion 2']
  4.  
  5. resultado = []
  6. for filename in os.listdir('.'):
  7.    data = open(filename, 'rt').read()
  8.    for expresion in expresiones:
  9.       match = re.findall(expresion, data)
  10.       resultado = resultado + [filename + ';' + m for m in match]
  11. open('resultado.txt', 'wt').write('\n'.join(resultado))

No lo he probado, puede que tenga algún error.
El programa busca todas las expresiones en todos los ficheros del directorio actual y graba en un fichero 'resultado.txt' todo lo que ha encontrado, con el nombre del fichero donde lo ha encontrado.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 23 de Mayo de 2017, 08:33:34
.

Ok, gracias, lo probaré.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 23 de Mayo de 2017, 08:53:32
.

Vale, ya lo he probado y funciona. ¿ Es muy complicado hacer que guarde también el número de linea del archivo en el que ha encontrado la expresión, o mejor aún que guarde la linea completa en vez de la expresión encontrada ?.

¿ Le puedo indicar que no busque en un fichero concreto ?, es para que no busque en el propio fichero del programa python, porque ahí están todas las expresiones y siempre las va a encontrar, aunque con no hacer caso a esas entradas al leer el fichero de resultados, arreglado.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: tsk en 23 de Mayo de 2017, 10:42:41
Has probado ctags o cscope

Por ejemplo con cscope

Código: [Seleccionar]
find . -name '*.c' -o -name '*.h' -o -name '*.cpp' > cscope.files
cscope -b
cscope

Te crea una base en la que puedes buscar desde los símbolos, definiciones, funciones, texto, etc.
(http://i.imgur.com/rsJKCS6.png)

O también puedes usar CodeQuery que tiene una interfaz gráfica

https://ruben2020.github.io/codequery/
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 23 de Mayo de 2017, 12:54:27
A ver esto:
Solo extrae información del core MK66
He incluido una expresión para que extraiga todas las definiciones de pines.

Código: Python
  1. import os, re
  2.  
  3. expresions = [
  4.    '#define.*PIN[0-9]{1,2}',
  5. ]
  6.  
  7. # Define cores to extract
  8. switch_off = 'defined\(__MK(?!^66)'
  9. switch_on = '#endif|__MK66FX1M0__'
  10.  
  11. # Parse directory
  12. fo = open('_resultado.txt', 'wt')
  13. for filename in os.listdir('.'):
  14.    if (os.path.splitext(filename)[1].lower() in ['.py', '.txt'] or
  15.        os.path.isdir(filename)):
  16.       continue
  17.    # Parse file
  18.    print filename
  19.    cab = False
  20.    switch = True
  21.    for line in open(filename, 'rt'):
  22.       # Skip other cores
  23.       if re.search(switch_off, line):
  24.          switch = False
  25.       if switch == False and re.search(switch_on, line):
  26.          switch = True
  27.       if switch == False:
  28.          continue
  29.       # Extract lines who match expressions
  30.       for expresion in expresions:
  31.          if re.search(expresion, line):                        
  32.             if not cab: # Write filename to output
  33.                fo.write('\n;\t' + filename + '\n')
  34.                cab = True
  35.             fo.write(line)
  36. fo.close()

Resultado:
Código: Text
  1. ;       core_pins.h
  2. #define CORE_PIN0_BIT           16
  3. #define CORE_PIN1_BIT           17
  4. #define CORE_PIN2_BIT           0
  5. #define CORE_PIN3_BIT           12
  6. #define CORE_PIN4_BIT           13
  7. #define CORE_PIN5_BIT           7
  8. #define CORE_PIN6_BIT           4
  9. #define CORE_PIN7_BIT           2
  10. #define CORE_PIN8_BIT           3
  11. #define CORE_PIN9_BIT           3
  12. #define CORE_PIN10_BIT          4
  13. #define CORE_PIN11_BIT          6
  14. #define CORE_PIN12_BIT          7
  15. #define CORE_PIN13_BIT          5
  16. #define CORE_PIN14_BIT          1
  17. #define CORE_PIN15_BIT          0
  18. #define CORE_PIN16_BIT          0
  19. #define CORE_PIN17_BIT          1
  20. #define CORE_PIN18_BIT          3
  21. #define CORE_PIN19_BIT          2
  22. #define CORE_PIN20_BIT          5
  23. #define CORE_PIN21_BIT          6
  24. #define CORE_PIN22_BIT          1
  25. #define CORE_PIN23_BIT          2
  26. #define CORE_PIN24_BIT          26
  27. #define CORE_PIN25_BIT          5
  28. #define CORE_PIN26_BIT          14
  29. #define CORE_PIN27_BIT          15
  30. #define CORE_PIN28_BIT          16
  31. #define CORE_PIN29_BIT          18
  32. #define CORE_PIN30_BIT          19
  33. #define CORE_PIN31_BIT          10
  34. #define CORE_PIN32_BIT          11
  35. #define CORE_PIN33_BIT          24
  36. #define CORE_PIN34_BIT          25
  37. #define CORE_PIN35_BIT          8
  38. #define CORE_PIN36_BIT          9
  39. #define CORE_PIN37_BIT          10
  40. #define CORE_PIN38_BIT          11
  41. #define CORE_PIN39_BIT          17
  42. #define CORE_PIN40_BIT          28
  43. #define CORE_PIN41_BIT          29
  44. #define CORE_PIN42_BIT          26
  45. #define CORE_PIN43_BIT          20
  46. #define CORE_PIN44_BIT          22
  47. #define CORE_PIN45_BIT          23
  48. #define CORE_PIN46_BIT          21
  49. #define CORE_PIN47_BIT          8
  50. #define CORE_PIN48_BIT          9
  51. #define CORE_PIN49_BIT          4
  52. #define CORE_PIN50_BIT          5
  53. #define CORE_PIN51_BIT          14
  54. #define CORE_PIN52_BIT          13
  55. #define CORE_PIN53_BIT          12
  56. #define CORE_PIN54_BIT          15
  57. #define CORE_PIN55_BIT          11
  58. #define CORE_PIN56_BIT          10
  59. #define CORE_PIN57_BIT          11
  60. #define CORE_PIN58_BIT          0
  61. #define CORE_PIN59_BIT          1
  62. #define CORE_PIN60_BIT          2
  63. #define CORE_PIN61_BIT          3
  64. #define CORE_PIN62_BIT          4
  65. #define CORE_PIN63_BIT          5
  66. #define CORE_PIN0_BITMASK       (1<<(CORE_PIN0_BIT))
  67. #define CORE_PIN1_BITMASK       (1<<(CORE_PIN1_BIT))
  68. #define CORE_PIN2_BITMASK       (1<<(CORE_PIN2_BIT))
  69. #define CORE_PIN3_BITMASK       (1<<(CORE_PIN3_BIT))
  70. #define CORE_PIN4_BITMASK       (1<<(CORE_PIN4_BIT))
  71. #define CORE_PIN5_BITMASK       (1<<(CORE_PIN5_BIT))
  72. #define CORE_PIN6_BITMASK       (1<<(CORE_PIN6_BIT))
  73. #define CORE_PIN7_BITMASK       (1<<(CORE_PIN7_BIT))
  74. #define CORE_PIN8_BITMASK       (1<<(CORE_PIN8_BIT))
  75. #define CORE_PIN9_BITMASK       (1<<(CORE_PIN9_BIT))
  76. #define CORE_PIN10_BITMASK      (1<<(CORE_PIN10_BIT))
  77. #define CORE_PIN11_BITMASK      (1<<(CORE_PIN11_BIT))
  78. #define CORE_PIN12_BITMASK      (1<<(CORE_PIN12_BIT))
  79. #define CORE_PIN13_BITMASK      (1<<(CORE_PIN13_BIT))
  80. #define CORE_PIN14_BITMASK      (1<<(CORE_PIN14_BIT))
  81. #define CORE_PIN15_BITMASK      (1<<(CORE_PIN15_BIT))
  82. #define CORE_PIN16_BITMASK      (1<<(CORE_PIN16_BIT))
  83. #define CORE_PIN17_BITMASK      (1<<(CORE_PIN17_BIT))
  84. #define CORE_PIN18_BITMASK      (1<<(CORE_PIN18_BIT))
  85. #define CORE_PIN19_BITMASK      (1<<(CORE_PIN19_BIT))
  86. #define CORE_PIN20_BITMASK      (1<<(CORE_PIN20_BIT))
  87. #define CORE_PIN21_BITMASK      (1<<(CORE_PIN21_BIT))
  88. #define CORE_PIN22_BITMASK      (1<<(CORE_PIN22_BIT))
  89. #define CORE_PIN23_BITMASK      (1<<(CORE_PIN23_BIT))
  90. #define CORE_PIN24_BITMASK      (1<<(CORE_PIN24_BIT))
  91. #define CORE_PIN25_BITMASK      (1<<(CORE_PIN25_BIT))
  92. #define CORE_PIN26_BITMASK      (1<<(CORE_PIN26_BIT))
  93. #define CORE_PIN27_BITMASK      (1<<(CORE_PIN27_BIT))
  94. #define CORE_PIN28_BITMASK      (1<<(CORE_PIN28_BIT))
  95. #define CORE_PIN29_BITMASK      (1<<(CORE_PIN29_BIT))
  96. #define CORE_PIN30_BITMASK      (1<<(CORE_PIN30_BIT))
  97. #define CORE_PIN31_BITMASK      (1<<(CORE_PIN31_BIT))
  98. #define CORE_PIN32_BITMASK      (1<<(CORE_PIN32_BIT))
  99. #define CORE_PIN33_BITMASK      (1<<(CORE_PIN33_BIT))
  100. #define CORE_PIN34_BITMASK      (1<<(CORE_PIN34_BIT))
  101. #define CORE_PIN35_BITMASK      (1<<(CORE_PIN35_BIT))
  102. #define CORE_PIN36_BITMASK      (1<<(CORE_PIN36_BIT))
  103. #define CORE_PIN37_BITMASK      (1<<(CORE_PIN37_BIT))
  104. #define CORE_PIN38_BITMASK      (1<<(CORE_PIN38_BIT))
  105. #define CORE_PIN39_BITMASK      (1<<(CORE_PIN39_BIT))
  106. #define CORE_PIN40_BITMASK      (1<<(CORE_PIN40_BIT))
  107. #define CORE_PIN41_BITMASK      (1<<(CORE_PIN41_BIT))
  108. #define CORE_PIN42_BITMASK      (1<<(CORE_PIN42_BIT))
  109. #define CORE_PIN43_BITMASK      (1<<(CORE_PIN43_BIT))
  110. #define CORE_PIN44_BITMASK      (1<<(CORE_PIN44_BIT))
  111. #define CORE_PIN45_BITMASK      (1<<(CORE_PIN45_BIT))
  112. #define CORE_PIN46_BITMASK      (1<<(CORE_PIN46_BIT))
  113. #define CORE_PIN47_BITMASK      (1<<(CORE_PIN47_BIT))
  114. #define CORE_PIN48_BITMASK      (1<<(CORE_PIN48_BIT))
  115. #define CORE_PIN49_BITMASK      (1<<(CORE_PIN49_BIT))
  116. #define CORE_PIN50_BITMASK      (1<<(CORE_PIN50_BIT))
  117. #define CORE_PIN51_BITMASK      (1<<(CORE_PIN51_BIT))
  118. #define CORE_PIN52_BITMASK      (1<<(CORE_PIN52_BIT))
  119. #define CORE_PIN53_BITMASK      (1<<(CORE_PIN53_BIT))
  120. #define CORE_PIN54_BITMASK      (1<<(CORE_PIN54_BIT))
  121. #define CORE_PIN55_BITMASK      (1<<(CORE_PIN55_BIT))
  122. #define CORE_PIN56_BITMASK      (1<<(CORE_PIN56_BIT))
  123. #define CORE_PIN57_BITMASK      (1<<(CORE_PIN57_BIT))
  124. #define CORE_PIN58_BITMASK      (1<<(CORE_PIN58_BIT))
  125. #define CORE_PIN59_BITMASK      (1<<(CORE_PIN59_BIT))
  126. #define CORE_PIN60_BITMASK      (1<<(CORE_PIN60_BIT))
  127. #define CORE_PIN61_BITMASK      (1<<(CORE_PIN61_BIT))
  128. #define CORE_PIN62_BITMASK      (1<<(CORE_PIN62_BIT))
  129. #define CORE_PIN63_BITMASK      (1<<(CORE_PIN63_BIT))
  130. #define CORE_PIN0_PORTREG       GPIOB_PDOR
  131. #define CORE_PIN1_PORTREG       GPIOB_PDOR
  132. #define CORE_PIN2_PORTREG       GPIOD_PDOR
  133. #define CORE_PIN3_PORTREG       GPIOA_PDOR
  134. #define CORE_PIN4_PORTREG       GPIOA_PDOR
  135. #define CORE_PIN5_PORTREG       GPIOD_PDOR
  136. #define CORE_PIN6_PORTREG       GPIOD_PDOR
  137. #define CORE_PIN7_PORTREG       GPIOD_PDOR
  138. #define CORE_PIN8_PORTREG       GPIOD_PDOR
  139. #define CORE_PIN9_PORTREG       GPIOC_PDOR
  140. #define CORE_PIN10_PORTREG      GPIOC_PDOR
  141. #define CORE_PIN11_PORTREG      GPIOC_PDOR
  142. #define CORE_PIN12_PORTREG      GPIOC_PDOR
  143. #define CORE_PIN13_PORTREG      GPIOC_PDOR
  144. #define CORE_PIN14_PORTREG      GPIOD_PDOR
  145. #define CORE_PIN15_PORTREG      GPIOC_PDOR
  146. #define CORE_PIN16_PORTREG      GPIOB_PDOR
  147. #define CORE_PIN17_PORTREG      GPIOB_PDOR
  148. #define CORE_PIN18_PORTREG      GPIOB_PDOR
  149. #define CORE_PIN19_PORTREG      GPIOB_PDOR
  150. #define CORE_PIN20_PORTREG      GPIOD_PDOR
  151. #define CORE_PIN21_PORTREG      GPIOD_PDOR
  152. #define CORE_PIN22_PORTREG      GPIOC_PDOR
  153. #define CORE_PIN23_PORTREG      GPIOC_PDOR
  154. #define CORE_PIN24_PORTREG      GPIOE_PDOR
  155. #define CORE_PIN25_PORTREG      GPIOA_PDOR
  156. #define CORE_PIN26_PORTREG      GPIOA_PDOR
  157. #define CORE_PIN27_PORTREG      GPIOA_PDOR
  158. #define CORE_PIN28_PORTREG      GPIOA_PDOR
  159. #define CORE_PIN29_PORTREG      GPIOB_PDOR
  160. #define CORE_PIN30_PORTREG      GPIOB_PDOR
  161. #define CORE_PIN31_PORTREG      GPIOB_PDOR
  162. #define CORE_PIN32_PORTREG      GPIOB_PDOR
  163. #define CORE_PIN33_PORTREG      GPIOE_PDOR
  164. #define CORE_PIN34_PORTREG      GPIOE_PDOR
  165. #define CORE_PIN35_PORTREG      GPIOC_PDOR
  166. #define CORE_PIN36_PORTREG      GPIOC_PDOR
  167. #define CORE_PIN37_PORTREG      GPIOC_PDOR
  168. #define CORE_PIN38_PORTREG      GPIOC_PDOR
  169. #define CORE_PIN39_PORTREG      GPIOA_PDOR
  170. #define CORE_PIN40_PORTREG      GPIOA_PDOR
  171. #define CORE_PIN41_PORTREG      GPIOA_PDOR
  172. #define CORE_PIN42_PORTREG      GPIOA_PDOR
  173. #define CORE_PIN43_PORTREG      GPIOB_PDOR
  174. #define CORE_PIN44_PORTREG      GPIOB_PDOR
  175. #define CORE_PIN45_PORTREG      GPIOB_PDOR
  176. #define CORE_PIN46_PORTREG      GPIOB_PDOR
  177. #define CORE_PIN47_PORTREG      GPIOD_PDOR
  178. #define CORE_PIN48_PORTREG      GPIOD_PDOR
  179. #define CORE_PIN49_PORTREG      GPIOB_PDOR
  180. #define CORE_PIN50_PORTREG      GPIOB_PDOR
  181. #define CORE_PIN51_PORTREG      GPIOD_PDOR
  182. #define CORE_PIN52_PORTREG      GPIOD_PDOR
  183. #define CORE_PIN53_PORTREG      GPIOD_PDOR
  184. #define CORE_PIN54_PORTREG      GPIOD_PDOR
  185. #define CORE_PIN55_PORTREG      GPIOD_PDOR
  186. #define CORE_PIN56_PORTREG      GPIOE_PDOR
  187. #define CORE_PIN57_PORTREG      GPIOE_PDOR
  188. #define CORE_PIN58_PORTREG      GPIOE_PDOR
  189. #define CORE_PIN59_PORTREG      GPIOE_PDOR
  190. #define CORE_PIN60_PORTREG      GPIOE_PDOR
  191. #define CORE_PIN61_PORTREG      GPIOE_PDOR
  192. #define CORE_PIN62_PORTREG      GPIOE_PDOR
  193. #define CORE_PIN63_PORTREG      GPIOE_PDOR
  194. #define CORE_PIN0_PORTSET       GPIOB_PSOR
  195. #define CORE_PIN1_PORTSET       GPIOB_PSOR
  196. #define CORE_PIN2_PORTSET       GPIOD_PSOR
  197. #define CORE_PIN3_PORTSET       GPIOA_PSOR
  198. #define CORE_PIN4_PORTSET       GPIOA_PSOR
  199. #define CORE_PIN5_PORTSET       GPIOD_PSOR
  200. #define CORE_PIN6_PORTSET       GPIOD_PSOR
  201. #define CORE_PIN7_PORTSET       GPIOD_PSOR
  202. #define CORE_PIN8_PORTSET       GPIOD_PSOR
  203. #define CORE_PIN9_PORTSET       GPIOC_PSOR
  204. #define CORE_PIN10_PORTSET      GPIOC_PSOR
  205. #define CORE_PIN11_PORTSET      GPIOC_PSOR
  206. #define CORE_PIN12_PORTSET      GPIOC_PSOR
  207. #define CORE_PIN13_PORTSET      GPIOC_PSOR
  208. #define CORE_PIN14_PORTSET      GPIOD_PSOR
  209. #define CORE_PIN15_PORTSET      GPIOC_PSOR
  210. #define CORE_PIN16_PORTSET      GPIOB_PSOR
  211. #define CORE_PIN17_PORTSET      GPIOB_PSOR
  212. #define CORE_PIN18_PORTSET      GPIOB_PSOR
  213. #define CORE_PIN19_PORTSET      GPIOB_PSOR
  214. #define CORE_PIN20_PORTSET      GPIOD_PSOR
  215. #define CORE_PIN21_PORTSET      GPIOD_PSOR
  216. #define CORE_PIN22_PORTSET      GPIOC_PSOR
  217. #define CORE_PIN23_PORTSET      GPIOC_PSOR
  218. #define CORE_PIN24_PORTSET      GPIOE_PSOR
  219. #define CORE_PIN25_PORTSET      GPIOA_PSOR
  220. #define CORE_PIN26_PORTSET      GPIOA_PSOR
  221. #define CORE_PIN27_PORTSET      GPIOA_PSOR
  222. #define CORE_PIN28_PORTSET      GPIOA_PSOR
  223. #define CORE_PIN29_PORTSET      GPIOB_PSOR
  224. #define CORE_PIN30_PORTSET      GPIOB_PSOR
  225. #define CORE_PIN31_PORTSET      GPIOB_PSOR
  226. #define CORE_PIN32_PORTSET      GPIOB_PSOR
  227. #define CORE_PIN33_PORTSET      GPIOE_PSOR
  228. #define CORE_PIN34_PORTSET      GPIOE_PSOR
  229. #define CORE_PIN35_PORTSET      GPIOC_PSOR
  230. #define CORE_PIN36_PORTSET      GPIOC_PSOR
  231. #define CORE_PIN37_PORTSET      GPIOC_PSOR
  232. #define CORE_PIN38_PORTSET      GPIOC_PSOR
  233. #define CORE_PIN39_PORTSET      GPIOA_PSOR
  234. #define CORE_PIN40_PORTSET      GPIOA_PSOR
  235. #define CORE_PIN41_PORTSET      GPIOA_PSOR
  236. #define CORE_PIN42_PORTSET      GPIOA_PSOR
  237. #define CORE_PIN43_PORTSET      GPIOB_PSOR
  238. #define CORE_PIN44_PORTSET      GPIOB_PSOR
  239. #define CORE_PIN45_PORTSET      GPIOB_PSOR
  240. #define CORE_PIN46_PORTSET      GPIOB_PSOR
  241. #define CORE_PIN47_PORTSET      GPIOD_PSOR
  242. #define CORE_PIN48_PORTSET      GPIOD_PSOR
  243. #define CORE_PIN49_PORTSET      GPIOB_PSOR
  244. #define CORE_PIN50_PORTSET      GPIOB_PSOR
  245. #define CORE_PIN51_PORTSET      GPIOD_PSOR
  246. #define CORE_PIN52_PORTSET      GPIOD_PSOR
  247. #define CORE_PIN53_PORTSET      GPIOD_PSOR
  248. #define CORE_PIN54_PORTSET      GPIOD_PSOR
  249. #define CORE_PIN55_PORTSET      GPIOD_PSOR
  250. #define CORE_PIN56_PORTSET      GPIOE_PSOR
  251. #define CORE_PIN57_PORTSET      GPIOE_PSOR
  252. #define CORE_PIN58_PORTSET      GPIOE_PSOR
  253. #define CORE_PIN59_PORTSET      GPIOE_PSOR
  254. #define CORE_PIN60_PORTSET      GPIOE_PSOR
  255. #define CORE_PIN61_PORTSET      GPIOE_PSOR
  256. #define CORE_PIN62_PORTSET      GPIOE_PSOR
  257. #define CORE_PIN63_PORTSET      GPIOE_PSOR
  258. #define CORE_PIN0_PORTCLEAR     GPIOB_PCOR
  259. #define CORE_PIN1_PORTCLEAR     GPIOB_PCOR
  260. #define CORE_PIN2_PORTCLEAR     GPIOD_PCOR
  261. #define CORE_PIN3_PORTCLEAR     GPIOA_PCOR
  262. #define CORE_PIN4_PORTCLEAR     GPIOA_PCOR
  263. #define CORE_PIN5_PORTCLEAR     GPIOD_PCOR
  264. #define CORE_PIN6_PORTCLEAR     GPIOD_PCOR
  265. #define CORE_PIN7_PORTCLEAR     GPIOD_PCOR
  266. #define CORE_PIN8_PORTCLEAR     GPIOD_PCOR
  267. #define CORE_PIN9_PORTCLEAR     GPIOC_PCOR
  268. #define CORE_PIN10_PORTCLEAR    GPIOC_PCOR
  269. #define CORE_PIN11_PORTCLEAR    GPIOC_PCOR
  270. #define CORE_PIN12_PORTCLEAR    GPIOC_PCOR
  271. #define CORE_PIN13_PORTCLEAR    GPIOC_PCOR
  272. #define CORE_PIN14_PORTCLEAR    GPIOD_PCOR
  273. #define CORE_PIN15_PORTCLEAR    GPIOC_PCOR
  274. #define CORE_PIN16_PORTCLEAR    GPIOB_PCOR
  275. #define CORE_PIN17_PORTCLEAR    GPIOB_PCOR
  276. #define CORE_PIN18_PORTCLEAR    GPIOB_PCOR
  277. #define CORE_PIN19_PORTCLEAR    GPIOB_PCOR
  278. #define CORE_PIN20_PORTCLEAR    GPIOD_PCOR
  279. #define CORE_PIN21_PORTCLEAR    GPIOD_PCOR
  280. #define CORE_PIN22_PORTCLEAR    GPIOC_PCOR
  281. #define CORE_PIN23_PORTCLEAR    GPIOC_PCOR
  282. #define CORE_PIN24_PORTCLEAR    GPIOE_PCOR
  283. #define CORE_PIN25_PORTCLEAR    GPIOA_PCOR
  284. #define CORE_PIN26_PORTCLEAR    GPIOA_PCOR
  285. #define CORE_PIN27_PORTCLEAR    GPIOA_PCOR
  286. #define CORE_PIN28_PORTCLEAR    GPIOA_PCOR
  287. #define CORE_PIN29_PORTCLEAR    GPIOB_PCOR
  288. #define CORE_PIN30_PORTCLEAR    GPIOB_PCOR
  289. #define CORE_PIN31_PORTCLEAR    GPIOB_PCOR
  290. #define CORE_PIN32_PORTCLEAR    GPIOB_PCOR
  291. #define CORE_PIN33_PORTCLEAR    GPIOE_PCOR
  292. #define CORE_PIN34_PORTCLEAR    GPIOE_PCOR
  293. #define CORE_PIN35_PORTCLEAR    GPIOC_PCOR
  294. #define CORE_PIN36_PORTCLEAR    GPIOC_PCOR
  295. #define CORE_PIN37_PORTCLEAR    GPIOC_PCOR
  296. #define CORE_PIN38_PORTCLEAR    GPIOC_PCOR
  297. #define CORE_PIN39_PORTCLEAR    GPIOA_PCOR
  298. #define CORE_PIN40_PORTCLEAR    GPIOA_PCOR
  299. #define CORE_PIN41_PORTCLEAR    GPIOA_PCOR
  300. #define CORE_PIN42_PORTCLEAR    GPIOA_PCOR
  301. #define CORE_PIN43_PORTCLEAR    GPIOB_PCOR
  302. #define CORE_PIN44_PORTCLEAR    GPIOB_PCOR
  303. #define CORE_PIN45_PORTCLEAR    GPIOB_PCOR
  304. #define CORE_PIN46_PORTCLEAR    GPIOB_PCOR
  305. #define CORE_PIN47_PORTCLEAR    GPIOD_PCOR
  306. #define CORE_PIN48_PORTCLEAR    GPIOD_PCOR
  307. #define CORE_PIN49_PORTCLEAR    GPIOB_PCOR
  308. #define CORE_PIN50_PORTCLEAR    GPIOB_PCOR
  309. #define CORE_PIN51_PORTCLEAR    GPIOD_PCOR
  310. #define CORE_PIN52_PORTCLEAR    GPIOD_PCOR
  311. #define CORE_PIN53_PORTCLEAR    GPIOD_PCOR
  312. #define CORE_PIN54_PORTCLEAR    GPIOD_PCOR
  313. #define CORE_PIN55_PORTCLEAR    GPIOD_PCOR
  314. #define CORE_PIN56_PORTCLEAR    GPIOE_PCOR
  315. #define CORE_PIN57_PORTCLEAR    GPIOE_PCOR
  316. #define CORE_PIN58_PORTCLEAR    GPIOE_PCOR
  317. #define CORE_PIN59_PORTCLEAR    GPIOE_PCOR
  318. #define CORE_PIN60_PORTCLEAR    GPIOE_PCOR
  319. #define CORE_PIN61_PORTCLEAR    GPIOE_PCOR
  320. #define CORE_PIN62_PORTCLEAR    GPIOE_PCOR
  321. #define CORE_PIN63_PORTCLEAR    GPIOE_PCOR
  322. #define CORE_PIN0_DDRREG        GPIOB_PDDR
  323. #define CORE_PIN1_DDRREG        GPIOB_PDDR
  324. #define CORE_PIN2_DDRREG        GPIOD_PDDR
  325. #define CORE_PIN3_DDRREG        GPIOA_PDDR
  326. #define CORE_PIN4_DDRREG        GPIOA_PDDR
  327. #define CORE_PIN5_DDRREG        GPIOD_PDDR
  328. #define CORE_PIN6_DDRREG        GPIOD_PDDR
  329. #define CORE_PIN7_DDRREG        GPIOD_PDDR
  330. #define CORE_PIN8_DDRREG        GPIOD_PDDR
  331. #define CORE_PIN9_DDRREG        GPIOC_PDDR
  332. #define CORE_PIN10_DDRREG       GPIOC_PDDR
  333. #define CORE_PIN11_DDRREG       GPIOC_PDDR
  334. #define CORE_PIN12_DDRREG       GPIOC_PDDR
  335. #define CORE_PIN13_DDRREG       GPIOC_PDDR
  336. #define CORE_PIN14_DDRREG       GPIOD_PDDR
  337. #define CORE_PIN15_DDRREG       GPIOC_PDDR
  338. #define CORE_PIN16_DDRREG       GPIOB_PDDR
  339. #define CORE_PIN17_DDRREG       GPIOB_PDDR
  340. #define CORE_PIN18_DDRREG       GPIOB_PDDR
  341. #define CORE_PIN19_DDRREG       GPIOB_PDDR
  342. #define CORE_PIN20_DDRREG       GPIOD_PDDR
  343. #define CORE_PIN21_DDRREG       GPIOD_PDDR
  344. #define CORE_PIN22_DDRREG       GPIOC_PDDR
  345. #define CORE_PIN23_DDRREG       GPIOC_PDDR
  346. #define CORE_PIN24_DDRREG       GPIOE_PDDR
  347. #define CORE_PIN25_DDRREG       GPIOA_PDDR
  348. #define CORE_PIN26_DDRREG       GPIOA_PDDR
  349. #define CORE_PIN27_DDRREG       GPIOA_PDDR
  350. #define CORE_PIN28_DDRREG       GPIOA_PDDR
  351. #define CORE_PIN29_DDRREG       GPIOB_PDDR
  352. #define CORE_PIN30_DDRREG       GPIOB_PDDR
  353. #define CORE_PIN31_DDRREG       GPIOB_PDDR
  354. #define CORE_PIN32_DDRREG       GPIOB_PDDR
  355. #define CORE_PIN33_DDRREG       GPIOE_PDDR
  356. #define CORE_PIN34_DDRREG       GPIOE_PDDR
  357. #define CORE_PIN35_DDRREG       GPIOC_PDDR
  358. #define CORE_PIN36_DDRREG       GPIOC_PDDR
  359. #define CORE_PIN37_DDRREG       GPIOC_PDDR
  360. #define CORE_PIN38_DDRREG       GPIOC_PDDR
  361. #define CORE_PIN39_DDRREG       GPIOA_PDDR
  362. #define CORE_PIN40_DDRREG       GPIOA_PDDR
  363. #define CORE_PIN41_DDRREG       GPIOA_PDDR
  364. #define CORE_PIN42_DDRREG       GPIOA_PDDR
  365. #define CORE_PIN43_DDRREG       GPIOB_PDDR
  366. #define CORE_PIN44_DDRREG       GPIOB_PDDR
  367. #define CORE_PIN45_DDRREG       GPIOB_PDDR
  368. #define CORE_PIN46_DDRREG       GPIOB_PDDR
  369. #define CORE_PIN47_DDRREG       GPIOD_PDDR
  370. #define CORE_PIN48_DDRREG       GPIOD_PDDR
  371. #define CORE_PIN49_DDRREG       GPIOB_PDDR
  372. #define CORE_PIN50_DDRREG       GPIOB_PDDR
  373. #define CORE_PIN51_DDRREG       GPIOD_PDDR
  374. #define CORE_PIN52_DDRREG       GPIOD_PDDR
  375. #define CORE_PIN53_DDRREG       GPIOD_PDDR
  376. #define CORE_PIN54_DDRREG       GPIOD_PDDR
  377. #define CORE_PIN55_DDRREG       GPIOD_PDDR
  378. #define CORE_PIN56_DDRREG       GPIOE_PDDR
  379. #define CORE_PIN57_DDRREG       GPIOE_PDDR
  380. #define CORE_PIN58_DDRREG       GPIOE_PDDR
  381. #define CORE_PIN59_DDRREG       GPIOE_PDDR
  382. #define CORE_PIN60_DDRREG       GPIOE_PDDR
  383. #define CORE_PIN61_DDRREG       GPIOE_PDDR
  384. #define CORE_PIN62_DDRREG       GPIOE_PDDR
  385. #define CORE_PIN63_DDRREG       GPIOE_PDDR
  386. #define CORE_PIN0_PINREG        GPIOB_PDIR
  387. #define CORE_PIN1_PINREG        GPIOB_PDIR
  388. #define CORE_PIN2_PINREG        GPIOD_PDIR
  389. #define CORE_PIN3_PINREG        GPIOA_PDIR
  390. #define CORE_PIN4_PINREG        GPIOA_PDIR
  391. #define CORE_PIN5_PINREG        GPIOD_PDIR
  392. #define CORE_PIN6_PINREG        GPIOD_PDIR
  393. #define CORE_PIN7_PINREG        GPIOD_PDIR
  394. #define CORE_PIN8_PINREG        GPIOD_PDIR
  395. #define CORE_PIN9_PINREG        GPIOC_PDIR
  396. #define CORE_PIN10_PINREG       GPIOC_PDIR
  397. #define CORE_PIN11_PINREG       GPIOC_PDIR
  398. #define CORE_PIN12_PINREG       GPIOC_PDIR
  399. #define CORE_PIN13_PINREG       GPIOC_PDIR
  400. #define CORE_PIN14_PINREG       GPIOD_PDIR
  401. #define CORE_PIN15_PINREG       GPIOC_PDIR
  402. #define CORE_PIN16_PINREG       GPIOB_PDIR
  403. #define CORE_PIN17_PINREG       GPIOB_PDIR
  404. #define CORE_PIN18_PINREG       GPIOB_PDIR
  405. #define CORE_PIN19_PINREG       GPIOB_PDIR
  406. #define CORE_PIN20_PINREG       GPIOD_PDIR
  407. #define CORE_PIN21_PINREG       GPIOD_PDIR
  408. #define CORE_PIN22_PINREG       GPIOC_PDIR
  409. #define CORE_PIN23_PINREG       GPIOC_PDIR
  410. #define CORE_PIN24_PINREG       GPIOE_PDIR
  411. #define CORE_PIN25_PINREG       GPIOA_PDIR
  412. #define CORE_PIN26_PINREG       GPIOA_PDIR
  413. #define CORE_PIN27_PINREG       GPIOA_PDIR
  414. #define CORE_PIN28_PINREG       GPIOA_PDIR
  415. #define CORE_PIN29_PINREG       GPIOB_PDIR
  416. #define CORE_PIN30_PINREG       GPIOB_PDIR
  417. #define CORE_PIN31_PINREG       GPIOB_PDIR
  418. #define CORE_PIN32_PINREG       GPIOB_PDIR
  419. #define CORE_PIN33_PINREG       GPIOE_PDIR
  420. #define CORE_PIN34_PINREG       GPIOE_PDIR
  421. #define CORE_PIN35_PINREG       GPIOC_PDIR
  422. #define CORE_PIN36_PINREG       GPIOC_PDIR
  423. #define CORE_PIN37_PINREG       GPIOC_PDIR
  424. #define CORE_PIN38_PINREG       GPIOC_PDIR
  425. #define CORE_PIN39_PINREG       GPIOA_PDIR
  426. #define CORE_PIN40_PINREG       GPIOA_PDIR
  427. #define CORE_PIN41_PINREG       GPIOA_PDIR
  428. #define CORE_PIN42_PINREG       GPIOA_PDIR
  429. #define CORE_PIN43_PINREG       GPIOB_PDIR
  430. #define CORE_PIN44_PINREG       GPIOB_PDIR
  431. #define CORE_PIN45_PINREG       GPIOB_PDIR
  432. #define CORE_PIN46_PINREG       GPIOB_PDIR
  433. #define CORE_PIN47_PINREG       GPIOD_PDIR
  434. #define CORE_PIN48_PINREG       GPIOD_PDIR
  435. #define CORE_PIN49_PINREG       GPIOB_PDIR
  436. #define CORE_PIN50_PINREG       GPIOB_PDIR
  437. #define CORE_PIN51_PINREG       GPIOD_PDIR
  438. #define CORE_PIN52_PINREG       GPIOD_PDIR
  439. #define CORE_PIN53_PINREG       GPIOD_PDIR
  440. #define CORE_PIN54_PINREG       GPIOD_PDIR
  441. #define CORE_PIN55_PINREG       GPIOD_PDIR
  442. #define CORE_PIN56_PINREG       GPIOE_PDIR
  443. #define CORE_PIN57_PINREG       GPIOE_PDIR
  444. #define CORE_PIN58_PINREG       GPIOE_PDIR
  445. #define CORE_PIN59_PINREG       GPIOE_PDIR
  446. #define CORE_PIN60_PINREG       GPIOE_PDIR
  447. #define CORE_PIN61_PINREG       GPIOE_PDIR
  448. #define CORE_PIN62_PINREG       GPIOE_PDIR
  449. #define CORE_PIN63_PINREG       GPIOE_PDIR
  450. #define CORE_PIN0_CONFIG        PORTB_PCR16
  451. #define CORE_PIN1_CONFIG        PORTB_PCR17
  452. #define CORE_PIN2_CONFIG        PORTD_PCR0
  453. #define CORE_PIN3_CONFIG        PORTA_PCR12
  454. #define CORE_PIN4_CONFIG        PORTA_PCR13
  455. #define CORE_PIN5_CONFIG        PORTD_PCR7
  456. #define CORE_PIN6_CONFIG        PORTD_PCR4
  457. #define CORE_PIN7_CONFIG        PORTD_PCR2
  458. #define CORE_PIN8_CONFIG        PORTD_PCR3
  459. #define CORE_PIN9_CONFIG        PORTC_PCR3
  460. #define CORE_PIN10_CONFIG       PORTC_PCR4
  461. #define CORE_PIN11_CONFIG       PORTC_PCR6
  462. #define CORE_PIN12_CONFIG       PORTC_PCR7
  463. #define CORE_PIN13_CONFIG       PORTC_PCR5
  464. #define CORE_PIN14_CONFIG       PORTD_PCR1
  465. #define CORE_PIN15_CONFIG       PORTC_PCR0
  466. #define CORE_PIN16_CONFIG       PORTB_PCR0
  467. #define CORE_PIN17_CONFIG       PORTB_PCR1
  468. #define CORE_PIN18_CONFIG       PORTB_PCR3
  469. #define CORE_PIN19_CONFIG       PORTB_PCR2
  470. #define CORE_PIN20_CONFIG       PORTD_PCR5
  471. #define CORE_PIN21_CONFIG       PORTD_PCR6
  472. #define CORE_PIN22_CONFIG       PORTC_PCR1
  473. #define CORE_PIN23_CONFIG       PORTC_PCR2
  474. #define CORE_PIN24_CONFIG       PORTE_PCR26
  475. #define CORE_PIN25_CONFIG       PORTA_PCR5
  476. #define CORE_PIN26_CONFIG       PORTA_PCR14
  477. #define CORE_PIN27_CONFIG       PORTA_PCR15
  478. #define CORE_PIN28_CONFIG       PORTA_PCR16
  479. #define CORE_PIN29_CONFIG       PORTB_PCR18
  480. #define CORE_PIN30_CONFIG       PORTB_PCR19
  481. #define CORE_PIN31_CONFIG       PORTB_PCR10
  482. #define CORE_PIN32_CONFIG       PORTB_PCR11
  483. #define CORE_PIN33_CONFIG       PORTE_PCR24
  484. #define CORE_PIN34_CONFIG       PORTE_PCR25
  485. #define CORE_PIN35_CONFIG       PORTC_PCR8
  486. #define CORE_PIN36_CONFIG       PORTC_PCR9
  487. #define CORE_PIN37_CONFIG       PORTC_PCR10
  488. #define CORE_PIN38_CONFIG       PORTC_PCR11
  489. #define CORE_PIN39_CONFIG       PORTA_PCR17
  490. #define CORE_PIN40_CONFIG       PORTA_PCR28
  491. #define CORE_PIN41_CONFIG       PORTA_PCR29
  492. #define CORE_PIN42_CONFIG       PORTA_PCR26
  493. #define CORE_PIN43_CONFIG       PORTB_PCR20
  494. #define CORE_PIN44_CONFIG       PORTB_PCR22
  495. #define CORE_PIN45_CONFIG       PORTB_PCR23
  496. #define CORE_PIN46_CONFIG       PORTB_PCR21
  497. #define CORE_PIN47_CONFIG       PORTD_PCR8
  498. #define CORE_PIN48_CONFIG       PORTD_PCR9
  499. #define CORE_PIN49_CONFIG       PORTB_PCR4
  500. #define CORE_PIN50_CONFIG       PORTB_PCR5
  501. #define CORE_PIN51_CONFIG       PORTD_PCR14
  502. #define CORE_PIN52_CONFIG       PORTD_PCR13
  503. #define CORE_PIN53_CONFIG       PORTD_PCR12
  504. #define CORE_PIN54_CONFIG       PORTD_PCR15
  505. #define CORE_PIN55_CONFIG       PORTD_PCR11
  506. #define CORE_PIN56_CONFIG       PORTE_PCR10
  507. #define CORE_PIN57_CONFIG       PORTE_PCR11
  508. #define CORE_PIN58_CONFIG       PORTE_PCR0
  509. #define CORE_PIN59_CONFIG       PORTE_PCR1
  510. #define CORE_PIN60_CONFIG       PORTE_PCR2
  511. #define CORE_PIN61_CONFIG       PORTE_PCR3
  512. #define CORE_PIN62_CONFIG       PORTE_PCR4
  513. #define CORE_PIN63_CONFIG       PORTE_PCR5

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 23 de Mayo de 2017, 13:37:46
Has probado ctags o cscope
Por ejemplo con cscope

Código: [Seleccionar]
find . -name '*.c' -o -name '*.h' -o -name '*.cpp' > cscope.files
cscope -b
cscope

Te crea una base en la que puedes buscar desde los símbolos, definiciones, funciones, texto, etc.

He probado el find con esos parámetros, pero me daba errores. Al final he tecleado esto y me ha generado un fichero con una busqueda.

find "CORE" *.* > fichero.txt

Citar
O también puedes usar CodeQuery que tiene una interfaz gráfica

https://ruben2020.github.io/codequery/

Se ve interesante, lo probaré.

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 23 de Mayo de 2017, 13:40:12
A ver esto:
Solo extrae información del core MK66
He incluido una expresión para que extraiga todas las definiciones de pines.


Gracias, lo probaré.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: elgarbe en 23 de Mayo de 2017, 16:21:31
Phyton es tan complicado como potente. Es tan poco intuitivo que cuesta ponerse a estudiarlo. Pero es tan potente que no deberíamos dejar estudiarlo.
Si le agarras la mano no te vas a arrepentir!
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: Picuino en 23 de Mayo de 2017, 16:39:32
¿Poco intuitivo? Todo lo contrario. Si parece pseudocódigo.
Algunas funciones se pueden encadenar (al ser todo objetos) y puede parecer algo complicado, pero no lo es.

Si hay algo que no se entienda, decidlo y lo explico.

El primer programa es funcional, lo programé en 10 minutos sin interprete Python y funcionó a la primera. Pocas veces me pasa algo así con otros lenguajes y eso se debe a lo sencillo que es.

Saludos.
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 29 de Mayo de 2017, 16:36:28
.

Hoy me llegó el PCB que diseñé para probar el SAM S70 con mis pantallas led, luego se me ocurrieron algunas mejoras y mandé a fabricar una nueva versión que me llegará en unos días, como salen tan baratos.

Por cierto, este hilo aquí en micros de 8 bits no toca. Supongo que con la reconversión de los foros ha ido a parar a un subforo incorrecto, si algún administrador lo puede mover al subforo de ARM estará mejor.


(http://i1322.photobucket.com/albums/u573/planeta9999/SAM_TEST_zpsr05jozcj.jpg)

Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 07 de Junio de 2017, 14:11:01
.

Hoy recibí un par de PCB más, uno para probar el SAM S70, con algún hardware adicional, y otro para varias pruebas con el Kinetis MK66 de NXP. Ya me voy a poner a portar el proyecto de Teensy a SAM S70 en Atmel Studio, también espero el libro sobre Atmel ARM SAM que pedí a Amazón, a ver si con suerte tiene información útil para trabajar con el S70.

La peculiaridad de estos dos micros, el SAM ST70 y el MK66, es que ninguna de sus entradas es tolerante 5v, solo aceptan voltajes que no superen los 3.3v, por eso he tenido que añadir unos buffers CD4050 que conviertan los niveles de 5v a 3.3v.


(http://i1322.photobucket.com/albums/u573/planeta9999/DMD_TEST_001_zpsqdculeoi.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/DMD_TEST_002_zpsgmoy0fi0.jpg)
Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 12 de Junio de 2017, 21:54:06
.

Ensamblé las dos placas, una para el Atmel SAM S70 y otra para el NXP MK66, ambas placas para probar con mis pantallas a paneles LED RGB.

La idea en principio es portar un aplicativo hecho para Teensy, a un MK66, auque el compilado ya está probado sobre un MK66 y funciona perfectamente, pero quiero pasar los fuentes para trabajarlos desde KDS. Y lo siguiente es pasar el mismo aplicativo a un Atmel SAM S70, Cortex M7, 300Mhz, esto será más complicado, salvo que la gestión del DMA y las interrupciones no varien mucho de un micro a otro.


(http://i1322.photobucket.com/albums/u573/planeta9999/SAM7_001_zps58ayrfa8.jpg)

(http://i1322.photobucket.com/albums/u573/planeta9999/MK66_001_zpsrqgpbl18.jpg)



Título: Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
Publicado por: planeta9999 en 20 de Junio de 2017, 07:38:31
.

Sigo con Atmel Studio y los SAM Cortex M7. Por ahora todo lo que he visto es confuso, da la sensación de que están montando un pastel, pero ese pastel está por acabar, exactamente la misma sensación que da NXP con su MCUXpresso.

El produto promete mucho, pero le falta el tirón final para ponerse a la altura de ST, lo mismo para NXP. Depués de haber probado ST, NXP y Atmel, el más currado con bastante diferencia es el entorno de ST para los STM32.

Aún así sigo con los SAM Cortex M7, por el precio y la potencia, que en estos momentos está por encima de los STM32, y muy por encima de los Kinetis de NXP. En cuanto ST libere sus STM32H7 supongo que las tornas cambiaran, y se inclinarán tanto en software como en hardware hacia ST.

Concretando sobre Atmel Studio, permite generar proyectos de manera similar a como lo hace Cube de ST o Processor Expert de NXP. Para ello usan lo que denominan Atmel Start Project, esta opción llama al generador de código, que aunque se ejecuta en la web de Atmel, se ve en la ventana del IDE localmente. Pero hay otra forma de generar proyectos, es usando el ASF, con esta opción se añaden los módulos que queramos, pero la configuración hay que hacerla a mano, a diferencia de si optamos por Atmel Start.

Además, ASF y Atmel Start Project no son compatibles. Indagando un poco, la incompatibilidad parte de que Atmel Start está basado en la nueva versión ASF4, mientras que el ASF local en el IDE es la versión 3. Entiendo que lo lógico es que actualicen el ASF a la versión 4, para que todo sea compatible.

En principio, aunque Atmel Start permite configurarlo todo al detalle, por contra da pocos ejemplos de aplicativos prefabricados de los que partir, todo lo contrario que ASF. Al final, cada uno tiene sus cosas buenas y sus cosas malas.

El producto está muy bien, y es totalmente recomendable, salvando que al igual que NXP con su MCUXpresso, es algo que está por acabar, y se nota.

Ahora mismo, estoy sobre todo centrado en entender como se configura el DMA y como se gestionan las interrupciones, que es lo que más me interesa para el aplicativo que quiero hacer, portando parte de los fuentes de otro aplicativo hecho para Teesny/Kinetis MK66.


En la captura de pantalla, configurando el DMA para SPI, desde Atmel Star Project. Es un entorno muy detallado, pero falta la compatibilidad con ASF y que el proyecto generado se integre automáticamente con los fuentes del usuario, como si lo hace ST. El proyecto se puede regenerar cuantas veces si quiera, para añadir nuevos módulos o reconfigurar alguno, y aunque no respeta el código propio que hayamos añadido, te da opción para sobreescribir o no los fuentes tocados por nosotros, por ejemplo el main. A pesar de los puntos débiles del producto, me gusta bastante.

(http://www.todopic.com.ar/foros/imgtiny/fmt3jb.jpg)