为啥我的 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() 中缺少参数 啊,我明白了。您还必须添加ACRfreeze 您尝试我的第二个建议了吗?它应该更简单...... 我在 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)在应用延迟后不发光?的主要内容,如果未能解决你的问题,请参考以下文章

MDK5对stm32编程为啥延时函数一直没执行?

stm32按键控制的蜂鸣器为啥不响?帮小白看看代码

stm32窗口看门狗中断服务函数为啥不能用延时函数

STM32F1 GPIO寄存器LED不闪烁,一直保持

stm32配置led

stm32点亮led灯用到的模块