Nesse tutorial, vamos aprender a configurar entradas e saídas digitais do Franzininho C0, controlando LEDs com um botão (pushbutton) utilizando o STMcubeIDE e o CubeMX.
Hardware necessário:
- 1 Franzininho C0
Opcionais:
- 2 resistores 300 ohms
- 2 leds (cores a sua escolha)
- 1 push-button
Pinout franzininho C0:
Inicialmente, utilizaremos o botão conectado ao PA8 e os LEDS conectados em PB6 e PB7.
Configurações CubeMX
- Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”. Você pode obter mais detalhes aqui caso tenha dúvida como fazer: https://embarcados.com.br/como-instalar-o-stm32cubeide-guia-de-primeiros-passos/
- Vá para a página de configurações de relógio e em HCLK digite 48 MHz para a frequência de saída desejada do sistema. Pressione a tecla “Enter” e deixe o aplicativo resolver os divisores/multiplicadores PLL necessários para atingir a taxa de clock desejada.
- Volte para a página de configuração dos pinos, selecione “Trace and Debug” e habilite “Serial Wire”
- Após isso, em pinout view, selecione no microcontrolador os pinos “PB6” e “PB5” e escolha “GPIO_Output”, depois selecione “PA8” como “GPIO_Input”. Em System Core > GPIO selecione os pinos “PB6” e “PB5”, mude a LABEL para “LED1” e “LED2”. Para o pino “PA8” mude a LABEL para “BOTAO” e lembre-se de habilitar o GPIO como pull-up.
- Por fim, em “project” clique em “generate code”.
Exemplo 01
Nesse exemplo, nosso objetivo é alternar os estados do LED1 e LED2 a cada 1 segundo, enquanto o botão estiver pressionado. Para isso, usaremos as HAL_GPIO_ReadPin, HAL_GPIO_TogglePin e HAL_Delay(uint32_t delay).
Código
Em Core > Src > main.c modifiquei a função while(1) com o código abaixo:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(BOTAO_GPIO_Port, BOTAO_Pin)==0){ //leitura botao
HAL_GPIO_TogglePin(GPIOB, LED1_Pin|LED2_Pin); //alterna estado pinos
HAL_Delay(1000); //espera 1 segundo
}
}
/* USER CODE END 3 */
}
Gravação
- Utilizando um gravador ST-LINK realize as conexões como indicado na figura.
- Pressione no ícone semelhante a um martelo, aguarde o build do projeto e caso não tenha erros pressione “run”.

- Após o run, aparecerá a tela de configuração do debugguer, deixe configurado como mostrado na imagem abaixo e clique em ok.

- Se código gravado com sucesso você receberá uma mensagem no console e terá seus leds alternando o estado sempre que pressionar o botão.

Exemplo 02
No exemplo 2, nosso objetivo é manter o LED1 ligado se botão pressionado, senão manter o LED2 ligado. Para isso, usaremos as HAL_GPIO_ReadPin, HAL_GPIO_WritePin e HAL_Delay(uint32_t delay).
Código
Em Core > Src > main.c modifiquei a função while(1) com o código abaixo:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(BOTAO_GPIO_Port, BOTAO_Pin)==0){ //leitura
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET); //liga
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET); //desliga
}else{
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_SET); //liga
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET); //desliga
}
}
Gravação
Para gravação repita o mesmo processo explicado no exemplo 01. Caso o código esteja gravado corretamente, você terá o LED1 ligado quando o botão pressionado e LED2 desligado. E se o botão não estiver pressionado, LED2 ligado e LED1 desligado.
Explicação do código
No código gerado automaticamente no main(), encontramos três funções essenciais:
- As funções SystemClock_Config() e MX_GPIO_Init() são geradas automaticamente pelo CubeMX com o propósito de configurar o relógio do sistema e os pinos GPIO selecionados. A primeira cuida dos parâmetros do clock, como a frequência da CPU e dos barramentos, enquanto a segunda se encarrega de inicializar os pinos GPIO conforme suas definições de entrada ou saída. Essas funções são tipicamente encontradas após a função principal.
- A função HAL_Init() que tem como funcionalidade inicializar a interface Flash, a alocação NVIC e o clock inicial.
Dentro do while(1), é onde inserimos o código programado por nós, que define o comportamento do microcontrolador enquanto ele está em execução. Nele usamos as funções da biblioteca HAL relacionadas ao GPIO. Nesse tutorial foram utilizadas as seguintes funções para manipulação de entrada e saída.
- Leitura entrada: HAL_GPIO_ReadPin(GPIOx, GPIO_Pin);
- Configurar o estado do pino de saída: HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState);
- Alternar o estado de um pino GPIO: HAL_GPIO_TogglePin(GPIOx, GPIO_Pin);
- Contagem de tempo em milisegundos: HAL_Delay(uint32_t delay);
A biblioteca HAL foi criada pela ST e é composta por várias funções que ajudam na manipulação dos periféricos e pinos. Sua documentação detalhada pode ser encontrada em: https://www.st.com/resource/en/user_manual/um3029-description-of-stm32c0-hal-and-lowlayer-drivers-stmicroelectronics.pdf
Desafio extra
Que tal conectar o seu Franzininho C0 ao protoboard e adicionar componentes? Podemos montar o circuito conforme mostrado no esquema abaixo.
Resultado
Depois, carregue o código que aprendemos neste tutorial. Você verá o funcionamento apresentado abaixo.
Exemplo 01

Exemplo 02

Conclusão
Neste tutorial, apresentamos a configuração das entradas e saídas digitais com um exemplo prático: o controle de LEDs por meio de um botão. Além disso, você teve a oportunidade de se familiarizar com as bibliotecas HAL, fundamentais para o desenvolvimento de projetos com microcontroladores STM32. Com esses conhecimentos, você está pronto para explorar e criar uma variedade de aplicações com o Franzininho C0 e outros dispositivos STM32.
Saiba Mais
Franzininho C0 – Primeiros passos com Arduino
Compre a Franzininho C0 – Robocore
Compre a Franzininho C0 – Casa da Robótica






