Meta2.2 A Presentacion Gpio Stm32 2021-1 v2 - Alumnos
Meta2.2 A Presentacion Gpio Stm32 2021-1 v2 - Alumnos
Meta2.2 A Presentacion Gpio Stm32 2021-1 v2 - Alumnos
UNIDAD 2
GPIO - REGISTROS
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.
- 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){
}
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
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!