почему мой светодиод (stm32f3-discovery board) не светится после применения задержки? Есть ли ошибка, которую я делаю, применяя задержку?

      use cortex_m_rt::entry;
use stm32f30x_hal as hal;
use hal::delay::Delay;
use hal::prelude::*;
use hal::stm32f30x;
use panic_halt;

#[entry]
fn main() -> ! {
    let device_p = stm32f30x::Peripherals::take().unwrap();
    let core_periphs=cortex_m::Peripherals::take().unwrap();
    let mut reset_clock_control = device_p.RCC.constrain();
    let mut gpioe = device_p.GPIOE.split(&mut reset_clock_control.ahb);
    **let mut flash = device_p.FLASH.constrain();
    let clocks = reset_clock_control.cfgr.freeze(&mut flash.acr);
    let mut delay = Delay::new(core_periphs.SYST,clocks);**
    let mut led_3 = gpioe
        .pe9
        .into_push_pull_output(&mut (gpioe.moder), &mut (gpioe.otyper));
    let mut led_4=gpioe.pe8.into_push_pull_output(&mut gpioe.moder,&mut gpioe.otyper);


    loop {
        led_3.set_high();
        **delay.delay_ms(2_000_u16);**
        led_4.set_high();

    }
}

это код, с которым я работаю, чтобы мигать светодиоды 3 и 4 после предоставления задержки. если я не использую часть задержки, она работает нормально

2 ответа

В петле вы устанавливаете светодиод на высокий уровень led_3.set_high();. Однако никогда не устанавливали led_3снова низкий, чтобы он никогда не мигал. Так что измените свой цикл на:

      led_3.set_high();
led_4.set_low();
delay.delay_ms(2_000_u16);
led_4.set_high();
led_3.set_low();

Я думаю, ты настроил свой clocksнеправильный. Для корректной работы задержки следует использовать системные часы.

Вот как создать Delayдля STM32 на основе этого образца (stm32f4xx, но должен работать и для вас):

      // Set up the system clock. We want to run at 48MHz for this one.
let rcc = dp.RCC.constrain();
let clocks = rcc.cfgr.sysclk(48.mhz()).freeze();

// Create a delay abstraction based on SysTick
let mut delay = hal::delay::Delay::new(cp.SYST, clocks);

где dp периферийные устройства моего устройства (например, let dp = stm32::Peripherals::take().unwrap()) а также cp являются основными периферийными устройствами.

Итак, это использует sysclk.

В качестве альтернативы вы также можете попробовать заменить задержку на cortex_m::delay(8_000_000);, где задержка указывается в количестве тактов.

Другие вопросы по тегам