【问题标题】:STM32 Bare Metal C - Can't get LED to workSTM32 Bare Metal C - 无法让 LED 工作
【发布时间】:2019-11-29 10:39:15
【问题描述】:

所以我目前正在学习 STM32 微处理器的课程,但是,我似乎连最基本的事情都失败了:打开 LED。完整的代码在这篇文章的底部。

重要:

  • 硬件运行正常。
  • 我使用的是 STM32L432KC。

首先,我们要弄清楚内置 LED 的引脚是什么。根据制造商手册,LED 应在引脚 D13 (PB3) 上。


好的,我们正在寻找 PB3。根据 STM32L432KC 的数据表,PB3 位于 B 端口,因此连接到高性能总线,如下图所示。


酷。所以我们的总线是 AHB2,我们正在使用 GPIOB。现在我们必须使用 RCC_AHB3ENR 寄存器启用该总线上的时钟。现在,这是我可能会犯错误的部分(否则这篇文章将不存在),所以请密切关注。如果我理解正确,我希望将第 1 位设置为 1,因为这表示“GPIOBEN”设置为“启用 IO 端口 B 时钟”。

这让我相信我应该如下设置总线寄存器:

RCC->AHB2ENR |= 0x2;

接下来我必须将 GPIO 引脚的模式设置为输出。根据课程和我的文档,这是使用 GPIOx_MODER 完成的。

这让我相信我应该如下设置 GPIO 模式:

GPIOB->MODER |= 0x40;

最后但并非最不重要的是,要打开实际的 LED,我们必须设置输出数据寄存器 GPIOx_ODR。

这让我相信我应该将数据设置如下:

GPIOB->ODR = 0x8;

我不确定我哪里出错了,但这是我第一次在如此深层次上使用寄存器。我一定忽略了一些东西,但我尝试了多个例子但没有成功。感谢所有帮助。 这是完整的代码:

// PB3 - User LED
// RCC->AHB2ENR
// GPIOx_MODER
// GPIOx_ODR

#include "stm32l4xx.h"

int main(void)
{
    RCC->AHB2ENR |= 0x2;
    GPIOB->MODER |= 0x40;

    while(1)
    {
        GPIOB->ODR = 0x8;
    }
}

【问题讨论】:

    标签: c arm embedded microcontroller microprocessors


    【解决方案1】:

    您的模式寄存器配置不正确。你的代码行

    GPIOB->MODER |= 0x40;
    

    只能设置位,不能清除它们。而且你设置了太多位,因为每对的复位值是11,整个寄存器对于端口 C-E 是 FFFF FFFF,对于端口 B 是 FFFF FEBF。

    你应该使用

    GPIOB->MODER = (GPIOB->MODER & 0xFFFFFF3F) | 0x00000040;
    

    虽然因为重置状态是有保证的,所以这也是可行的:

    GPIOB->MODER &= 0xFFFFFF7F; // equivalently, ~0x0080
    

    11 analog mode (reset state) 文档中的注释并不适用于所有引脚。有几个在复位时处于10 alternate function 模式,包括 PB3。所以你需要清除一位并设置一位。

    【讨论】:

    • 我已经接受了您的回答,因为这解决了我的问题,但是有两件事我不清楚。首先: - 我不明白整个寄存器如何为 FFFF FFFF,因为它声明端口 B 的复位值为 FFFF FEBF。 - 你的 &= 速记似乎不起作用。你的第一个答案是。我想我必须阅读更多的按位运算符。
    • "GPIOB->MODER &= 0xFFFFFF7F;"不应该是复合 AND。如果您删除&符号,它会起作用。
    • @Arjan:假设您不想重新配置任何其他引脚,&= 是正确的。好吧,如果文件没有说谎,它本来会是这样。答案已更新。
    • 由于这是初始化代码,只需执行GPIOB->MODER = 0x00000040u;。在第一次写入之前读取未初始化的寄存器是没有意义的。
    • @Lundin:最后,我相信您的建议会禁用调试端口
    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多