#include <stdint.h>
#define RCC_BASE 0x40021000
#define GPIOA_BASE 0x50000000
#define RCC_IOPENR (*(volatile uint32_t*)(RCC_BASE + 0x34))
#define GPIOA_MODER (*(volatile uint32_t*)(GPIOA_BASE + 0x00))
#define GPIOA_IDR (*(volatile uint32_t*)(GPIOA_BASE + 0x10))
#define GPIOA_ODR (*(volatile uint32_t*)(GPIOA_BASE + 0x14))
#define SYST_CSR_ENABLE (1U<<0)
#define SYST_CSR_CLKSOURCE (1U<<2)
#define SYST_CSR_COUNTFLAG (1U<<16)
#define SYST_CLK 48000000UL
#define BASE_VALUE ((SYST_CLK/1000)-1)
#define SYSTICK_BASE 0xE000E010UL
#define SYST_CSR (*(volatile uint32_t*)(SYSTICK_BASE + 0x00UL))
#define SYST_RVR (*(volatile uint32_t*)(SYSTICK_BASE + 0x04UL))
#define SYST_CVR (*(volatile uint32_t*)(SYSTICK_BASE + 0x08UL))
void delayMs(uint32_t delay){
if(delay == 0) return;
uint32_t reload = BASE_VALUE;
if(reload > 0xFFFFFFUL) reload = 0xFFFFFFUL;
SYST_CSR = 0U;
SYST_RVR = reload;
SYST_CVR = 0U;
SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_ENABLE;
while(delay--){
while((SYST_CSR & SYST_CSR_COUNTFLAG) == 0U);
}
SYST_CSR = 0U;
SYST_CVR = 0U;
}
int main(void) {
const uint8_t pino_botao = 3;
const uint8_t pinos_leds[3] = {0,1,2};
int alarme = 0;
RCC_IOPENR |= (1 << 0);
GPIOA_MODER &= ~(3 << pino_botao*2);
for(int i = 0; i < 3; i++){
GPIOA_MODER &= ~(3 << pinos_leds[i]*2);
GPIOA_MODER |= (1 << pinos_leds[i]*2);
}
int alerme = 0;
while (1) {
delayMs(50);
if(!(GPIOA_IDR & (1 << pino_botao))){
delayMs(50);
alarme++;
if(alarme > 3){
alarme = 0;
for(int i = 0; i < 2; i++){
GPIOA_ODR &= ~(3 << pinos_leds[i]);
}
}
if(alarme == 1){
GPIOA_ODR |= (1 << pinos_leds[0]);
}else if(alarme == 2){
GPIOA_ODR |= (1 << pinos_leds[1]);
}else if(alarme == 3){
GPIOA_ODR |= (1 << pinos_leds[2]);
}
while(!(GPIOA_IDR & (1 << pino_botao)));
delayMs(50);
}
}
}