在 stm32f103c8t6 Blue Pill 中启用输出端口

Enabling an output port in stm32f103c8t6 Blue Pill

我正在尝试启用连接到 LED 的 Blue Pill (stm32f103c8t6) 中的 PC13,不确定它是低电平有效还是高电平有效,所以我尝试了两种方法仍然无效。

RCC->APB2ENR |= 0x10;
用于使能端口C的时钟。




GPIOC->CRH = (GPIOC->CRH & 0xFF0FFFFF) | 0x00100000;
用于配置端口C处于输出模式和推挽模式。




GPIOC->ODR &= !(1<<13);用于驱动C13引脚为低电平。

全部代码:

#include "stm32f10x.h"

int main(){
    RCC->APB2ENR |= 0x10;
    GPIOC->CRH = (GPIOC->CRH & 0xFF0FFFFF) | 0x00100000;  
    while(1) {
        GPIOC->ODR = ~(1<<13);//if it is Active Low
        for (int i = 0; i < 1000000; ++i) __asm__("nop");
        GPIOC->ODR |= 1<<13; //if it is Active High
        for (int i = 0; i <  500000; ++i) __asm__("nop");
    }

}

编辑:
经过一些调查,我发现如果 运行 调试会话,代码可以正常工作,这可能是软件问题吗?或者调试代码设置了我没有设置的东西?正如我所说,我正在使用 uVision 进行编译和闪存。

如果您像您在评论中所说的那样 运行ning Keil,那么可以肯定您正在使用 ST HAL。 因此你应该使用它。

使用它来启用 GPIOC 时钟

__GPIOC_CLK_ENABLE();

听起来您还没有启用其他时钟。我现在无法弄清楚它是哪一个,但它可能是链条中的一个高位。 (这可能是因为您使用 APB2ENR 而不是宏启用了时钟)

另一种解决方案是使用 STM32CubeMX 它是一个多平台工具,经 ST 证明可以为多个 IDE 创建基础初始化项目。

下载并运行它,为您的MCU创建一个项目,添加您要驱动的引脚作为输出并生成一个应该编译的Keil项目并运行。如果可行,您可以对 STM32CubeMX 用于创建工作代码的步骤进行逆向工程。


您的根本问题是您没有在配置中启用 reset and run。因此,在编程后,需要在新闪烁的代码 运行 之前重置电路板。启动调试器会执行此操作。

此配置位于实用程序->设置菜单中。 (忽略红色标记,我无法自己捕捉图像,因此从互联网上获得)

如果在“int”之前使用“volatile”,它会起作用