STM32F411RE:我想在开漏模式下打开 LED,但 LED 不亮

STM32F411RE: I want to turn on the LED in open-drain mode, but the LED doesn't turn on

提问人:FancyPants General 提问时间:8/5/2023 最后编辑:FancyPants General 更新时间:8/5/2023 访问量:79

问:

我想在开漏模式下打开微控制器上的 LED,但 LED 不亮。 到目前为止,我有这个,我不知道我的错误是什么。我正在与STMCubeIDE中的STM32F411RE合作。

#include "main.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

#define RCC_BASE_ADDRESS 0x40023800
#define GPIOA_BASE_ADDRESS 0x40020000

#define RCC_AHB1ENR_OFFSET 0x30
#define GPIOA_MODER_OFFSET 0x00
#define GPIOA_ODR_OFFSET 0x14
#define GPIOA_OTYPER_OFFSET 0x04

#define RCC_AHB1ENR_POINTER (uint32_t*)(RCC_BASE_ADDRESS + RCC_AHB1ENR_OFFSET)
#define GPIOA_MODER_POINTER (uint32_t*)(GPIOA_BASE_ADDRESS + GPIOA_MODER_OFFSET)
#define GPIOA_ODR_POINTER (uint32_t*)(GPIOA_BASE_ADDRESS + GPIOA_ODR_OFFSET)
#define GPIOA_OTYPER_POINTER (uint32_t*)(GPIOA_BASE_ADDRESS + GPIOA_OTYPER_OFFSET)

int main(void)
{
 HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();

*RCC_AHB1ENR_POINTER |= (1 << 0);  // Enable clock for GPIOA
*GPIOA_MODER_POINTER |= (1 << 10); // Set pin 5 as output
*GPIOA_OTYPER_POINTER |= (1 << 5); // Set pin 5 to open-drain mode
*GPIOA_ODR_POINTER &= ~(1 << 5);   // Turn on the LED by driving the pin low (since it's open-drain)

while(1) {}
}
STM32Cubeide

评论

2赞 pmacfarlane 8/5/2023
您可能需要在启用 GPIOA 时钟和尝试设置其寄存器之间延迟。
2赞 pmacfarlane 8/5/2023
您还应该在寄存器定义中使用。或者更好的是,将CMSIS的定义用于您的芯片,例如 等等,而不是自己滚动。volatileGPIO_TypeDef
1赞 Ilya 8/5/2023
同意易失性(以及所有实际情况),但缺乏易失性也可能导致编译器重新排列某些指令。您 (OP) 有可能在向 GPIO 写入一些配置之后(而不是之前)已经向 GPIO 提供了时钟。这些GPIO配置看起来像是完全独立的,而不是对非易失性物质的互锁操作,因此如果我没记错的话,编译器可以自由切换顺序。关于GPIO寄存器的内容,调试器会告诉你什么?

答: 暂无答案