【发布时间】:2021-03-06 06:36:36
【问题描述】:
我刚刚开始探索 STM32 MCU。我想闪烁 BluePill(具有 STM32F103C8T6 MCU)板上的 LED。我怀疑我被什么东西误导了。根据 F1 系列的参考手册,有 3 个主要步骤:
- 为 PORT 启用时钟(此处为 PORTC)
- 配置 CNF/MODE 寄存器
- 根据需要配置 ODR 寄存器,即引脚上的 HIGH/LOW。
我已按照手册在 KEIL MDK 中编写代码,但加载后,代码无法运行,我按下重置按钮然后 LED 亮起,即使我已将设置更改为 RESET &在 KEIL 中运行。
这里是代码和参考手册的部分。
#include<stm32f10x.h>
int main(){
RCC->APB2ENR |= 1<<4; //PORTC is on APB2 bus
GPIOC->CRH |= (1<<20);
while(1){
GPIOC->ODR |= 0x00002000;
for(int i = 0; i < 500000;i++); //dummy delay
GPIOC->ODR &= ~0x00002000;
for(int i = 0; i < 500000;i++); // dummy delay
}
}
当我使用调试模式时,我注意到在执行RCC->APB2ENR |= (1<<4) 之后没有为 PORTC 启用时钟的一件事。
LED 不闪烁。在整个过程中我找不到错误。
【问题讨论】:
-
你检查生成的代码了吗?延迟可能会得到优化。也许您可以尝试将循环计数器声明为 volatile。
-
@th33lf 很抱歉,我不明白你的意思。实际上 LED 在 while 循环内切换,但仅在调试模式下。它还显示没有为 PORTC 启用时钟。
-
你的意思是如果你单步执行,LED 会切换,但如果你让代码连续运行,LED 会一直亮着?如果是这样,编译器可能会消除延迟。
-
是的,不亮但不亮。如果代码被正确编译和上传,当我给电路板供电时,LED 应该会闪烁,但事实并非如此。
-
我还是不明白你到底面对的是什么。它是否在调试模式下闪烁并且仅在您简单地闪烁和重置时才起作用?还是仅当您逐行执行时才有效?如果是这样,我会先尝试将循环计数器声明为 volatile。此外,端口配置似乎是一个两步过程。您应该配置方向(输入/输出),然后它应该是什么样的输出。对于 LED,它通常是开漏输出,但取决于您的电路板。我不确定是否只是做 (1