#rust #embedded #stm32f3
Вопрос:
Есть ли какая-либо ошибка, которую я совершаю, применяя задержку задержки?
Это код, с которым я работаю, чтобы мигать светодиодами 3 и 4 с задержкой.
use cortex_m_rt::entry;
use stm32f30x_hal as hal;
use hal::delay::Delay;
use hal::prelude::*;
use hal::stm32f30x;
use panic_ha<
#[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(amp;mut reset_clock_control.ahb);
**let mut flash = device_p.FLASH.constrain();
let clocks = reset_clock_control.cfgr.freeze(amp;mut flash.acr);
let mut delay = Delay::new(core_periphs.SYST,clocks);**
let mut led_3 = gpioe
.pe9
.into_push_pull_output(amp;mut (gpioe.moder), amp;mut (gpioe.otyper));
let mut led_4=gpioe.pe8.into_push_pull_output(amp;mut gpioe.moder,amp;mut gpioe.otyper);
loop {
led_3.set_high();
**delay.delay_ms(2_000_u16);**
led_4.set_high();
}
}
Если я не использую часть задержки, она работает нормально
Комментарии:
1. Что именно вы видите без промедления?
2. хорошо, поэтому, если я удалю часть задержки из своего кода, которая является вспышкой, часами и задержкой, и просто предоставлю внутренний цикл » led_3.set_high ();», то он будет работать нормально.
Ответ №1:
Я думаю, ты 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);
, где задержка задается числом тактов.
Комментарии:
1. Привет, frankenapps, спасибо за ответ, но я думаю, что мое периферийное устройство не поддерживает эту командную строку «let clocks = rcc.cfgr.sysclk(48.mhz()).freeze();» запрашивает отсутствующие аргументы внутри freeze()
2. А, понятно. Вы тоже должны добавить
ACR
:freeze
3. Вы попробовали мое второе предложение? Это должно быть проще…
4. я предоставляю вспышку.acr внутри замораживания, но ничего не происходит.
5. Я попробовал второе предложение cortex::задержка , и оно сработало. Спасибо за помощь @frankenapps
Ответ №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();
Комментарии:
1. Спасибо за это предложение @Gerhard. Я пытался осветить светодиод 3, затем светодиод 4 с некоторым промежутком времени, обеспечивая задержку. Хотя я тоже попробовал ваше предложение, но безрезультатно.
2. @Samar: Что значит отсутствие результата? Программное обеспечение входит в бесконечный цикл.
3. Светодиод не светился.
4. Это звучит так, как будто ваша программа паникует при выполнении инструкции delay. Может быть, попробуйте запустить его с помощью полугостинга или используйте OpenOCD, чтобы получить трассировку: docs.rust-embedded.org/debugonomicon