USO del Push Button PC13 a nivel de registros
De la misma manera en la que configuramos el LED (PA5) configuramos el Pulsador conectado a la terminal PC13. En seguida resumimos la acciones requeridas para la configuración a nivel de registros usando Keil.
1. Generar un proyecto como lo hemos realizado anteriormente.
2. Configurar los registros asociados al GPIO tales como:
a) Registro de Reloj. Habilitar el reloj para el Puerto A y para el LED y el Puerto C donde se encuentra el Push Button.
b)Configurar la velocidad del puerto.
c) Configurar el registro asociado al Pull up para el caso del Push Button.
2. Observe que desarrollamos 2 funciones una de salida y otra de entrada asociada al push button.
void GPIO_config_in(void)
void GPIO_config_out(void)
3. Observe que generamos una variable unsigned long BTN1 (32 bits) que nos va a servir para leer el puerto C.
4. Observe como leemos la terminal PC13 usando la operación lógica AND:
BTN1 = (GPIOC->IDR) & 0x2000; // Read PC13
if(BTN1==0)
5. Pruebe el código.
Código
#include "stm32f4xx.h" // Device header
unsigned long BTN1;
void GPIO_config_in(void);
void GPIO_config_out(void);
int main()
{
GPIO_config_in();
GPIO_config_out();
while(1)
{
BTN1 = (GPIOC->IDR) & 0x2000; // Read PC13
if(BTN1==0){
// Set PA5
GPIOA->BSRR |= (0x1<<5); //GPIO_BSRR_BS5;
}
else{
// Reset PA5
GPIOA->BSRR |= (0x1<<21); //GPIO_BSRR_BR5;
}
}
}
void GPIO_config_in(void) // Configure PC13 as input
{
// Enable port C clock
RCC->AHB1ENR |= (0x01)<<2;
// High speed
GPIOC->OSPEEDR &= ~(0x1<<26); //GPIO_OSPEEDER_OSPEEDR13_0;
GPIOC->OSPEEDR |= (0x1<<27); //GPIO_OSPEEDER_OSPEEDR13_1;
// Enable pull-up resistor
GPIOC->PUPDR |= (0x1<<26); //(GPIO_PUPDR_PUPDR13_0);
GPIOC->PUPDR &= ~(0x1<<27); //(GPIO_PUPDR_PUPDR13_1);
}
void GPIO_config_out(void) // Configure PA5 as output
{
// Enable port A clock
RCC->AHB1ENR |= (0x1);
// Configure PA5 as output
GPIOA->MODER |= (0x1<<10); //GPIO_MODER_MODER5_0;
GPIOA->MODER &= ~(0x1<<11); //GPIO_MODER_MODER5_1;
// Push-pull mode
GPIOA->OTYPER &= ~(0x1<<5); //GPIO_OTYPER_OT_5;
// High speed
GPIOA->OSPEEDR &= ~(0x1<<10); //GPIO_OSPEEDER_OSPEEDR5_0;
GPIOA->OSPEEDR |= (0x1<<11); //GPIO_OSPEEDER_OSPEEDR5_1;
// Ensure pull-up and pull-down resistors are disabled
GPIOA->PUPDR &= ~(0x1<<10); //(GPIO_PUPDR_PUPDR5_0);
GPIOA->PUPDR &= ~(0x1<<11); //(GPIO_PUPDR_PUPDR5_1);
}
unsigned long BTN1;
void GPIO_config_in(void);
void GPIO_config_out(void);
int main()
{
GPIO_config_in();
GPIO_config_out();
while(1)
{
BTN1 = (GPIOC->IDR) & 0x2000; // Read PC13
if(BTN1==0){
// Set PA5
GPIOA->BSRR |= (0x1<<5); //GPIO_BSRR_BS5;
}
else{
// Reset PA5
GPIOA->BSRR |= (0x1<<21); //GPIO_BSRR_BR5;
}
}
}
void GPIO_config_in(void) // Configure PC13 as input
{
// Enable port C clock
RCC->AHB1ENR |= (0x01)<<2;
// High speed
GPIOC->OSPEEDR &= ~(0x1<<26); //GPIO_OSPEEDER_OSPEEDR13_0;
GPIOC->OSPEEDR |= (0x1<<27); //GPIO_OSPEEDER_OSPEEDR13_1;
// Enable pull-up resistor
GPIOC->PUPDR |= (0x1<<26); //(GPIO_PUPDR_PUPDR13_0);
GPIOC->PUPDR &= ~(0x1<<27); //(GPIO_PUPDR_PUPDR13_1);
}
void GPIO_config_out(void) // Configure PA5 as output
{
// Enable port A clock
RCC->AHB1ENR |= (0x1);
// Configure PA5 as output
GPIOA->MODER |= (0x1<<10); //GPIO_MODER_MODER5_0;
GPIOA->MODER &= ~(0x1<<11); //GPIO_MODER_MODER5_1;
// Push-pull mode
GPIOA->OTYPER &= ~(0x1<<5); //GPIO_OTYPER_OT_5;
// High speed
GPIOA->OSPEEDR &= ~(0x1<<10); //GPIO_OSPEEDER_OSPEEDR5_0;
GPIOA->OSPEEDR |= (0x1<<11); //GPIO_OSPEEDER_OSPEEDR5_1;
// Ensure pull-up and pull-down resistors are disabled
GPIOA->PUPDR &= ~(0x1<<10); //(GPIO_PUPDR_PUPDR5_0);
GPIOA->PUPDR &= ~(0x1<<11); //(GPIO_PUPDR_PUPDR5_1);
}