Autor Tema: Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz  (Leído 15698 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #15 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

« Última modificación: 20 de Junio de 2017, 08:19:10 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #16 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?

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #17 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



Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #18 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):


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.
« Última modificación: 22 de Mayo de 2017, 11:58:58 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #19 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.


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #20 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:



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.
« Última modificación: 22 de Mayo de 2017, 12:07:57 por Picuino »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #21 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



Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #22 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
« Última modificación: 22 de Mayo de 2017, 12:11:32 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #23 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.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #24 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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #25 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #26 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.
« Última modificación: 22 de Mayo de 2017, 12:24:11 por Picuino »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #27 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
« Última modificación: 22 de Mayo de 2017, 12:28:11 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #28 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.


Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mi primer proyecto con Cortex M7, un Atmel SAM S70 a 300Mhz
« Respuesta #29 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);

« Última modificación: 22 de Mayo de 2017, 12:34:48 por planeta9999 »