0

我在申请延迟延迟时犯了什么错误吗?

这是我正在使用的代码,用于在延迟后闪烁 LED 3 和 4。

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();

    }
}

如果我不使用延迟部分,它工作正常

4

2 回答 2

0

在循环中,您将 LED 设置为高电平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();
于 2021-06-10T08:17:41.310 回答
0

我认为你设置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);,其中延迟是使用时钟周期数给出的。

于 2021-06-10T07:03:58.490 回答