#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stm32f1xx_hal.h>
/* ── Pinos ────────────────────────────────────────────── */
#define SW1_Pin GPIO_PIN_13
#define SW1_GPIO_Port GPIOC
#define SEG_A GPIO_PIN_0
#define SEG_B GPIO_PIN_1
#define SEG_C GPIO_PIN_2
#define SEG_D GPIO_PIN_3
#define SEG_E GPIO_PIN_4
#define SEG_F GPIO_PIN_5
#define SEG_G GPIO_PIN_6
#define DIG1 GPIO_PIN_12
#define DIG2 GPIO_PIN_13
#define DIG3 GPIO_PIN_14
#define DIG4 GPIO_PIN_15
#define ALL_DIGITS (DIG1|DIG2|DIG3|DIG4)
#define ALL_PA_PINS (GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3| \
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)
/* ── Globais ──────────────────────────────────────────── */
UART_HandleTypeDef huart1;
const uint16_t seg7[10] = {
SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F,
SEG_B|SEG_C,
SEG_A|SEG_B|SEG_D|SEG_E|SEG_G,
SEG_A|SEG_B|SEG_C|SEG_D|SEG_G,
SEG_B|SEG_C|SEG_F|SEG_G,
SEG_A|SEG_C|SEG_D|SEG_F|SEG_G,
SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G,
SEG_A|SEG_B|SEG_C,
SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G,
SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G,
};
uint8_t contador = 0;
uint8_t pressionado = 0;
/* ── Protótipos ───────────────────────────────────────── */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_Init(void);
void Error_Handler(void);
void apaga_tudo(void);
void exibe_display(void);
void exibe_leds(void);
void debug_estado(const char *momento);
/* ── SysTick ──────────────────────────────────────────── */
void SysTick_Handler(void) { HAL_IncTick(); }
/* ── Redirect printf → USART1 ────────────────────────── */
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* ── Funções de saída ─────────────────────────────────── */
void apaga_tudo(void)
{
HAL_GPIO_WritePin(GPIOB, ALL_DIGITS, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ALL_PA_PINS, GPIO_PIN_RESET);
}
void exibe_display(void)
{
apaga_tudo();
HAL_GPIO_WritePin(GPIOA, seg7[contador % 10], GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, DIG1, GPIO_PIN_SET);
debug_estado("DISPLAY");
}
void exibe_leds(void)
{
apaga_tudo();
for (int i = 0; i < 8; i++)
if (contador & (1 << i))
HAL_GPIO_WritePin(GPIOA, (uint16_t)(1 << i), GPIO_PIN_SET);
debug_estado("LEDS");
}
void debug_estado(const char *momento)
{
uint8_t pa[8];
for (int i = 0; i < 8; i++)
pa[i] = HAL_GPIO_ReadPin(GPIOA, (uint16_t)(1 << i));
uint8_t d1 = HAL_GPIO_ReadPin(GPIOB, DIG1);
uint8_t d2 = HAL_GPIO_ReadPin(GPIOB, DIG2);
uint8_t d3 = HAL_GPIO_ReadPin(GPIOB, DIG3);
uint8_t d4 = HAL_GPIO_ReadPin(GPIOB, DIG4);
uint8_t led_val = 0;
for (int i = 0; i < 8; i++)
led_val |= (pa[i] << i);
printf("\r\n[%s] contador=%d\r\n", momento, contador);
printf("PA: 0=%d 1=%d 2=%d 3=%d 4=%d 5=%d 6=%d 7=%d\r\n",
pa[0],pa[1],pa[2],pa[3],pa[4],pa[5],pa[6],pa[7]);
printf("SEG: A=%d B=%d C=%d D=%d E=%d F=%d G=%d\r\n",
pa[0],pa[1],pa[2],pa[3],pa[4],pa[5],pa[6]);
printf("DIG: D1=%d D2=%d D3=%d D4=%d\r\n", d1,d2,d3,d4);
printf("LED val lido=%d esperado=%d\r\n", led_val, contador);
printf("Digito esperado=%d\r\n", contador % 10);
}
/* ── main ─────────────────────────────────────────────── */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_Init();
/****** inserir seu código aqui *******/
apaga_tudo();
printf("\r\n=== INICIADO. Aguardando SW1... ===\r\n");
while (1)
{
uint8_t btn = HAL_GPIO_ReadPin(SW1_GPIO_Port, SW1_Pin);
if (btn == 0 && pressionado == 0)
{
pressionado = 1;
contador++;
if (contador > 255) contador = 0;
printf("\r\n>>> CLIQUE! contador=%d <<<\r\n", contador);
exibe_display();
HAL_Delay(1000);
exibe_leds();
}
else if (btn == 1)
{
pressionado = 0;
}
HAL_Delay(20);
}
return 0;
}
/* ── USART1 Init ──────────────────────────────────────── */
static void MX_USART1_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) Error_Handler();
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) Error_Handler();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) Error_Handler();
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, ALL_PA_PINS, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, ALL_DIGITS, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = SW1_Pin | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// PA0-PA6 = LEDs/segmentos, PA7 = LED extra
// PA9 = USART1 TX (configurado pelo HAL_UART_Init)
GPIO_InitStruct.Pin = ALL_PA_PINS;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ALL_DIGITS;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}Loading
stm32-bluepill
stm32-bluepill