Laboratório 05
A documentação desta atividade de laboratório é complementar a documentação principal da disciplina.
Utilize como base a descrição apresentada no Moodle da disciplina.
Instruções do LAB
Esta atividade de laboratório tem como objetivo configurar o TIM2, ADC e PWM do STM32. Cada item equivale a 10% da nota.
- Crie um repositório (LAB05) via template (https://github.com/ELT73A-LAB-TPL/LAB05) na organização e clone;
- Carregue o arquivo de configuração TIM2EXTI0ADC1PWM.txt
- Gere o código, commit e push dos arquivos gerados;
- Adicione o código para piscar o LED via interrupção do User KEY;
- Configure TIMER2 para 1s;
- Adicione o código de configuração do ADC;
- Adicione o código de leitura do ADC;
- Adicione o código de atualização do PWM;
- Commit e push dos arquivos modificados;
- Envie o link do repositório no GitHub (hyperlink);
Avaliação
- Configuração dos periféricos 10%
- Código para piscar o LED via interrupção do User KEY - 10%
- Configuração do TIMER2 para 1s - 10%
- Código de configuração e leitura do ADC - 10%
- Código de atualização do PWM - 10%
- Link do repositório no GitHub (hyperlink) - 20%
Verifique o seu ambiente de desenvolvimento
- Git SCM
- GitHub CLI
- VS Code
- Wokwi
- PlatformIO
Git is the most widely used source-code management tool among professional developers.
- Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
winget install --id Git.Git -e --source winget
Configurações do git:
git config --list --show-origin
GitHub CLI brings GitHub to your terminal.
- GitHub CLI is a command line tool that allows you to interact with GitHub from the command line. It is available for Windows, macOS, and Linux.
winget install --id GitHub.cli -e --source winget
Status de login do GitHub CLI:
gh auth status
Visual Studio Code: IDE and Code Editor for Software Development.
- VS Code is a free source-code editor made by Microsoft for Windows, Linux and macOS. It includes support for debugging, embedded Git control, syntax highlighting, intelligent code completion, snippets, and code refactoring.
winget install --id Microsoft.VisualStudioCode -e --source winget
Extensões instaladas do Visual Studio Code para o perfil STM32:
code --list-extensions --profile "ESP32IO"
Wokwi for VSCode: Embedded systems and IoT simulator supporting ESP32, Arduino, and the Raspberry Pi Pico.
- Wokwi for VSCode Your code never leaves your computer - Wokwi runs the simulation inside VS Code, using the firmware binaries from your project.
code --install-extension wokwi.wokwi-vscode --profile "ESP32IO"
PlatformIO IDE for VSCode: Your Gateway to Embedded Software Development Excellence.
- PlatformIO IDE for VSCode Unlock the true potential of embedded software development with PlatformIO’s collaborative ecosystem, embracing declarative principles, test-driven methodologies, and modern toolchains for unrivaled success.
code --install-extension platformio.platformio-ide --profile "ESP32IO"
You need to edit the system environment variable called Path and append %USERPROFILE%\.platformio\penv\Scripts\ path in the beginning of the list.
Configure o nome de usuário para todos os repositórios locais ligados às suas transações de commit:
git config --global user.name "Your Name"
Configure o email de usuário para todos os repositórios locais ligados às suas transações de commit:
git config --global user.email "you@example.com"
É recomendado verificar se a instalação do seu Git não está realizando nenhuma transformação entre LFs e CRLFs.
git config --global core.autocrlf false
Configure o git para usar o Visual Studio Code como editor padrão para tarefas como escrever mensagens de commit ou rebases interativos
git config --global core.editor "code --wait"
Habilite a coloração automática da saída da linha de comando do Git:
git config --global color.ui auto
Configura o Git para usar main como o nome do branch padrão sempre que você inicializar um novo repositório localmente:
git config --global init.defaultBranch main
Liste as configurações aplicadas:
git config --list --show-origin
Crie um novo repositório com base no template do LAB05
Escolha o Grupo e entre com o comando abaixo para criar o repositório no GitHub:
- A
- B
- C
- D
- E
- F
- G
- H
- I
- J
- K
- L
- X
- Grupo S22-A: https://github.com/ELT73A-S22-2026-2-A
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-A/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-A/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-B: https://github.com/ELT73A-S22-2026-2-B
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-B/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-B/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-C: https://github.com/ELT73A-S22-2026-2-C
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-C/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-C/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-D: https://github.com/ELT73A-S22-2026-2-D
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-D/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-D/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-E: https://github.com/ELT73A-S22-2026-2-E
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-E/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-E/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-F: https://github.com/ELT73A-S22-2026-2-F
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-F/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-F/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-G: https://github.com/ELT73A-S22-2026-2-G
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-G/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-G/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-H: https://github.com/ELT73A-S22-2026-2-H
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-H/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-H/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-I: https://github.com/ELT73A-S22-2026-2-I
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-I/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-I/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-J: https://github.com/ELT73A-S22-2026-2-J
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-J/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-J/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-K: https://github.com/ELT73A-S22-2026-2-K
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-K/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-K/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-L: https://github.com/ELT73A-S22-2026-2-L
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-L/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-L/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
- Grupo S22-X: https://github.com/ELT73A-S22-2026-2-X
- LAB Template: https://github.com/ELT73A-LAB-TPL/LAB05
Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB05:
gh repo create ELT73A-S22-2026-2-X/LAB05 --private -p ELT73A-LAB-TPL/LAB05 -c
Visualize o repositório:
gh repo view ELT73A-S22-2026-2-X/LAB05 --web
Abra o repositório clonado no VS Code:
code LAB05 --profile "STM32"
Como fazer commit da atualizações
Verifique o status do repositório:
git status
Adicione os arquivos modificados:
git add .
Realize o commit das alterações:
git commit -m "Descrição breve das alterações realizadas!"
Envie para o repositório remoto (GitHub):
git push
Vizualize o log de alterações:
git log
Vizualize no GitHub:
gh repo view --web
Diagrama de pinos do STM32F4x1

O debugger ST-LINK/V2 possue um conector IDC de 10 pinos. A pinagem é descrita na figura a seguir.

Crie uma branch nova
Seguindo as boas práticas de desenvolvimento, crie uma branch nova para desenvolver a atividade do laboratório. Utilize um nome significativo para a branch, veja como criar uma nova branch utilizando como nome new-feature:
Como criar uma nova branch
Verifique o status do repositório:
git status
Crie uma nova branch:
git branch new-feature
Altere para a nova branch:
git checkout new-feature
Mostra as branches:
git branch
Envie a nova branch para o repositório remoto:
git push --set-upstream origin new-feature
Compara as branches:
git diff main new-feature
Retorna para a branch principal:
git checkout main
Mescla a branch nova na branch principal:
git merge new-feature
Vizualize no GitHub:
gh repo view --web
Implemente o código para piscar o LED via interrupção do User KEY e leitura do ADC com atualização do PWM
Uso do flag BLUELED
Implemente a lógica para acionar o LED azul via flag BLUELED:
/* USER CODE BEGIN Includes */
#include <stdbool.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
bool BLUELED = 0;
/* USER CODE END PV */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// Verify BLUELED Flag
if (BLUELED)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED ON
else
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED OFF
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN Includes */
#include <stdbool.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
extern bool BLUELED;
/* USER CODE END PV */
void EXTI0_IRQHandler(void)
{
/* USER CODE BEGIN EXTI0_IRQn 0 */
// Toggle BLUELED FLAG
BLUELED = !BLUELED;
/* USER CODE END EXTI0_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(User_KEY_EXTI0_Pin);
/* USER CODE BEGIN EXTI0_IRQn 1 */
/* USER CODE END EXTI0_IRQn 1 */
}
Timer 2 com interrupção e saída PWM no canal 1
Inicialize o Timer 2 com suporte a rotina de interrupção e saída PWM no canal 1:
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);
/* USER CODE END 2 */
ADC1 na interrupção do Timer 2
Inicie o ADC1 na interrupção do Timer 2:
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_ADC_Start_IT(&hadc1);
/* USER CODE END TIM2_IRQn 1 */
}
Leitura do AN1 e atualização do valor de comparação do PWM
Na interrupção do ADC1, faça a leitura do AN1 e atualize o valor de comparação do PWM:
/* USER CODE BEGIN PV */
bool BLUELED = 0; // Flag to control LED state
uint16_t adc1in1 = 0; // Variable to store ADC value
float voltage = 0.0f; // Variable to store calculated voltage
/* USER CODE END PV */
/* USER CODE BEGIN PV */
extern bool BLUELED; // Flag to control the blue LED
extern uint16_t adc1in1; // Variable to store ADC value
extern float voltage; // Variable to store calculated voltage
/* USER CODE END PV */
void ADC_IRQHandler(void)
{
/* USER CODE BEGIN ADC_IRQn 0 */
/* USER CODE END ADC_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
/* USER CODE BEGIN ADC_IRQn 1 */
adc1in1 = HAL_ADC_GetValue(&hadc1); // Read ADC value
TIM2->CCR1 = adc1in1; // Update PWM duty cycle
voltage = (adc1in1*3.3)/4095; // Convert ADC value to voltage
/* USER CODE END ADC_IRQn 1 */
}
VS Code Terminal Configuration
Configure Git Bash como terminal integrado do Visual Studio Code para evitar problemas de formatação de texto e comandos:
"terminal.integrated.defaultProfile.windows": "Git Bash",
Crie um gh alias para deploy-debug
gh alias set deploy-debug 'tag="$1"; cp ./build/Debug/*.elf ./firmware-debug.elf && gh release create "$tag" ./firmware-debug.elf --generate-notes && rm ./firmware-debug.elf' --shell
Como funciona:
- Considera a etiqueta de lançamento como $1.
- Copia o ELF de ./build/Debug/*.elf → ./firmware-debug.elf.
- Executa gh release create com o arquivo renomeado.
- Limpa removendo o arquivo renomeado temporário.
Uso:
gh deploy-debug v1.0.0
Rápida verificação do upload
Assim que o comando terminar, você poderá verificar o upload diretamente em seu terminal usando:
gh release view v1.0.0 --web