Meta2.2 A Presentacion Gpio Stm32 2021-1 v2 - Alumnos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 54

Microcontroladores

UNIDAD 2
GPIO - REGISTROS

Facultad de Ciencias de la Ingeniería, Administrativas y Sociales


Unidad Tecate
Dr. Jesús David Avilés Velázquez
GPIO vs SPIO
GPIO

El software puede programar un Puerto/Pin de Entrada/Salida de


Propósito General (GPIO) en un microcontrolador, los cuales
cumplen:

• Entrada Digital detecta si un voltaje externo tiene un nivel alto o bajo.

• Salida Digital controla el voltaje en el pin.

Se pueden tener grupos de pines GPIO de 8 o 16, los cuales pueden compartir los
mismos registros de configuración.
Microcontrolador
Procesador Cortex M4
STM32F4xx usa un procesador Cortex-M4
Layout
Ejemplo
Datasheet - STM32F446E
Mapa de Memoria de STM32F446
• ARM tiene 4 Giga Bytes (GB) de espacio de direccionamiento de
memoria.

• Para configurar los Periféricos de Entradas/Salidas, ARM usa memoria


mapeada para Entradas/Salidas, es decir los REGISTROS de periféricos
de Entradas/Salidas son mapeados en el espacio de memoria de 4GB.

Tipo de Memoria Tamaño Rango de


direccionamiento
ENTRADAS/SALIDAS Periféricos 0x40000000 – 0x4xxxxxxx
SRAM 128KB 0x20000000 – 0x20001FFF
FLASH 512 KB 0x00000000 – 0x0007FFFF
Mapa de Memoria de STM32F446
Diagrama de Bloques
• ARM tiene 2 tipos de buses:
APB(Advanced Peripheral Bus) y AHB
(Advanced High Performance Bus)

• AHB es un bus diseñado para interfaces


de memoria y Entradas/Salidas al CPU de
forma rápida.

• En los STM32, los puertos GPIO están


conectados al bus AHB por medio de
puentes AHB/APB1 y AHP/APB2.
Datasheet - TM4C1423GH6PM
Datasheet - TM4C1423GH6PM
Datasheet - NXP LPC 1768
Datasheet - NXP LPC 1768
Buses
Diagrama de Bloques
Diagrama de Bloques
Estructura GPIO
Estructura GPIO
Estructura GPIO
Estructura GPIO
Direccionamiennto de Registros GPIO
Direccionamiennto de Registros GPIO
Registros GPIO

Dirección Registro Descripción


0x00 GPIOx_MODER GPIOx Port Mode(Direction)
0x04 GPIOx_OTYPER Output Type Register
0x08 GPIOx_OSPEEDR Output Speed Register
0x0C GPIOx_PUDR Pull-Up / Down Register
0x10 GPIOx_IDR Port Input Data
Register
0x14 GPIOx_ODR Port Output Data Register
0X18 GPIOx_BSRR Bit Set / Reset Register

Donde x= A, B, C,….. son puertos


REGISTROS
REGISTROS
REGISTROS
REGISTROS
Diagrama de flujos de configuración
Codificación
Programación de GPIO
Programa No. 1:
Encendido de LED
//Programa GPIO No. 1: ENCENDIDO DE LED
#include "stm32f4xx.h"

• while(1){ } int main(void){

RCC->AHB1ENR |= 1; // HABILTACION RELOJ GPIOA


GPIOA->MODER |=0x400; //REGISTRO MODO DIRECCION SALIDA
• for(;;) { } PA5

GPIOA->ODR |= 0x20; //REGISTRO DE DATO DE SALIDA EN


PIN PA5
• RCC->AHB1ENR |= while(1) {
}
RCC_AHB1ENR_GPIOAEN; }
Programación de GPIO
Programa No. 1: Encendido de LED
Programación de GPIO
Programa No. 1: Encendido de LED
Programación de GPIO
Programa No. 2B: //Programa GPIO No. 2: CONMUTACION DE LED
Conmutación de LED #include "stm32f4xx.h"
int main(void){

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA


GPIOA->MODER |=0X400; //REGISTRO MODO DIRECCION SALIDA PA5
- Considerar RETARDO:
int i;
while(1){
int i; GPIOA->ODR |= 0x20; //REGISTRO DE DATO DE SALIDA. ALTO EN PIN PA5
GPIOA->ODR ^=1<<5;// for(i=0;i<100000;i++);
CONMUTACION LED GPIOA->ODR &=~0x20; // BAJO EN PIN PA5
i = 50000; // RETARDO for(i=0;i<300000;i++);
do (i--); }
while (i!= 0); }

