STM32 裸机 C - 无法让 LED 工作

Arj*_*jan 5 c embedded microcontroller arm microprocessors

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

重要的:

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

首先,我们要弄清楚内置LED在哪个引脚上。根据制造商手册,LED 应位于引脚 D13 (PB3) 上。 在此输入图像描述


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


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

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

RCC->AHB2ENR |= 0x2;
Run Code Online (Sandbox Code Playgroud)

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

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

GPIOB->MODER |= 0x40;
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是,要打开实际的 LED,我们必须设置输出数据寄存器,即 GPIOx_ODR。 在此输入图像描述

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

GPIOB->ODR = 0x8;
Run Code Online (Sandbox Code Playgroud)

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

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 3

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

GPIOB->MODER |= 0x40;
Run Code Online (Sandbox Code Playgroud)

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

你应该使用

GPIOB->MODER = (GPIOB->MODER & 0xFFFFFF3F) | 0x00000040;
Run Code Online (Sandbox Code Playgroud)

尽管因为重置状态是有保证的,但这也将起作用:

GPIOB->MODER &= 0xFFFFFF7F; // equivalently, ~0x0080
Run Code Online (Sandbox Code Playgroud)

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

  • @Lundin:最后,我相信你的建议会禁用调试端口 (2认同)