为啥我的 LED(stm32f3-discovery board)在应用延迟后不发光?
Posted
技术标签:
【中文标题】为啥我的 LED(stm32f3-discovery board)在应用延迟后不发光?【英文标题】:Why is my led(stm32f3-discovery board) is not glowing after applying delay?为什么我的 LED(stm32f3-discovery board)在应用延迟后不发光? 【发布时间】:2021-08-27 03:28:42 【问题描述】:我在应用延迟延迟时是否犯了任何错误?
这是我正在使用的代码,用于在延迟后闪烁 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();
如果我不使用延迟部分,它工作正常
【问题讨论】:
不耽误你到底看到了什么? 好的,所以如果我从我的代码中删除延迟部分,即闪存、时钟和延迟,只需提供'led_3.set_high();'内部循环,然后它工作正常。 【参考方案1】:我认为你设置了你的clocks
错误。要使延迟正常工作,您应该使用系统时钟。
这是基于 sample 为 STM32 创建 Delay
的方法(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);
,其中延迟是使用时钟周期数给出的。
【讨论】:
嗨 frankenapps,感谢您的回答,但我认为我的设备外围设备不支持此命令行“let clocks = rcc.cfgr.sysclk(48.mhz()).freeze();” 它要求在 freeze() 中缺少参数 啊,我明白了。您还必须添加ACR
:freeze
您尝试我的第二个建议了吗?它应该更简单......
我在 freeze 中提供了 flash.acr 但没有任何反应。
我尝试了第二个建议 cortex::delay 并且成功了。感谢@frankenapps 的帮助【参考方案2】:
在循环中,您将 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();
【讨论】:
感谢@Gerhard 的这个建议。我试图通过提供延迟来使 LED 3 发光,然后以一定的时间间隔使 LED 4 发光。虽然我也试过你的建议但没有结果。 @Samar:没有结果是什么意思?软件进入死循环。 LED 不发光。 这听起来像是你的程序在执行延迟语句时发生了恐慌。也许尝试使用半主机运行它或使用 OpenOCD 来获取跟踪:docs.rust-embedded.org/debugonomicon以上是关于为啥我的 LED(stm32f3-discovery board)在应用延迟后不发光?的主要内容,如果未能解决你的问题,请参考以下文章