-
Notifications
You must be signed in to change notification settings - Fork 0
Journal
Aujourd'hui, on fait marcher les leds de la discovery ! On se base sur une "crate" (bibliothèque Rust) auxiliaire fournie par le tuto, qui apporte une interface haut-niveau pour allumer les leds et mettre le programme en pause. On peut très facilement faire clignoter une led avec le programme suivant.
use aux5::{entry, prelude::*, Delay, Leds};
#[entry]
fn main() -> ! {
let (mut delay, mut leds): (Delay, Leds) = aux5::init();
loop {
leds[0].on();
delay.delay_ms(500);
leds[0].off();
delay.delay_ms(500);
}
}
Et maintenant que l'on sait faire ça, on peut coder une "led-roulette" comme dans le gif animé ci-dessous.
Le programme est super simple. On peut représenter l'état des leds par le schéma suivant.
On a un compteur incrémental circulaire modulo 8 (0, ... 7, 0, ...).
Quand le compteur vaut (i), on allume la led numéro (i) et on éteint la led numéro (i-2), le tout modulo 8.
Mais comme on manipule des indices, de type usize
, on peut pas faire (i-2) car ca risque de faire un nombre négatif.
Comme tout est modulo 8, c'est simple il suffit de faire (i+6) % 8 et le tour est joué.
On a donc le code suivant.
let (mut delay, mut leds): (Delay, Leds) = aux5::init();
let period = 100_u16;
let mut i = 0;
loop {
leds[i].on();
leds[(i + 6) % 8].off();
delay.delay_ms(period);
i = (i + 1) % 8;
}
C'est parti pour la première partie du guide : compiler et flasher un programme en mode debug. Biensur, il faut tous les outils nécessaires au préalable, pour ça, il faut suivre le tuto. Mais ensuite, voici un petit récapitulatif des trucs utiles.
# Start openocd in the /tmp/ directory (in another terminal)
cd /tmp
openocd -f interface/stlink-v2-1.cfg -f target/stm32f3x.cfg
# Build in cross compilation (from project root)
cargo build --target thumbv7em-none-eabihf
# Start GDB with our program
arm-none-eabi-gdb -q target/thumbv7em-none-eabihf/debug/led-roulette
# Connect to the openocd gdb server running by default on port 3333
(gdb) target remote :3333
# Flash the device
(gdb) load
# Change to src or asm text layout
(gdb) layout src
(gdb) layout asm
# Navigating
(gdb) break main # Add a break point
(gdb) continue # Run until break point
(gdb) next # Next line without entering function
(gdb) step # Next line, can enter in functions
(gdb) stepi # Next assembly instruction
(gdb) finish # Run until return current function
# Print some info
(gdb) print x # Print value
(gdb) print &x # Print reference
(gdb) info locals # Print all local variables
(gdb) info args # Print all function arguments
(gdb) backtrace # Print backtrace
# Reset microcontroller and stop at entry point
(gdb) monitor reset halt
# Quit GDB
(gdb) quit
Je suis tombé sur cette vidéo : OxidizeConf: Oliver Scherer - War stories from teaching Rust and Embedded simultaneously qui est un retour d'expérience sur l'enseignement de Rust et de l'embarqué, super bien présenté. Son user sur github : oli-obk.
Pour pouvoir me lancer dans l'embarqué en Rust, j'ai commandé le matos nécessaire pour suivre le tuto Embedded Rust Discovery Book. A savoir,
- Le kit STM32F3DISCOVERY : 17€ sur RS
- Un FTDI (LC234X, USB -> UART) : 7€ sur RS
- Un module bluetooth smart cypress (CY8CKIT-142) : 10€ sur RS
Ça devrait arriver assez vite :)
Par motivation après avoir regardé la coupe de France de robotique, j'ai créé cette organisation 7TRobot, avec un wiki pour détailler les aventures à venir !