gpio general purpose i/o · clear bit 3 of gpioc_pddr // initialize the output data values: led 1...

65
GPIO – General purpose I/O 18/05/2020 1

Upload: others

Post on 07-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

GPIO – General purpose I/O

18/05/2020 1

Lo que se verá en Informática

Aplicada

18/05/2020 2

GPIO - General Purpose (Digital!)

Input/Output Implementadas por pines de conexión

directa al exterior que representan la interfaz física entre el microcontrolador (MCU) y el mundo exterior al mismo.

El MCU detecta eventos en sus entradas y genera cambios en sus salidas. En general estos pines pueden configurarse como entradas o salidas. Además pueden tener otras funciones alternativas.

La lógica puede ser positiva o negativa.

18/05/2020 3

GPIO - General Purpose (Digital!)

Input/Output Pueden utilizarse como interfaz con dispositivos

externos simples

◦ Entradas: pulsadores

◦ Salidas: LEDs

Por ejemplo: encender LED1 o LED2 según la posición

del pulsador SW1

18/05/2020 4

GPIO - General Purpose (Digital!)

Input/Output En general, casi todos los MCUs separan los

pines en grupos llamados ports. En los Kinetis

cada port tienen 32 pines [31:0].

18/05/2020 5

100 LQFP Pinout Diagram

18/05/2020 6

El encapsulado cuadrado plano de perfil bajo o Low-profile Quad Flat

Package (LQFP) es un encapsulado de circuito integrado para montaje

superficial con los conectores de componentes extendiéndose por los

cuatro lados. Los pines se numeran en sentido contrario a las agujas

del reloj a partir del punto guía.

GPIO-Puertos

18/05/2020 7

GPIO contiene 5 Puertos de 32 bits c/u ◦ PORTA[31:0]

◦ PORTB[31:0]

◦ PORTC[31:0]

◦ PORTD[31:0]

◦ PORTE [31:0]

En página 172 de KL46P121M48SF4RM.pdf (KL46 Sub-Family Reference Manual) puede apreciarse la asociación de cada uno de ellos (columna Pin name) a cada pin (columna 100 LQFP) del encapsulado. No todos los pines de los ports están disponibles. Se puede observar también las distintas funciones que cumple cada pin (para limitar el tamaño del dispositivo).

GPIO - Ports

Como los pines están agrupados en ports,

el MCU puede leer todos los pines

del mismo a la vez y lo mismo para

modificarlos.

Cada port tiene asociado un conjunto de

registros de control de 32 bits, donde

cada bit del mismo se corresponde con

un bit del port.

18/05/2020 8

GPIO - Ports

Cada uno de estos registros está mapeado en

memoria. A partir de página 833 de

KL46P121M48SF4RM.pdf, para el port A:

18/05/2020 9

Diagrama en Bloques

18/05/2020 10

GPIO PORT

GPIO - PUERTOS

18/05/2020 11

Configuración

◦ Direction (I o O)

◦ MUX (GPIO)

Datos

◦ Output (diferentes

formas de acceder a ellas)

◦ Input

GPIO – PUERTOS - ESTRUCTURA

GPIO Peripheral Access Layer

Port Data Output Register (GPIOX_PDOR)[31:0]

Port Set Output Register (GPIOX_PSOR) [31:0]

Port Clear Output Register (GPIOX_PCOR) [31:0]

PORTX Port Toggle Output Register (GPIOX_PTOR) [31:0]

Port Data Input Register (GPIOX_PDIR) [31:0]

Port Data Direction Register (GPIOX_PDDR) [31:0]

X=A,B,C,D,E

18/05/2020 12

PDDR: Port Data Direction

18/05/2020 13

Cada pin puede

configurarse distinto

Input: 0

Output: 1

Reset clears port bit

direction to 0, por

seguridad. Apenas

se pone PDDR a 1,

el MCU excita el pin

de acuerdo al

registro del port

correspondiente

PDDR: Port Data Direction (pag.

838 de KL46P121M48SF4RM.pdf)

18/05/2020 14

Escribir en un puerto de salida

18/05/2020 15

Directo: escribir

valor en PDOR o:

Toggle: escribir 1

