stm32-rs / stm32g4xx-hal

Peripheral access API for STM32G4 series microcontrollers
Apache License 2.0
59 stars 45 forks source link

adc-one-shot example does not work in release mode #78

Closed usbalbin closed 10 months ago

usbalbin commented 1 year ago

Replacing opt-level = 0 with opt-level = 0 or opt-level = "s" causes adc conversion to get stuck at wait_for_conversion_sequence. As far as I can see the same thing happens when running in release mode(without changing any settings).

rustc 1.70.0 (90c541806 2023-05-31) Device: nucleo-G474RE with stm32g474ret

Cargo.toml

 [profile.dev]
-opt-level = 0
+opt-level = "s"

 codegen-units = 1
 debug = true
 incremental = false
 lto = false

 [profile.release]
 debug = false
 codegen-units = 1
 incremental = false
 lto = true

Log

$ DEFMT_LOG=info cargo run --example adc-one-shot --features stm32g474,log-rtt,defmt -- --chip STM32G474RETx
   Compiling defmt-macros v0.3.5
   Compiling defmt v0.3.4
   Compiling defmt-rtt v0.4.0
   Compiling stm32g4xx-hal v0.0.1 (/home/decahe/stm32g4xx-hal)
   Compiling panic-probe v0.3.1
    Finished dev [optimized + debuginfo] target(s) in 29.07s
     Running `probe-run --connect-under-reset target/thumbv7em-none-eabihf/debug/examples/adc-one-shot --chip STM32G474RETx`
(HOST) INFO  flashing program (14 pages / 14.00 KiB)
(HOST) INFO  success!
────────────────────────────────────────────────────────────────────────────────
INFO  start
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:24
INFO  rcc
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:29
INFO  Setup Adc1
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:34
INFO  Setup Gpio
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:40
INFO  Enter Loop
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:45
INFO  Convert
└─ adc_one_shot::__cortex_m_rt_main @ examples/adc-one-shot.rs:48
^C────────────────────────────────────────────────────────────────────────────────
stack backtrace:
   0: stm32g4xx_hal::adc::DynamicAdc<stm32g4::stm32g474::ADC1>::wait_for_conversion_sequence
        at src/adc.rs:1594:27
   1: core::ptr::read_volatile
        at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:1553:9
   2: vcell::VolatileCell<T>::get
        at /home/decahe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcell-0.1.3/src/lib.rs:33:18
   3: stm32g4::generic::Reg<REG>::read
        at /home/decahe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/stm32g4-0.15.1/src/generic.rs:73:19
   4: stm32g4xx_hal::adc::DynamicAdc<stm32g4::stm32g474::ADC1>::current_sample
        at src/adc.rs:1608:21
   5: stm32g4xx_hal::adc::DynamicAdc<stm32g4::stm32g474::ADC1>::convert
        at src/adc.rs:1576:34
   6: stm32g4xx_hal::adc::Adc<stm32g4::stm32g474::ADC1,stm32g4xx_hal::adc::Disabled>::convert
        at src/adc.rs:1996:21
   7: adc_one_shot::__cortex_m_rt_main
        at examples/adc-one-shot.rs:49:22
   8: main
        at examples/adc-one-shot.rs:20:1
   9: Reset
(HOST) INFO  device halted by user
usbalbin commented 1 year ago

It does seem very timing dependent. In some instances i have gotten it to work when running with debugger even in release mode..