gpio general purpose i/o · clear bit 3 of gpioc_pddr // initialize the output data values: led 1...
TRANSCRIPT
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
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
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
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 , …..
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 (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 (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)) ...
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
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
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
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!