#include <stdint.h>
#include "stm32c0xx.h"
#define enableGPIOA (1U<<0) //Macro para clk no GPIOA
#define pinoLed (1U<<9) //Posição do LED (PA9 - D8)
#define btn (1U<<10) //Posição do botão (PA10 - D2)
/* Trecho do systick.c */
#define SYST_CSR_ENABLE (1U << 0)
#define SYST_CSR_CLKSOURCE (1U << 2)
#define SYST_CSR_COUNTFLAG (1U << 16)
#define SYST_CLK 48000000
#define BASE_VALUE (SYST_CLK/1000)-1
void delayMs(uint32_t delay) {
if(delay == 0) return;
uint32_t reload = BASE_VALUE;
if (reload > 0xFFFFFFUL) reload = 0xFFFFFFUL;
SysTick->CTRL = 0U;
SysTick->LOAD = reload;
SysTick->VAL = 0U;
SysTick->CTRL = SYST_CSR_CLKSOURCE | SYST_CSR_ENABLE;
while (delay--) {
while ((SysTick->CTRL & SYST_CSR_COUNTFLAG) == 0U);
}
SysTick->CTRL = 0U;
SysTick->VAL = 0U;
}
void setup()
{
uint32_t i;
uint32_t contador = 0;
RCC->IOPENR |= enableGPIOA; //Habilitando clock
GPIOA->MODER |= (1U<<18); //Configurando PA9 como saída
GPIOA->MODER &= ~(1U<<19); //Configurando PA9 como saída
GPIOA->ODR &= ~pinoLed; //Inicia com o LED apagado
GPIOA->MODER &= ~(1U<<20); //Configurando PA10 como entrada
GPIOA->MODER &= ~(1U<<21); //Configurando PA10 como entrada
GPIOA->PUPDR |= (1U<<20); //Configurando PA10 com PULL-UP
GPIOA->PUPDR &= ~(1U<<21); //Configurando PA10 com PULL-UP
while(1)
{
if(!(GPIOA->IDR & btn)) //o botão é configurado PULL-UP
{
delayMs(50); //Debounce
while(!(GPIOA->IDR & btn)); //Aguarda soltar o botão
delayMs(50); //Debounce
contador++; //Quantidade de piscadas
for(i=0;i<contador;i++)
{
GPIOA->ODR |= pinoLed; //Acende o LED
delayMs(300);
GPIOA->ODR &= ~pinoLed; //Apaga o LED
delayMs(300);
}
}
}
}
void loop()
{
}