en PTOR

Clear (a 0):

Escribir 1 en

PCOR

Set (a 1): escribir 1

a PSOR

PDOR (pag. 835 de

KL46P121M48SF4RM.pdf)

18/05/2020 16

PSOR (pag. 836 de

KL46P121M48SF4RM.pdf)

18/05/2020 17

PCOR (pag. 836 de

KL46P121M48SF4RM.pdf)

18/05/2020 18

PTOR (pag. 837 de

KL46P121M48SF4RM.pdf)

18/05/2020 19

Leer de un puerto de entrada-

PDIR

18/05/2020 20

PDIR (pag. 837 de KL46P121M48SF4RM.pdf)

18/05/2020 21

GPIO – PUERTOS - ESTRUCTURA

El archivo de cabecera MKL46Z4.h, interface abstracta del hardware, describe las características mas importantes del MCU, en particular define punteros a los registros. El modificador volatile le indica al compilador que la variable declarada puede sufrir modificaciones que no estén explícitas en el código, en caso de leer una variable me garantiza que efectivamente sea leída, aún cuando no haya habido una operación de escritura sobre la misma.

/** FGPIO - Peripheral register structure */

typedef struct FGPIO_MemMap {

uint32_t PDOR; /**< Port Data Output Register, offset: 0x0 */

uint32_t PSOR; /**< Port Set Output Register, offset: 0x4 */

uint32_t PCOR; /**< Port Clear Output Register, offset: 0x8 */

uint32_t PTOR; /**< Port Toggle Output Register, offset: 0xC */

uint32_t PDIR; /**< Port Data Input Register, offset: 0x10 */

uint32_t PDDR; /**< Port Data Direction Register, offset: 0x14 */

} volatile *FGPIO_MemMapPtr;

18/05/2020 22

GPIO – PUERTOS - ESTRUCTURA

• Por ejemplo para port A

/* GPIO - Peripheral instance base addresses */

/** Peripheral PTA base pointer , sólo muestro para port A*/

#define PTA_BASE_PTR ((GPIO_MemMapPtr)0x400FF000u)

//Ver primero la transparencia siguiente, usa estas macros /* GPIO - Register accessors */

#define GPIO_PDOR_REG(base) ((base)->PDOR)

#define GPIO_PSOR_REG(base) ((base)->PSOR)

#define GPIO_PCOR_REG(base) ((base)->PCOR)

#define GPIO_PTOR_REG(base) ((base)->PTOR)

#define GPIO_PDIR_REG(base) ((base)->PDIR)

#define GPIO_PDDR_REG(base) ((base)->PDDR)

18/05/2020 23

GPIO – PUERTOS - ESTRUCTURA

/* GPIO - Register instance definitions , solo muestro para portA, accedo a los registros

accediendo a un campo de una estructura, a través de un puntero */

#define GPIOA_PDOR GPIO_PDOR_REG(PTA_BASE_PTR)

#define GPIOA_PSOR GPIO_PSOR_REG(PTA_BASE_PTR)

#define GPIOA_PCOR GPIO_PCOR_REG(PTA_BASE_PTR)

#define GPIOA_PTOR GPIO_PTOR_REG(PTA_BASE_PTR)

#define GPIOA_PDIR GPIO_PDIR_REG(PTA_BASE_PTR)

#define GPIOA_PDDR GPIO_PDDR_REG(PTA_BASE_PTR)

En lugar de direcciones uso estas macros, hace el software

más portable y permite escribir código de forma mas

intuitiva y mucho más fácil de leer. Para acceder a bits

individuales?

18/05/2020 24

Bitfields, Masks , …..

Secuencia!

18/05/2020 25

Se usan muchos los operadores a

nivel de bits!!, por ejemplo

18/05/2020 26

/* PDDR Bit Fields */

#define GPIO_PDDR_PDD_MASK 0xFFFFFFFFu

#define GPIO_PDDR_PDD_SHIFT 0

#define GPIO_PDDR_PDD(x)

(((uint32_t)(((uint32_t)(x))<<GPIO_PDDR_PDD_SHIFT))&GPIO_PD

DR_PDD_MASK)

