Periféricos de Microcontrolador
Configure GPIO, timers, SPI/I2C e PWM em placas Cortex-M típicas.
Receita
let mut led = gpioa.pa5.into_push_pull_output();
led.set_high().ok();
led.set_low().ok();Quando usar isso: Qualquer firmware que se comunica com LEDs, sensores, displays ou motores através de periféricos do MCU.
Exemplo de Trabalho
use cortex_m::asm::delay;
use stm32f4xx_hal as hal;
use hal::{pac, prelude::*};
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let rcc = dp.RCC.constrain();
let clocks = rcc.cfgr.freeze();
let gpioa = dp.GPIOA.split();
let mut led = gpioa.pa5.into_push_pull_output();
let i2c = hal::i2c::I2c::new(
dp.I2C1,
gpioa.pa9.into_alternate_open_drain(),
gpioa.pa10.into_alternate_open_drain(),
400.kHz(),
&clocks,
);
loop {
led.set_high().unwrap();
delay(clocks.sysclk().raw() / 8);
led.set_low().unwrap();
delay(clocks.sysclk().raw() / 8);
let _ = i2c.write(0x48, &[0x00]);
}
}O que isso demonstra:
- Saída push-pull GPIO para LEDs
- Delay de busy-wait (substitua por timers em produção)
- Mestre I2C a 400 kHz para comunicação com sensores
- HAL divide periféricos em pinos de propriedade exclusiva
Mergulho Profundo
Visão Geral dos Periféricos
| Periférico | Uso Típico |
|---|---|
| GPIO | I/O Digital, seletores de chip |
| Timer | Delays, PWM, captura de entrada |
| SPI | Flash, displays, módulos RF |
| I2C | Sensores, EEPROM |
| USART | GPS, modems, serial de depuração |
| ADC | Sensores analógicos |
Esboço de Exemplo PWM
let mut pwm = timer.pwm_hz(pin, 1.kHz(), &clocks);
let mut channel = pwm.ch1;
channel.set_duty(percent);
channel.enable();SPI Full-Duplex
let mut spi = Spi::new(dp.SPI1, (sck, miso, mosi), MODE_0, 8.MHz(), &clocks);
let mut buffer = [0u8; 4];
spi.transfer(&mut buffer, &[0x9f, 0, 0, 0]).ok();Armadilhas
- Entradas flutuantes - Leituras indefinidas em pinos não conectados. Correção: Habilitar pull-up ou pull-down.
- Pinos tolerantes a 5V - MCUs de 3.3V morrem com sinais de 5V. Correção: Conversores de nível em entradas.
- Incompatibilidade de modo SPI - MODE_0 vs MODE_3 quebra a comunicação. Correção: Ler a polaridade/fase do clock na folha de dados do sensor.
- Falta de pull-ups I2C - Barramento travado ou intermitente. Correção: Pull-ups externos em SDA/SCL.
- Delays de busy-wait - CPU gira a 100% durante o delay. Correção: Usar interrupções de timer ou timers Embassy.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
GPIO bitbang | Falta de periférico de hardware | Necessário SPI de alta velocidade |
| DMA + SPI | Transferências grandes | Leituras de registradores minúsculas |
| PWM de software RTIC | Sem pinos PWM de hardware | Frequência precisa necessária |
FAQs
Open drain vs push pull?
Open drain para I2C e barramentos compartilhados. Push-pull para LEDs e GPIOs rápidos.
Pinos de função alternada?
Periféricos exigem pinos configurados no modo AF através dos métodos into_alternate_* do HAL.
Configuração de clock?
Configurações incorretas de PLL fazem as taxas de baud mentir. Verifique com um analisador lógico.
Múltiplos endereços I2C?
Varra o barramento com sondas write ou use o padrão do sensor da folha de dados.
USART printf?
defmt-rtt ou ponte serialport são preferidos em relação a println! no firmware.
Taxa de amostragem ADC?
Defina o tempo de amostragem com base na impedância da fonte. Faça a média das leituras para ruído.
Watchdog?
Alimente o watchdog no loop principal ou em uma tarefa dedicada. Reinicie em caso de travamento.
Modos de baixo consumo?
Desligue periféricos e clocks entre as amostragens. Acorde por interrupção ou RTC.
Conflitos de mux de pinos?
Um pino, uma função. Uma planilha de planejamento evita roteamento impossível.
HAL vs PAC?
O código da aplicação usa HAL. PAC apenas para cobertura de HAL ausente ou ajustes de registradores ISR.
Relacionados
- embedded-hal - camada de trait portátil
- Interrupções e Concorrência - ISRs de timer
- Noções Básicas de Embarcados - configuração da placa
- Depurando Firmware - analisador lógico + probe-rs
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.