gpt4 book ai didi

c - 无法打开或关闭绿色/蓝色 LED STM32F429ZI - Nucleo 板?

转载 作者:行者123 更新时间:2023-11-30 14:39:33 28 4
gpt4 key购买 nike

我正在尝试编写一个裸机程序来闪烁绿色 LED。事实上,我无法打开或关闭任何 LED。这是一个现成的板。主板名称为 NUCLEO F429ZI。 Board Image

我已经浏览了原理图,并且确信引脚是 PA5,即端口 A 和引脚号 5。但是,LED 根本不闪烁。我可以看到我的代码已使用 uVision IDE 加载到 STM32 板上。

我尝试过设置蓝色 LED,即 PB7,但这也根本不起作用。

void delayMs(int delay);

int main(void)
{
//enable clock access to A
RCC->AHB1ENR |= 1; //enable GPIO A clock
GPIOA->MODER |= 0x400; // PA-5 01 0000 - PA0
while(1)
{
GPIOA->ODR |= 0x20;
//delay
delayMs(100);
GPIOA->ODR &=~ 0x20;
delayMs(100);
}

}

void delayMs(int delay)
{
int i = 0;
for(; delay >0; delay--)
{
for(i=0; i<3195; i++)
{
}
}
}

STM32F429ZI 中的绿色 LED 应闪烁。

接下来,我尝试打开蓝色 LED,但它也不起作用。根据我通过查看原理图的理解 - PB7 应该打开蓝色 LED。但这也行不通。

#include "stm32f4xx.h"
int main(void)
{
RCC->AHB1ENR |= 1;
// ob 01 00 00 00 00 00 00 00 // PB7
GPIOB->MODER = 0x4000;
for(;;)
{
GPIOB->ODR = 0x80;
}
}

最佳答案

Nucleo F429ZI UM1974 用户手册下载链接https://www.st.com/en/evaluation-tools/nucleo-f429zi.html#resource 毫无帮助似乎已损坏(在撰写本文时),但我找到了副本 elsewhere ,三个用户LED的引脚分配如下:

enter image description here

该原理图表明,焊桥 SB120 和 SB119 的出厂状态设置为 PB0 上的 LD1,而不是 PA5。您尝试设置 LD2(蓝色)的问题是您没有在 RCC 中启用 GPIOB - 它像 LD1(绿色)尝试中那样启用 GPIOA。

另一个问题是您的 GPIO MODER 设置假定端口的重置状态为零。事实并非如此(尽管这是针对有问题的特定引脚 - 所以在这种情况下您“侥幸逃脱”):

enter image description here

最好在一个地方定义所有端口/引脚特定常量,这样您就可以轻松切换或添加输出,并且减少出错的可能性:

#define LED_PORT              GPIOB
#define LED_PORT_RCC_EN 0x2u
#define GPIO_MODE_MASK ~0x3u
#define GPIO_MODE_OUTPUT 0x1u

#define GREEN_LED_PIN 0u
#define BLUE_LED_PIN 7u
#define RED_LED_PIN 14u
#define FLASH_LED GREEN_LED_PIN

int main(void)
{
RCC->AHB1ENR |= LED_PORT_RCC_EN ;
LED_PORT->MODER &= GPIO_MODE_MASK << (FLASH_LED << 1) ;
LED_PORT->MODER |= GPIO_MODE_OUTPUT << (FLASH_LED << 1) ;

for(;;)
{
LED_PORT->ODR |= 0x1 << FLASH_LED ;
delayMs( 100 ) ;
LED_PORT->ODR &= ~(0x1 << FLASH_LED) ;
delayMs( 100 ) ;
}

return 0 ;
}

您的延迟功能存在严重缺陷,并且可能会被优化为“不执行任何操作”。您的循环计数器需要声明为 volatile 以避免被优化。如果发生这种情况,指示灯不会明显闪烁,但会以非常高的频率发出脉冲,并且会亮起,但不会达到全亮度。

以下内容将阻止循环被优化。

void delayMs( unsigned delay )
{
for( volatile unsigned d = delay; d > 0; d--)
{
for( volatile int i = 0; i < 3195; i++ )
{
}
}
}

然而它是180MHz的部分;如果您以全速 3195 次迭代运行它,可能不会花费 1 毫秒。更像是几十微秒。即使以 16MHz 的启动 HSI 频率运行,也可能需要几百微秒的量级,并且在任何情况下都会随着优化设置和运行任何中断处理程序所花费的时间而变化。最好使用 Cortex-M SYSTICK 计数器,如下所示:

static volatile uint32_t ms_tick = 0 ;

void SysTick_Init(void)
{
SysTick_Config( SystemCoreClock / 1000 ) ;
}

void SysTick_Handler(void)
{
ms_tick++;
}

void delayMs( uint32_t delay)
{
uint32_t start_tick = ms_tick ;
while( (ms_tick - start_tick) < delay );
}

然后,无论您运行处理器的时钟速度或中断负载如何,延迟都将是准确的。

关于c - 无法打开或关闭绿色/蓝色 LED STM32F429ZI - Nucleo 板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56053529/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com