Veremos cómo aplicar máscaras para leer o escribir a los distintos

registros para el caso particular de las I/O digitales que usaremos: 2

leds y 2 pulsadores

Pulsadores (del esquemático FRDM-

KL46ZSCH)

18/05/2020 27

Pulsadores (pags. 174 y 175 de

KL46P121M48SF4RM.pdf)

18/05/2020 28

Pulsador SW1 en pin 73 port PTC3 de GPIO

Pulsador SW2 en pin 88 port PTC12 de GPIO (El nombre del pulsador

tal como figura en la foto que trae el MCU es SW3, pero está

conectado al pin SW2)

Podemos apreciar en la figura anterior que, cuando el respectivo

switch es presionado, en los pines asociados a los puertos PTC3 y

PTC12, quedan en cero lógico(0). Cuando el pulsador está abierto para

garantizar un 1 lógico se debe conectar una resistencia de pull-up

interna.

LEDs (del esquemático FRDM-

KL46ZSCH)

18/05/2020 29

Como podemos apreciar en la figura, los LEDs se activan

cuando el pin del puerto correspondiente, tiene un 0 lógico

puesto que, el ánodo de los leds tiene un 1 como entrada. O

sea se apagan con un 1 lógico

LEDs verde y rojo (del esquemático

FRDM-KL46ZSCH)

18/05/2020 30

LEDs verde y rojo (pags. 172 y 175

de KL46P121M48SF4RM.pdf)

18/05/2020 31

LED1 verde pin 98 port PTD5 de GPIO

LED2 rojo pin 26 port PTE29 de GPIO

Pseudocódigo-primer intento

(incompleto)

18/05/2020 32

// Make PTD5 (LED1) and PTE29 (LED2) outputs set bit 5 of GPIOD_PDDR and bit 29 of GPIOE_PDDR // Make PTC3 input (SW1) clear bit 3 of GPIOC_PDDR // Initialize the output data values: LED 1 off, LED 2 //on, aquí usa PDOR podría haber usado los otros reg. set bit 5 of GPIOD_PDOR, clear bit 29 of GPIOE_PDOR // read switch, light LED accordingly do forever { if bit 3 of GPIOC_PDIR is 1 { // switch is not pressed, then LED 1 off, LED 2 on set bit 5 of GPIOD_PDOR clear bit 29 of GPIOE_PDOR } else { // switch is pressed, so light LED 1, LED 2 off clear bit 5 of GPIOD_PDOR set bit 29 of GPIOE_PDOR } }

Acceso a los bits de los ports –

Estilo de codificación

18/05/2020 33

Es probable que se cometan errores al usar literales binarias y hexadecimales

◦ “To set bits 13 and 19 of n, use 0000 0000 0000 1000 0010 0000 0000 0000 or 0x00082000”

Usar valores literales y shifts hacia la izquierda para ello

n = (1UL << 19) | (1UL << 13);

Defina macros (conviene ponerlas en un .h) para indicar la posición de un bit en un port, no tenemos que mirar a cada rato el manual!

#define GREEN_LED_POS (19)

#define YELLOW_LED_POS (13)

n = (1UL << GREEN_LED_POS) | (1UL<< YELLOW_LED_POS);

Cree otras macros para generar una máscara para el desplazamiento, usando las macros anteriores

#define MASK(x) (1UL << (x))

n = MASK(GREEN_LED_POS) | MASK(YELLOW_LED_POS);

Repaso de máscaras con

operadores a nivel de bits

18/05/2020 34

Para sobrescribir el valor existente en n con una máscara

n = MASK(foo);

Set en n todos los bits de una máscara que son 1s, no

modificando los demás

n |= MASK(foo);//read-modify-write

Complementar el valor de un bit de la máscara

~MASK(foo);

Clear en n todos los bits que son 0s en una máscara, no

modificando los demás

n &= ~ MASK(foo); //read-modify-write

• Verificar el valor de un bit en un registro

• Si es 0: if ( n & MASK(foo) == 0 ) ...

• Si es 1: if ( n & MASK(foo)) ...

Repaso

18/05/2020 35

Repaso

18/05/2020 36

Repaso

18/05/2020 37

