C STM32F401RE核子板,无法切换用户LED

C STM32F401RE核子板,无法切换用户LED,c,microcontroller,stm32,stm32f4,nucleo,C,Microcontroller,Stm32,Stm32f4,Nucleo,我正试图弄清楚如何在NucleoBoard上切换LED,但我没有看到用户LED切换。在网上看,这似乎是你所要做的一切。还有其他人遇到过这个问题吗 #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" int main(void) { int counter = 0; SystemInit(); GPIO_InitTypeDef temp; temp.GPIO_

我正试图弄清楚如何在NucleoBoard上切换LED,但我没有看到用户LED切换。在网上看,这似乎是你所要做的一切。还有其他人遇到过这个问题吗

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

int main(void)
{
    int counter = 0;
    SystemInit();

    GPIO_InitTypeDef temp;
    temp.GPIO_Mode = GPIO_Mode_OUT;
    temp.GPIO_OType = GPIO_OType_PP;    // Push Pull
    temp.GPIO_Pin = GPIO_Pin_5;
    temp.GPIO_Speed = GPIO_Low_Speed;
    temp.GPIO_PuPd = GPIO_PuPd_NOPULL;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_Init( GPIOA, &temp );

    while( 1 )
    {
        if ( counter++ > 10000 )
        {
            GPIO_ToggleBits( GPIOA, GPIO_Pin_5 );
            counter = 0;
        }
    }
}
你必须写作

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
要启用GPIOA。

您必须编写

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

要启用GPIOA。

您不能使用AHB2时钟控件启用AHB1外围时钟

RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    ^^^^                   ^^^
“我只是看不到用户LED切换。”


即使正确启用GPIO时钟,也会非常快地(MHz顺序)切换输出,
计数器
没有明显的作用。如果闪烁的LED是你的目标,那就不行了;您只会看到LED的亮度略低于全亮度-您需要在每个切换之间进行延迟

无法使用AHB2时钟控件启用AHB1外围时钟

RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    ^^^^                   ^^^
“我只是看不到用户LED切换。”


即使正确启用GPIO时钟,也会非常快地(MHz顺序)切换输出,
计数器
没有明显的作用。如果闪烁的LED是你的目标,那就不行了;您只会看到LED的亮度略低于全亮度-您需要在每个切换之间进行延迟

Clifford完全正确,LED正在快速“切换”。据推测,STM32F401RE的运行频率为168Mhz。将计数器值从10.000更改为例如50.000.000,以查看LED以适当的速率切换。

Clifford完全正确,LED以快速方式“切换”。据推测,STM32F401RE的运行频率为168Mhz。将计数器值从10.000更改为例如50.000.000,以查看LED以适当的速率切换。

我是对的,但更改计数器值不会解决问题-在该代码中不会。此外,它还需要易失性,在任何情况下,使用软件计数器进行定时延迟都是一个坏主意。Cortex-M有一个SYSTICK定时器。我故意选择不提供修复方案,因为解决方案和更好的方法很多。我完全同意你的观点,但计数器不必不稳定。将计数器保存在寄存器中并增加其中的值就足够了。当然,这不是一个好的解决方案,但它将对Godspped产生明显的效果,他可以继续他的工作。我选择不提供复杂的解决方案,比如在用户已经在努力切换GPIO端口时使用SYSTICK定时器。显然,此时用户将负担过重。不要这么苛刻。任何像样的优化编译器都会删除一个空循环,其中不使用控制变量;除非声明为volatile,否则实际上您没有提供任何解决方案,因为计数器不在延迟循环中,它只是对切换事件进行计数。你需要一个独立的答案,而不是参考其他答案——即使你像我一样部分复制了其他答案。你的回答增加了一个新的、有效的观点,但其本身应该是完整的。如果我删除我的答案,引用它将毫无意义。因此,这不是一个讨论论坛。还请注意,虽然F401可以在168MHz下运行,但它不需要,并且除非在main之前的启动中配置了PLL和HS时钟,否则它将在16MHz下运行内部振荡器。我是对的,但更改计数器值不会解决问题-在该代码中不是这样。此外,它还需要易失性,在任何情况下,使用软件计数器进行定时延迟都是一个坏主意。Cortex-M有一个SYSTICK定时器。我故意选择不提供修复方案,因为解决方案和更好的方法很多。我完全同意你的观点,但计数器不必不稳定。将计数器保存在寄存器中并增加其中的值就足够了。当然,这不是一个好的解决方案,但它将对Godspped产生明显的效果,他可以继续他的工作。我选择不提供复杂的解决方案,比如在用户已经在努力切换GPIO端口时使用SYSTICK定时器。显然,此时用户将负担过重。不要这么苛刻。任何像样的优化编译器都会删除一个空循环,其中不使用控制变量;除非声明为volatile,否则实际上您没有提供任何解决方案,因为计数器不在延迟循环中,它只是对切换事件进行计数。你需要一个独立的答案,而不是参考其他答案——即使你像我一样部分复制了其他答案。你的回答增加了一个新的、有效的观点,但其本身应该是完整的。如果我删除我的答案,引用它将毫无意义。因此,这不是一个讨论论坛。还要注意的是,虽然F401可以在168MHz下运行,但它不需要,除非在main之前的启动中配置了PLL和HS时钟,否则它将在16MHz下运行内部振荡器。