首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32闪烁发光二极管寄存器错误?

STM32闪烁发光二极管寄存器错误?
EN

Stack Overflow用户
提问于 2020-09-18 23:07:51
回答 2查看 458关注 0票数 2

有谁知道为什么代码不能工作吗?

代码语言:javascript
复制
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);
GPIOB->MODER |= (0x1u << 6u);
for (int i = 0; i < 1000; i++) {
    GPIOB->ODR |= (0x1u << 0x3u);
}

我使用的是STM板(STM32L432KC),它有一个被称为引脚PB3 (端口26)的集成发光二极管,但闪烁后没有任何反应。实际上,那里应该有一个发光二极管。我是否使用了正确的寄存器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-18 23:10:22

您在ODR中设置了位,但从未清除它,因此它不会闪烁,您需要在开/关转换之间延迟一段时间才能清晰地看到它闪烁。

在可能的情况下,最好也写入BSRR寄存器而不是ODR,这样可以避免读取-修改-写入周期。

如果代码是整个main(),那么您可能希望用while(1)替换for (int i = 0; i < 1000; i++),您通常不希望在嵌入式上下文中从main返回。

票数 5
EN

Stack Overflow用户

发布于 2020-09-19 16:33:07

此序列错误(我没有检查您是否使用了正确的RCC寄存器)

代码语言:javascript
复制
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);

当您启用外设时钟时,您需要读回值或添加一些延迟,以便通过总线传播更改。为此,我通常使用屏障指令。

代码语言:javascript
复制
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
__DMB();
GPIOB->MODER &= ~(0x3u << 6u);

如果不添加此延迟(或回读),则第一次操作将失败,因为它将在非时钟GPIO外设上执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63958330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档