Ejemplos de uso de máscaras con

operadores a nivel de bits

18/05/2020 38

#define LED1_POS 5

#define LED2_POS 29

#define SW1_POS 3

#define SW2_POS 12

#define MASK(x) (1UL<<(x))

GPIOD_PDDR |=MASK(5); //Salida

GPIOC_PDDR &= ~MASK(3);//Entrada

#define LED1_On() (GPIOD_PCOR=MASK(5))

#define LED1_Off() (GPIOD_PSOR=MASK(5))

#define LED1_Toggle() (GPIOD_PTOR=MASK(5))

//pueden usar una máscara para evaluar en un if

//si se ha presionado un pulsador

if(GPIOC_PDIR & (MASK(3)) ==0)//si se pulsó SW1

18/05/2020 39

Clock Gating

Los procesadores modernos poseen mecanismos para reducir el

consumo del chip apagando todos los recursos que no son

usados. Esto se logra apagando el clock de dichos módulos (clock

gating).

Para configurar que módulos reciben clock se deben habilitar los

bits correspondientes en los registros SCGCx (System Clock

Gating Control Register x).

Después del reset estos bits están apagados para ahorrar energía.

Los SCGCx. se encuentran dentro del modulo SIM (System

Integration Module).

Antes de usar un modulo se debe habilitar el clock de lo

contrario se genera un error!. De igual forma antes de apagar un

clock, se deberá deshabilitar el modulo.

Port Clock Gating

18/05/2020 40

La lógica de PORT requiere clock para funcionar el registro correspondiente es SCGC5.

SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK|

SIM_SCGC5_PORTD_MASK

|SIM_SCGC5_PORTE_MASK;

Pág. 216-217 y 202 de

KL46P121M48SF4RM.pdf

En MKL46Z4.h

18/05/2020 41

/** SIM - Peripheral register structure */

typedef struct SIM_MemMap {

uint32_t SCGC4; /**< System Clock Gating Control Register 4,

offset: 0x1034 */

uint32_t SCGC5; /**< System Clock Gating Control Register 5,

offset: 0x1038 */

} volatile *SIM_MemMapPtr;

/* SIM - Peripheral instance base addresses */

/** Peripheral SIM base pointer */

#define SIM_BASE_PTR ((SIM_MemMapPtr)0x40047000u)

/* SIM - Register accessors */

#define SIM_SCGC5_REG(base) ((base)->SCGC5)

/* SCGC5 Bit Fields, hay más */

#define SIM_SCGC5_PORTA_MASK 0x200u

#define SIM_SCGC5_PORTC_MASK 0x800u

#define SIM_SCGC5_PORTD_MASK 0x1000u

#define SIM_SCGC5_PORTE_MASK 0x2000u

Configurando un pin como GPIO

18/05/2020 42

PDOR select

PDIR select

PDDR select

Data Bus

bit n

Port Data

Direction

Register

D Q

Port Data

Output

RegisterD Q

Address

Decoder

Address

Bus

Pin or

Pad on

package

Port Data

Input

Register

D Q

I/O Clock

Tgl

Rst

SetPSOR select

PCOR select

PTOR select

Freescale: is the pin

mux location in this

diagram accurate?

Pin Control

Register

MUX field

Se usa un multiplexor para incrementar la configurablidad de los pines. ¿Cómo

conectamos un pin a la circuitería interna?

Cada pin configurable tiene asociado un Pin Control Register (PCR) de 32 bits,

el cual tiene un campo MUX para definir qué función tendrá el pin

PORTX_PCRn X=A,B,C,D,E n=0:31

Pin Control Register (pág. 193-195 y

187 de KL46P121M48SF4RM.pdf)

18/05/2020 43

PIN CONTROL REGISTER

18/05/2020 44

Descripción de señales según el encapsulado

MK64FN1M0VLL12 (FRDM-K64 Board)

LL = 100 LQFP (14 mm x 14 mm)

PCR en el header

18/05/2020 45

/** PORT - Peripheral register structure */

