Documentos de Académico
Documentos de Profesional
Documentos de Cultura
28/05/2020 1
Lo que se verá en Informática
Aplicada
28/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.
28/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
28/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].
28/05/2020 5
100 LQFP Pinout Diagram
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.
28/05/2020 6
GPIO-Puertos
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).
28/05/2020 7
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.
28/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:
28/05/2020 9
Diagrama en Bloques
GPIO PORT
28/05/2020 10
GPIO - PUERTOS
Configuración
◦ Direction (I o O)
◦ MUX (GPIO)
Datos
◦ Output (diferentes
formas de acceder a ellas)
◦ Input
28/05/2020 11
GPIO – PUERTOS - ESTRUCTURA
GPIO Peripheral Access Layer
X=A,B,C,D,E
28/05/2020 12
PDDR: Port Data Direction
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
28/05/2020 13
PDDR: Port Data Direction (pag.
838 de KL46P121M48SF4RM.pdf)
28/05/2020 14
Escribir en un puerto de salida
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
28/05/2020 15
PDOR (pag. 835 de
KL46P121M48SF4RM.pdf)
28/05/2020 16
PSOR (pag. 836 de
KL46P121M48SF4RM.pdf)
28/05/2020 17
PCOR (pag. 836 de
KL46P121M48SF4RM.pdf)
28/05/2020 18
PTOR (pag. 837 de
KL46P121M48SF4RM.pdf)
28/05/2020 19
Leer de un puerto de entrada-
PDIR
28/05/2020 20
PDIR (pag. 837 de
KL46P121M48SF4RM.pdf)
28/05/2020 21
Filosofía de desarrollo de software
para microcontroladores ARM
Cortex-M
Esta arquitectura está pensada para
desarrollo en lenguaje C
Los microcontroladores ARM Cortex-M
son complejos
Primera solución
◦ Cada fabricante crea sus bibliotecas C para
simplificar
28/05/2020 30
CMSIS –Acceso a los registros de
hardware
En el archivo de cabecera MKL46Z4.h se definen estructuras
(struct) en C para representar registros de hardware del MCU
/** GPIO - Register Layout Typedef */
typedef struct {
__IO uint32_t PDOR; /**< Port Data Output Register, offset: 0x0 */
__O uint32_t PSOR; /**< Port Set Output Register, offset: 0x4 */
__O uint32_t PCOR; /**< Port Clear Output Register, offset: 0x8 */
__O uint32_t PTOR; /**< Port Toggle Output Register, offset: 0xC */
__I uint32_t PDIR; /**< Port Data Input Register, offset: 0x10 */
__IO uint32_t PDDR; /**< Port Data Direction Register, offset: 0x14 */
} GPIO_Type;
Este header define punteros a los registros
28/05/2020 33
Se usan muchos los operadores a
nivel de bits!!, por ejemplo
28/05/2020 34
Pulsadores (del esquemático FRDM-
KL46ZSCH)
28/05/2020 35
Pulsadores (pags. 174 y 175 de
KL46P121M48SF4RM.pdf)
28/05/2020 37
LEDs verde y rojo (del esquemático
FRDM-KL46ZSCH)
28/05/2020 38
LEDs verde y rojo (pags. 172 y 175
de KL46P121M48SF4RM.pdf)
28/05/2020 39
Pseudocódigo-primer intento
(incompleto)
// 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
}
}
28/05/2020 40
Acceso a los bits de los ports –
Estilo de codificación
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”
28/05/2020 41
Repaso de máscaras con
operadores a nivel de bits
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)) ...
28/05/2020 42
Repaso
28/05/2020 43
Repaso
28/05/2020 44
Repaso
28/05/2020 45
Ejemplos de uso de máscaras con
operadores a nivel de bits
28/05/2020 47
Port Clock Gating
La lógica de PORT requiere clock para funcionar el registro
correspondiente es SCGC5.
28/05/2020 48
En MKL46Z4.h
/** SIM - Register Layout Typedef */
typedef struct {/* SIM - Peripheral instance base addresses */
...
__IO uint32_t SCGC5; /**< System Clock Gating Control Register 5,
offset: 0x1038 */
...
} SIM_Type, *SIM_MemMapPtr;
28/05/2020 49
En MKL46Z4.h - Macros
/* 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
PSOR select
Set
PCOR select
Rst Port Data
PTOR select Pin or
Tgl Output
Pad on
D Register Q package
I/O Clock
PDIR select
Port Data Pin Control
D Input Q Register
Register MUX field
28/05/2020 51
Pin Control Register (pág. 193-195 y
187 de KL46P121M48SF4RM.pdf)
28/05/2020 52
PIN CONTROL REGISTER
Descripción de señales según el encapsulado
28/05/2020 53
Soporte de CMSIS para PCR en C
/** PORT - Register Layout Typedef */
typedef struct {
__IO uint32_t PCR[32]; /**< Pin Control Register n,
array offset: 0x0, array step: 0x4 */
__O uint32_t GPCLR; /**< Global Pin Control Low
Register, offset: 0x80 */
__O uint32_t GPCHR; /**< Global Pin Control High
Register, offset: 0x84 */
uint8_t RESERVED_0[24];
__IO uint32_t ISFR; /**< Interrupt Status Flag Register, offset:
0xA0 */
} PORT_Type;
m Laboratorio de Microprocesadores 55
28/05/2020 Laboratorio de Microprocesadores 56
MUX del Pin control Register
//Set PT5 (connected to green LED) for GPIO functionality
PORTD->PCR[5] |=PORT_PCR_MUX(1);
28/05/2020 57
PCR – Pull UP/DOWN
La resistencia de Pull-Up fuerza a nivel
alto el pin, cuando el pulsador está
abierto.
28/05/2020 58
PCR – Pull UP/DOWN (pág. 95 de
KL46P121M48SF4RM.pdf)
28/05/2020 59
PCR – Pull UP/DOWN
En el header existen macros y constantes
/*! @name PCR - Pin Control Register n */
#define PORT_PCR_PS_MASK (0x1U)
#define PORT_PCR_PS_SHIFT (0U)
#define PORT_PCR_PS(x)
(((uint32_t)(((uint32_t)(x)) << PORT_PCR_PS_SHIFT))
& PORT_PCR_PS_MASK)
PORTC->PCR[3] |= PORT_PCR_MUX(1) |
PORT_PCR_PE_MASK |
PORT_PCR_PS_MASK;
28/05/2020 61
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->PCR[n] (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
PTx->PSOR(x es el PORT)
28/05/2020 62
Pasos a seguir en la configuración
(para Informática Aplicada)
Configurar el pin como entrada (SW) o
como salida (LED) usando PTx->PDDR,
donde x es el PORT correspondiente
Una vez configurado los pines: si es un pin
de entrada (SW), puede leerse el estado
con PTx->PDIR. Si es un pin de salida
(LED) puede controlarse con varios
registros: PTx->PCOR, PTx->PSOR, PTx-
>PTOR (toggle) o con PTx->PDOR
28/05/2020 63
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).
28/05/2020 64
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.
28/05/2020 65
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.
28/05/2020 66
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
28/05/2020 67
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
28/05/2020 68
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)
28/05/2020 69
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
28/05/2020 70
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.
28/05/2020 71
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.
28/05/2020 72
Bootloader
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
28/05/2020 73
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
28/05/2020 74
El 1° programa en el MCU
Hello World!...???
28/05/2020 75
Hello World!
}}
28/05/2020 76
Referencias
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!
77
28/05/2020