gpt4 book ai didi

c - STM32 Bare Metal C - 无法让 LED 工作

转载 作者:行者123 更新时间:2023-12-04 12:07:08 24 4
gpt4 key购买 nike

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

重要的:

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

  • 首先,我们必须弄清楚内置LED是什么引脚。根据制造商手册,LED 应位于引脚 D13 (PB3) 上。
    enter image description here

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

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

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

    RCC->AHB2ENR |= 0x2;

    接下来,我必须将 GPIO 引脚的模式设置为输出。根据类(class)和我的文档,这是使用 GPIOx_MODER 完成的。
    enter image description here

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

    GPIOB->MODER |= 0x40;

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

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

    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;
    }
    }

    最佳答案

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

    GPIOB->MODER |= 0x40;

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

    你应该使用
    GPIOB->MODER = (GPIOB->MODER & 0xFFFFFF3F) | 0x00000040;

    尽管因为重置状态得到保证,这也将起作用:
    GPIOB->MODER &= 0xFFFFFF7F; // equivalently, ~0x0080
    11 analog mode (reset state) 文档中的注释并非对所有引脚都准确。几个在 10 alternate function复位模式,包括 PB3。所以你需要清除一位并设置一位。

    关于c - STM32 Bare Metal C - 无法让 LED 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129323/

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