почему мой светодиод (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);
, где задержка указывается в количестве тактов.