// Código Exemplo para Comunicação Serial com STM32F1 (ex: Blue Pill) usando Arduino IDE
// Autor: Aguivone M.Fogia
// Data: 03/06/2025
// Descrição: Demonstrar envio e recebimento de dados via porta serial (USART1), lendo um botao e acionando led.
// modo polling
/*
material necessario
1. Placa STM32F103C8T6 ou C6T6 (Blue Pill ou similar).
2. Programador ST-Link V2 ou conversor USB-Serial (para upload e/ou comunicação).
3. Core STM32 para Arduino IDE instalado (veja instruções no exemplo blink anterior).
4. Configuração da Placa no Arduino IDE:
- Ferramentas > Placa: "Generic STM32F103C series" ou similar.
- Ferramentas > Variant: "STM32F103C6T6"
- Ferramentas > Upload method: "STLink" ou "Serial".
- Ferramentas > Porta: Selecione a porta COM correspondente ao seu conversor USB-Serial ou ST-Link (se aplicável para comunicação).
--- Conexão Física (para USART1) ---
- Conecte o pino PA9 (TX1) do STM32 ao pino RX do seu conversor USB-Serial.
- Conecte o pino PA10 (RX1) do STM32 ao pino TX do seu conversor USB-Serial.
- Conecte o GND do STM32 ao GND do conversor USB-Serial.
- Alimente a placa STM32 (via ST-Link, USB ou fonte externa).
--- Nota sobre Portas Seriais ---
- O objeto `Serial` no core STM32 para Arduino geralmente se refere à USART1 (pinos PA9/PA10).
- Algumas configurações de placa/core podem mapear `Serial` para a porta USB CDC (Comunicação via cabo USB direto, se a placa tiver bootloader compatível ou hardware USB nativo configurado).
- Se você precisar usar outras portas seriais (USART2, USART3), use os objetos `Serial1`, `Serial2`, `Serial3`, etc., e conecte aos pinos correspondentes (verifique o pinout da sua placa e a documentação do core).
- Serial1: PA9 (TX), PA10 (RX)
- Serial2: PA2 (TX), PA3 (RX)
- Serial3: PB10 (TX), PB11 (RX)
*/
// --- Configurações ---
#define LED PC13
#define BOTAO PA7
long baudRate = 9600; // Taxa de comunicação serial (bits por segundo)
// --- Variáveis Globais ---
String pacote = ""; // String para armazenar dados recebidos
unsigned long tempo_atual;
unsigned long tempo_anterior;
unsigned long tempo_led = 100;
int comando_botao=0;
// --- Função Setup: Executada uma vez ---
void setup()
{
// Inicializa a comunicação serial (USART1 por padrão)
Serial.begin(baudRate);
pinMode(LED, OUTPUT); //LED
pinMode(BOTAO, INPUT);
// Espera um pouco para a porta serial estabilizar (opcional, mas útil)
delay(100);
Serial.println("Comunicação serial com STM32F103C6T6 \n\r");
Serial.print("Usando botão pra mudar velocidade do led ou a serial\n\r");
}
// --- Função Loop: Executada repetidamente ---
void loop()
{
// --- Leitura de Dados da Serial ---
if (Serial.available() > 0) { // Verifica se há dados chegando
char caracter = Serial.read(); // Lê um caractere
if(caracter == 'A')//vel1
{
Serial.println("velocidade 1 = 100 \n\r");
tempo_led = 100;
comando_botao = 0;
delay(100);//debounce para botao
}
if(caracter == 'B')//vel2
{
Serial.println("velocidade 2 = 500 \n\r");
tempo_led = 500;
comando_botao = 1;
delay(100);//debounce para botao
}
if(caracter == 'C')//vel3
{
Serial.println("velocidade 3 = 1000 \n\r");
tempo_led = 1000;
comando_botao = 2;
delay(100);//debounce para botao
}
}
else
{
if(digitalRead(BOTAO)== 1)
{
comando_botao++;
if(comando_botao > 2)
{
comando_botao = 0;
}
if(comando_botao == 0)//vel1
{
Serial.println("velocidade 1 = 100 \n\r");
tempo_led = 100;
}
if(comando_botao == 1)//vel2
{
Serial.println("velocidade 2 = 500 \n\r");
tempo_led = 500;
}
if(comando_botao == 2)//vel3
{
Serial.println("velocidade 3 = 1000 \n\r");
tempo_led = 1000;
}
delay(500);//debounce para botao
}
tempo_atual = millis();
if(tempo_atual - tempo_anterior >= tempo_led)
{
digitalWrite(LED, !digitalRead(LED));
tempo_anterior = tempo_atual;
}
}
}
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!