- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个裸机程序来闪烁绿色 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的引脚分配如下:
该原理图表明,焊桥 SB120 和 SB119 的出厂状态设置为 PB0 上的 LD1,而不是 PA5。您尝试设置 LD2(蓝色)的问题是您没有在 RCC 中启用 GPIOB - 它像 LD1(绿色)尝试中那样启用 GPIOA。
另一个问题是您的 GPIO MODER 设置假定端口的重置状态为零。事实并非如此(尽管这是针对有问题的特定引脚 - 所以在这种情况下您“侥幸逃脱”):
最好在一个地方定义所有端口/引脚特定常量,这样您就可以轻松切换或添加输出,并且减少出错的可能性:
#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/
嘿,我 wounderd 如果有什么。我可以继续阅读以改进此代码的突击队吗?至少它现在可以工作,但需要做一些微调:) 如您所见,代码非常困惑且难以阅读。希望有人能帮忙。 提前谢谢。 int potPi
我使用 AVR 作为微 Controller ,ATMEGA8 作为处理器(在微 Controller 内部)。带有微 Controller 的电路板有 4 个 LED。我能够刻录程序并点亮 LEDS
谁能解释一下两者之间的关系 LED 像素密度, LED像素高度和宽度 , 和 分辨率在创建模拟器时方法很详细。。并在启动时再次默认值:皮肤尺寸、密度;缩放密度以实现大小? 最佳答案 像素密度:每英寸像
我有一个由大小为 64*64 的 LED 组成的阵列。每个 LED 都可以点亮各种颜色,并且可以非常快速地改变颜色。我的最终目标是:对于网络摄像头接收到的每一帧,我希望能够从帧中“提取”LED 数组,
我正在使用 Arduino Uno 软件进行编码,但遇到了问题。我试图以随机顺序打开 8 个 LED,然后立即将它们全部关闭。我的问题是 LED 会多次点亮相同的 LED,但最终不会全部点亮。这使得电
当我使用Ethernet.begin(mac,ip)时,LED灯不会打开和关闭。但是当我不使用那条线时它就可以工作。但我需要使用以太网和 UPP 模块来打开和关闭。我怎样才能? 板卡型号:以太网08T
我试图顺时针和逆时针方向点亮我的 LED 灯。我使用mpu6050作为LED的方向控制。我检查了我的 mpu6050 驱动代码,它们没问题。顺时针方向工作时效果很好,所有 LED 灯均呈红色亮起。像这
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我是一名优秀的程序员,十分优秀!