STM32裸金属C-Can';不要被引导去工作

STM32裸金属C-Can';不要被引导去工作,c,arm,embedded,microcontroller,microprocessors,C,Arm,Embedded,Microcontroller,Microprocessors,因此,我目前正在学习STM32微处理器的课程,然而,我似乎在最基本的事情上都失败了:打开LED。完整的代码在这篇文章的底部 重要: 硬件工作正常 我使用的是STM32L432KC 首先,我们必须弄清楚内置LED的引脚是什么。根据制造商手册,LED应位于引脚D13(PB3)上。 好的,我们在找PB3。根据STM32L432KC的数据表,PB3位于B端口上,因此连接到高性能总线,如下图所示。 酷。我们的巴士是AHB2,我们正在和GPIOB合作。现在我们必须使用RCC_AHB3ENR寄存器

因此,我目前正在学习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-用户指示灯
//RCC->AHB2ENR
//GPIOx_MODER
//GPIOx_ODR
#包括“stm32l4xx.h”
内部主(空)
{
RCC->AHB2ENR |=0x2;
GPIOB->MODER |=0x40;
而(1)
{
GPIOB->ODR=0x8;
}
}

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

GPIOB->MODER |= 0x40;
只能设置位,不能清除位。设置的位太多,因为对于端口C-E,每对的重置值是
11
,而整个寄存器是
FFFF FFFF
,对于端口B,则是
FFFF FEBF

你应该使用

GPIOB->MODER = (GPIOB->MODER & 0xFFFFFF3F) | 0x00000040;
尽管重置状态是有保证的,但这也会起作用:

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


11模拟模式(复位状态)
文档中的注释并非适用于所有引脚。复位时有几个处于
10备用功能
模式,包括PB3。因此,您需要清除一个位并设置一个位。

我已经接受了您的答案,因为这解决了我的问题。但是,有两件事我不清楚。首先:-我不理解整个寄存器是如何FFFF FFFF的,因为它声明端口B的重置值是FFFF FEBF。-您的&=速记似乎不起作用。你的第一个答案是肯定的。我想我得多读一些位运算符。“GPIOB->MODER&=0xFFFFFF7F;”不应该是一个复合运算符。如果您删除了符号,它就可以正常工作。@Arjan:假设您不想重新配置任何其他管脚,则正确为
&=
。好吧,如果文件没有说谎的话,它本来会是的。答案已更新。由于这是初始化代码,只需执行
GPIOB->MODER=0x00000040u。在第一次写入未初始化的寄存器之前读取它是没有意义的。@Lundin:最后,我相信您的建议会禁用调试端口