typedef struct PORT_MemMap {

uint32_t PCR[32]; /**< Pin Control Register n, array offset: 0x0, array step: 0x4 */

uint32_t GPCLR; /**< Global Pin Control Low Register, offset: 0x80 */

uint32_t GPCHR; /**< Global Pin Control High Register, offset: 0x84 */

uint8_t RESERVED_0[24];

uint32_t ISFR; /**< Interrupt Status Flag Register, offset: 0xA0 */

} volatile *PORT_MemMapPtr;

/* PORT - Register accessors, hay otros */

#define PORT_PCR_REG(base,index) ((base)->PCR[index])

/* PCR Bit Fields, sólo los que usaremos */

#define PORT_PCR_MUX_MASK 0x700u

#define PORT_PCR_MUX_SHIFT 8

#define PORT_PCR_MUX(x)

(((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK)

#define PORT_PCR_PS_MASK 0x1u

#define PORT_PCR_PS_SHIFT 0

#define PORT_PCR_PE_MASK 0x2u

#define PORT_PCR_PE_SHIFT 1

/* PORT - Register array accessors, hay más */

#define PORTD_PCR(index) PORT_PCR_REG(PORTD_BASE_PTR,index)

//donde

/** Peripheral PORTD base pointer */

#define PORTD_BASE_PTR ((PORT_MemMapPtr)0x4004C000u)

MUX del Pin control Register

18/05/2020 46

MUX (bits 10-8) Configuration

000 Pin disabled (analog)

001 Alternative 1 – GPIO

010 Alternative 2

011 Alternative 3

100 Alternative 4

101 Alternative 5

110 Alternative 6

111 Alternative 7

//Set PT5 (connected to green LED) for GPIO functionality

PORTD_PCR5|=PORT_PCR_MUX(1);

PCR – Pull UP/DOWN

18/05/2020 47

La resistencia de Pull-Up fuerza a nivel

alto el pin, cuando el pulsador está

abierto.

PCR – Pull UP/DOWN (pág. 95 de

KL46P121M48SF4RM.pdf)

18/05/2020 48

PCR – Pull UP/DOWN

Ejemplo de configuración de un pin como

GPIO con resistencia de pull-up (SW1)

PORTC_PCR3 |= PORT_PCR_MUX(1) |

PORT_PCR_PE_MASK |

PORT_PCR_PS_MASK;

18/05/2020 49

Pasos a seguir en la configuración

(para Informática Aplicada) Verificar en el pinout a qué puerto (y bit)

está conectado el SW o LED a usar

Habilitar los respectivos clocks de los ports a utilizar, a través del registro SIM_SCGC5

Use PORTx_PCRn (x es el PORT y n número de pin del PORT) para seleccionar la opción ALT1 (con el campo MUX), además si uso el pin como entrada (SW) debe habilitar y conectar la resistencia de pull-up

Si quiere inicializar algún LED apagado use GPIOx_PSOR(x es el PORT)

18/05/2020 50

Pasos a seguir en la configuración

(para Informática Aplicada) Configurar el pin como entrada (SW) o

como salida (LED) usando GPIOx_PDDR, donde x es el PORT correspondiente

Una vez configurado los pines: si es un pin de entrada (SW), puede leerse el estado con GPIOx_PDIR. Si es un pin de salida (LED) puede controlarse con varios registros: GPIOx_PCOR, GPIOx_PSOR, GPIOx_PTOR (toggle) o con GPIOx_PDOR

18/05/2020 51

Flujo de una aplicación en un MCU

Hay diferentes formas de estructurarlo. En la materia

veremos sólo una, en los siguientes cuatrimestres se

verán otras

◦ “The difference between polling and interrupt is whether

software asks, or whether the hardware tells it!”

A diferencia de una aplicación en una PC, en una de un

MCU, el flujo no tiene fin, es decir existe un programa

que se ejecuta indefinidamente mientras el MCU esté

alimentado o no se resetee.

Casi siempre ejecutan un único programa (sistemas

dedicados).

18/05/2020 52

Polling o encuesta

A veces se lo suele llamar super loop

En aplicaciones sencillas es fácil de implementar y

funciona bastante bien con tareas simples. Su principal

ventaja es la simplicidad.

18/05/2020 53

Polling o encuesta

Sin embargo cuando las aplicaciones son más complejas

y demandan mayor capacidad de procesamiento no es

adecuado. Se pueden llegar a perder eventos, debido a

que el código se ejecuta en un determinado orden y, no

en respuesta a un evento.

18/05/2020 54

Polling o encuesta

Otra desventaja: el procesador tiene que ejecutar el

polling todo el tiempo, aún sino se requiere

procesamiento, reduciendo por tanto la eficiencia

energética.

Por ejemplo: si el polling se hace sobre un teclado que,

como mucho puede producir 10 eventos de entrada

por segundo, el mismo debe ser encuestado millones de

veces (aún en los CPU más lentos) por el pulsado de

teclas. Por tanto el CPU pierde casi todo su tiempo

comprobando que no hay ningún evento de entrada y,

una vez cada algunos millones de iteraciones encuentra

algo útil para hacer

18/05/2020 55

Polling o encuesta

Como verán al escribir programas para el MCU,

el procesador gasta un gran número de ciclos

de CPU en un lazo que sirve sólo para generar

un retardo

18/05/2020 56

Conviene usar polling cuando…

El operador es humano

No se requiere una temporización precisa

El estado es más importante que el cambio

Los “impulsos” duran mucho

Hay ruido en la señal

Hay cosas para hacer en el main (pero no

demasiado)

18/05/2020 57

Cómo programarán el MCU?

El software se ejecuta directamente sobre el hardware

(bare metal), sin sistema operativo. El software tiene

acceso directo a los recursos del hardware.

Existe un término específico para el software de un

MCU: firmware, un software que maneja físicamente al

hardware, grabado en una memoria de tipo no volátil

(ROM, EEPROM, flash,...). Es una combinación de

software y hardware.

Contiene el bootloader

18/05/2020 58

Bootloader

Pieza de código (en nuestro MCU reside en flash)

que se encarga de :

◦ Inicializar el hardware de forma básica

◦ Gestiona de forma automática (sin ningún hardware

adicional) el proceso de grabación en flash del programa

que queremos que el MCU ejecute, transferirle el control

así como, permitir su actualización

◦ Es siempre la primera aplicación que se ejecuta después de

un reinicio; decide si la aplicación principal está lista para

iniciar su ejecución o no y, si se procede a realizar una

actualización. El beneficio de tener un bootloader es

principalmente permitir la reprogramación del sistema.

18/05/2020 59

Bootloader

La descarga se hace a través de un puerto serie

virtual en un USB (OpenSDA USB)

OpenSDA (Open-standard serial and

debug adapter), actúa como un puente entre

la PC (donde tendremos instalado nuestro IDE)

y el MCU; se usa para debug, programación en

flash (en nuestro caso a través de CodeWarrior,

IDE open source), y comunicación serie a través

de un cable USB.

18/05/2020 60

Bootloader

18/05/2020 61

http://electronicams.blogspot.com.ar/2013/10/primeros-pasos-con-la-

interfaz-opensda.html o en

http://www.dsi.fceia.unr.edu.ar/images/downloads/InformaticaAplicada

/SASE_2014_FREESCALE_Workshop_Microcontroladores_Kinetis.p

df

Cómo programarán el MCU?

Usaremos una herramienta de desarrollo de

software del MCU (target) que se ejecutará en

la PC (host)

Cross-compiler: traductor de lenguaje de alto

nivel a código ejecutable que se ejecuta en una

plataforma pero que genera código de otra

plataforma diferente

Toolchain: conjunto de herramientas que

permiten realizar la compilación cruzada

◦ Compilador, linker, librerias, debbuger

18/05/2020 62

El 1° programa en el MCU

Hello World!...???

18/05/2020 63

Hello World!

18/05/2020 64

void delay(int ms){

int i;

for(i=ms*1500;i>0;i--) // 1000 is about 1 s at 20 - 25 Mhz

{

}}

Referencias

18/05/2020 65

Algunas transparencias se extrajeron de:

http://ik.itba.edu.ar/~jacoby/Lab%20micros%202015/Teoricas/Kinetis/

Letct00/GPIOv003.pdf

Peripherals of Freescale Kinetis microcontrolers –ARM University

Program. Gracias!