我正在尝试在连接到LED的蓝色药丸(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进行编译和刷新。
如果您按照评论中的说明运行Keil,则可以肯定使用的是ST HAL。因此,您应该使用它。
使用此来启用GPIOC时钟
__GPIOC_CLK_ENABLE();
听起来您还没有启用其他时钟。我目前无法确定是哪一个,但可能在链中排名靠前。 (这可能是因为您使用APB2ENR
而不是宏启用了时钟)
另一种解决方案是使用STM32CubeMX,这是ST证明的一种多平台工具,可以为多个IDE创建基础初始化的项目。
下载并运行它,为您的MCU创建一个项目,添加要驱动的引脚作为输出,并生成一个应编译并运行的Keil项目。如果可行,则可以对STM32CubeMX创建工作代码所采取的步骤进行逆向工程。