c83552eadc
The DAC driver defaults to enabling the channel trigger, but leaves it at the default value of TIM6 TRGO, then performs a software trigger after writing the new output value. We could change the trigger selection to software trigger, but for this example it's simpler to just disable the trigger.
39 lines
914 B
Rust
39 lines
914 B
Rust
#![no_std]
|
|
#![no_main]
|
|
#![feature(type_alias_impl_trait)]
|
|
|
|
use defmt::*;
|
|
use embassy_executor::Spawner;
|
|
use embassy_stm32::dac::{DacCh1, DacChannel, Value};
|
|
use embassy_stm32::dma::NoDma;
|
|
use {defmt_rtt as _, panic_probe as _};
|
|
|
|
#[embassy_executor::main]
|
|
async fn main(_spawner: Spawner) -> ! {
|
|
let p = embassy_stm32::init(Default::default());
|
|
info!("Hello World, dude!");
|
|
|
|
let mut dac = DacCh1::new(p.DAC, NoDma, p.PA4);
|
|
unwrap!(dac.set_trigger_enable(false));
|
|
|
|
loop {
|
|
for v in 0..=255 {
|
|
unwrap!(dac.set(Value::Bit8(to_sine_wave(v))));
|
|
}
|
|
}
|
|
}
|
|
|
|
use micromath::F32Ext;
|
|
|
|
fn to_sine_wave(v: u8) -> u8 {
|
|
if v >= 128 {
|
|
// top half
|
|
let r = 3.14 * ((v - 128) as f32 / 128.0);
|
|
(r.sin() * 128.0 + 127.0) as u8
|
|
} else {
|
|
// bottom half
|
|
let r = 3.14 + 3.14 * (v as f32 / 128.0);
|
|
(r.sin() * 128.0 + 127.0) as u8
|
|
}
|
|
}
|