- Considerar funciones
Programación de GPIO
#include "stm32f4xx.h"
Programa No.2C: #define GPIOA_EN (1<<0)
#define MODER_5_OUT (1<<10)
CONMUTA A LED
#define ODR_5_SET (1<<5)
#define ODR_5_RESET (0<<5)
OR Exclusiva #define LED_PIN (1<<5)

int main(void){
RCC->AHB1ENR|= GPIOA_EN;

GPIOA->MODER|= MODER_5_OUT;

while(1){

for(int i=0; i<900000;i++){}


GPIO->ODR^=ODR_5_RESET;

}
Programación de GPIO
//ProgramaGPIO No. 2: CONMUTACION DE LED
Programa No. 2D: #include "stm32f4xx.h"
void delayMs(int ms);
Conmutación de LED int main(void){
Con funciones
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA
GPIOA->MODER |=0x400; //REGISTRO MODO DIRECCION SALIDA PA5

Probar con otros retardos: while(1){


GPIOA->ODR |= 0x20; //REGISTRO DE DATO DE SALIDA. ALTO EN PIN PA5
delayMs(100);
void delayMs(int ms){ GPIOA->ODR &=~0x20; // BAJO EN PIN PA5
volatile int i; delayMs(100);
for(;ms>0;ms--) }
for(i=0;i<3195;i++); }
} void delayMs(int ms){
while (ms-- > 0) {
volatile int x=5971;
while (x-- > 0)
("nop");
}
}
Programación de GPIO
Programa No. 2: Conmutación de LED
Codificación
Los puertos GPIO de la familia STM32 tienen un registro adicional que facilita la activación y
desactivación de un pin (o más). Este registro permite al programa establecer o restablecer
un bit o bits del registro mediante una sola instrucción de escritura: GPIOx_BSRR (registro
de SET / RESET de bits GPIO).

Escribir en el registro solo afecta a los pines en los que los bits correspondientes en el valor
escrito son "1". Esto hace que sea más fácil activar o desactivar un solo pin o algunos pines
sin afectar a los otros pines.

Los 16 bits inferiores (D15-D0) del registro GPIOx_BSRR se encienden (establecen) un bit y
los 16 bits superiores (D31-D16) se apagan (restablecen) un bit. Por ejemplo, escribir un
valor 0x00000020 en GPIOA_BSRR activará el bit PA5 de ese puerto sin modificar ningún
otro pin. Estos registros hacen que el programa sea más legible, más rápido de ejecutar y,
dado que una escritura en estos registros, es una ejecución de una sola instrucción y no se
interrumpirá
Programación de GPIO
//Programa GPIO No. 2C: CONMUTACION DE LED CON BSRR
Programa No. 2E: #include "stm32f4xx.h"
#include <stdio.h>
Conmutación de LED
void delayMs(int ms);
Con funciones y BSRR
int main(void){
¿Qué sucede con el valor RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA
guardado en la dirección GPIOA->MODER |=0X400; //REGISTRO MODO DIRECCION SALIDA PA5
int i;
del registro BSRR? while(1){
GPIOA->BSRR =0x00000020; // LED ENCENDIDO
Probar con otros retardos: delayMs(100);
GPIOA->BSRR =0x00200000; // LED APAGADO
delayMs(100);
void delayMs(int ms){ }
volatile int i; }
for(;ms>0;ms--) void delayMs(int ms){
for(i=0;i<3195;i++); while (ms-- > 0) {
} volatile int x=5971;
while (x-- > 0)
("nop");
}
}
Programación de GPIO
Programa No. 2: Conmutación de LED CON BSRR
Programación de GPIO
//Programa GPIO No. 3: CONMUTACION DE LED TRUESTUDIO
Programa No. 3: #include "stm32f4xx.h"
#define LED_VERDE 1<<5;
Conmutación de LED void delay(int ms);
void GPIOA_Habilitacion_reloj();
Funciones de retardo y void Inicializacion_Puertos();
configuración int main(void){// RUTINA PRINCIPAL
GPIOA_Habilitacion_reloj();
Inicializacion_Puertos();
while(1){
GPIOA->ODR |= LED_VERDE; //REGISTRO DE DATO DE SALIDA. ALTO EN PIN PA5
delay(100000);
Probar con otros retardos: GPIOA->ODR &=~ LED_VERDE; // BAJO EN PIN PA5
delay(300000);
}
void delayMs(int ms){ }
volatile int i; void delay(int ms){
for(;ms>0;ms--) for(;ms>0;ms--);
for(i=0;i<3195;i++); }
} void GPIOA_Habilitacion_reloj(){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA
}
void Inicializacion_Puertos(){
GPIOA->MODER |= 1<<10; //REGISTRO MODO DIRECCION SALIDA PA5
}
Programación de GPIO
//ProgramaGPIO No. 3: CONMUTACION DE LED KEIL
Programa No. 3: #include "stm32f4xx.h"
#define LED_VERDE (1<<5);
Conmutación de LED void inicializacion();
void delayMs(int ms);
Con funciones y int main(void){
retardos usando Keil
inicializacion();

while(1){
GPIOA->ODR |= LED_VERDE; //REGISTRO DE DATO DE SALIDA. ALTO EN PIN PA5
delayMs(10);
Probar con otros retardos: GPIOA->ODR &=0;//~LED_VERDE; // BAJO EN PIN PA5
delayMs(10);
}
void delayMs(int ms){ }
volatile int i; void delayMs( int ms){
for(;ms>0;ms--) volatile int i;
for(i=0;i<3195;i++); for(;ms>0;ms--)
} for(i=0;i<10155;i++);
}
void inicializacion(){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA
GPIOA->MODER |=0x400; //REGISTRO MODO DIRECCION SALIDA PA5
}
Programación de GPIO
//ProgramaGPIO No. 4: CONMUTACION DE LED TRUESTUDIO KEIL
Programa No. 4: #include "stm32f4xx.h"
#define LED_VERDE (1<<5);
Conmutación de LED void inicializacion();
void delayMs(int ms);
Incorporando todos los //RUTINA PRINCIPAL
registros int main(void){
inicializacion();
while(1){
GPIOA->ODR |= LED_VERDE; //REGISTRO DE DATO DE SALIDA. ALTO EN PIN PA5
delayMs(100);
GPIOA->ODR &=0;//~LED_VERDE; // BAJO EN PIN PA5
Probar con otros retardos: delayMs(100);
}}
void inicializacion(){
void delayMs(int ms){ RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // HABILTACION RELOJ GPIOA
volatile int i; GPIOA->MODER |=1<<10; //REGISTRO MODO DIRECCION SALIDA PA5
for(;ms>0;ms--) GPIOA->OTYPER &=~(1<<2);
for(i=0;i<3195;i++); GPIOA->OSPEEDR &= ~(3<<4);
} GPIOA->PUPDR &= ~(3<<4);
}
void delayMs( int ms){
volatile int i;
for(;ms>0;ms--)
for(i=0;i<3195;i++);
}
Programación de GPIO
/* Programa GPIO No. 5: ENTRADA DIGITAL CON BOTON EN PC13
PARA ENCEDIDO DE LED EN PA5 TRUESTUDIO KEIL Programa No. 5:
* PA5: LED VERDE ENTRADA DIGITAL
* PC13: BOTÓN */
IDR
#include "stm32f4xx.h"

int main(void) {
RCC->AHB1ENR |= 4; //Habilitación Puerto C
En PC_IDR_13 lee un 1 cuando
RCC->AHB1ENR |= 1; //Habilitación Puerto A
interruptor está desactivado.
GPIOA->MODER |= 0x400; //SALIDA DIGITAL EN PA5
GPIOC->MODER &=~ (1<<13); //ENTRADA DIGITAL EN PC13
Lee un 0 cuando interruptor está
activado.
while(1) {
if (GPIOC->IDR & 0x2000) // Si PC13 es alto
GPIOA->BSRR = 0x00200000; // LED está apagado
else
GPIOA->BSRR = 0x00000020; // LED enciende
}
}
Programación de GPIO
Programación de GPIO
Programa No. 5: ENTRADA DIGITAL ACTIVA A LED
Programación de GPIO
Programa No. 6:
ENTRADA DIGITAL
/* ProgramaGPIO No. 6: ENTRADA DIGITAL CON BOTON EN
IDR –ODR PC13 PARA ENCEDIDO DE LED EN PA5 TRUESTUDIO KEIL
* PA5: LED VERDE
SENTENCIA IF * PC13: BOTÓN */
DIFERENTE
#include "stm32f4xx.h"
En PC_IDR_13 lee un 1 cuando
interruptor está desactivado. int main(void) {
RCC->AHB1ENR |= 4; //Habilitación Puerto C
Lee un 0 cuando interruptor está RCC->AHB1ENR |= 1; //Habilitación Puerto A
activado. GPIOA->MODER |= 0x400; //SALIDA DIGITAL EN PA5
GPIOC->MODER &=~ (1<<13); //ENTRADA DIGITAL EN PC13
// GPIOC->PUPDR |= (1<<27); //PUL-DOWN EN PC13

while(1) {
if ((GPIOC->IDR & 0x2000)==0x0000) // LEE VALOR DE PC13
GPIOA->ODR |= 1<<5; // LED ENCIENDE
else
GPIOA->ODR &= ~(1<<5); // LED APAGADO
}
}
Programación de GPIO
Programa No. 6: ENTRADA DIGITAL ACTIVA A LED CON IDR-ODR
Programación de GPIO
Programa No.7: /* Programa GPIO No. 7: ENTRADA DIGITAL CON BOTON EN PC13 PARA
ENCEDIDO DE LED EN PA5 TRUESTUDIO KEIL PROBLEMA DE REBOTES
ENTRADA DIGITAL
* PA5: LED VERDE
CONMUTA A LED * PC13: BOTÓN */
CON PROBLEMA DE #include "stm32f4xx.h"
REBOTES #include <stdio.h>
#define LED_VERDE (1<<5)
#define LED_ROJO (1<<7)
#define BOTON (1<<13)
#define DELAY 500
int i;
void inicializacion();

int main(void) {
inicializacion();
while(1) {
if ((GPIOC->IDR & BOTON )==0x0000) {
GPIOA->ODR ^= LED_VERDE; // CONMUTACION LED
}}}
void inicializacion(){
RCC->AHB1ENR |= 4; //Habilitación Puerto C
RCC->AHB1ENR |= 1; //Habilitación Puerto A
GPIOA->MODER |= 0x400; //SALIDA DIGITAL EN PA5
GPIOC->MODER &=~ (1<<13); //ENTRADA DIGITAL EN PC13
}
Programación de GPIO
/* Programa GPIO No. 8: ENCENDIDO/APAGADO POR ENTRADA PC13 TRUESTUDIO KEIL
Programa No.8: * PA5: LED VERDE
* PC13: BOTÓN */
ENTRADA DIGITAL #include "stm32f4xx.h"
#include <stdio.h>
CONMUTA A LED #define LED_VERDE (1<<5)
CON ANTIREBOTES #define LED_ROJO (1<<7)
#define BOTON (1<<13)
#define DELAY 100
int i;
void inicializacion();
Extiende esta actividad int main(void) {
con tres botones y tres inicializacion();
while(1) {
LEDs if ((GPIOC->IDR & BOTON )==0x0000){ // LEE VALOR DE ENTRADA PC13
for(i=0;i<DELAY;i++){} // RETARDO POR REBOTES
if ((GPIOC->IDR & BOTON )==0x0000) {
GPIOA->ODR ^= LED_VERDE; // CONMUTACION LED
while ((GPIOC->IDR & BOTON )==0x0000); }}}}
void inicializacion(){
RCC->AHB1ENR |= 4; //Habilitación Puerto C
RCC->AHB1ENR |= 1; //Habilitación Puerto A
GPIOA->MODER |= 0x400; //SALIDA DIGITAL EN PA5
GPIOC->MODER &=~ (1<<13); //ENTRADA DIGITAL EN PC13
}
Programación de GPIO
Programa No.9: /* Progrma NO.9: GPIO con librerias */
/* main.c*/
#include "GPIO.h"
CONMUTACIÓN DE int lectura, comparacion;
LEDs usando Librerías
int main(void) {
GPIO_configuracion();

GPIO.h while(1) {
Main.h lectura = GPIOC->IDR;
comparacion= (GPIOC->IDR & BOTON ); // LECTURA DE BOTON
if (comparacion==0x0000) {
GPIOA->BSRR = 0x00000020; // SET PARA PA5
}
else {
GPIOA->BSRR = 0x00200000; // RESET PARA PA5
}
}
}
Programación de GPIO
Programa No.9: /* Progrma NO.9: GPIO con librerias */
* GPIO.h
*
CONMUTACIÓN DE * Created on: Mar 1, 2021
LEDs usando Librerías * Author: JDavid
*/
#ifndef SRC_GPIO_H_
#define SRC_GPIO_H_
GPIO.h
Main.h #include "stm32f4xx.h"
#include <stdio.h>
#define LED_VERDE (1<<5)
#define LED_ROJO (1<<7)
#define BOTON (1<<13)
void GPIO_configuracion(){
RCC->AHB1ENR |= 4; //Habilitación Puerto C
RCC->AHB1ENR |= 1; //Habilitación Puerto A
GPIOA->MODER |= 0x400; //SALIDA DIGITAL EN PA5
GPIOC->MODER &=~ (1<<13); //ENTRADA DIGITAL EN PC13
GPIOC->PUPDR |= (1<<26); //PUL-UP EN PC13
}
#endif /* SRC_GPIO_H_ */
¡Gracias por su atención!

También podría gustarte