在STM32F103C8T6中,为什么B口需要先配置时钟,而A口可以后置呢?

下述代码只可使STM32F103C8T6的PA0输出低电压,而PB0没有输出。

只需将 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 提到 GPIO_Init(GPIOB,&GPIO_InitStructure); 的前一行,即先配置时钟,pB0就可以输出低电压了。

当然,在配置GPIO口时,应该要先配置时钟,可问题是为什么只有B口需要先配置,而A口可以后置呢?

当初写出这种代码的原因是因为keil5软件(我没有适配c99),它不支持在中间定义新的结构体。
于是我就把整个GPIO的参数放到了配置时钟的前面。


#include "stm32f10x.h"                  // Device header

int main(void)
{    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
    
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);

    while (1)
    {
        
    }
}

因为 SWD 在 PA13, PA14, 所以 PA Clock 是开的?
你把 SWD & JTAG 全关了, 试试

【以下回答由 GPT 生成】

在STM32F103C8T6中,通过RCC(Reset and Clock Control)控制寄存器来配置GPIO口,其中有两个寄存器与GPIO相关:RCC_APB2PeriphClockCmd和RCC_APB2Periph_GPIOx。具体来说,RCC_APB2PeriphClockCmd是用来使能GPIO的外设时钟,而RCC_APB2Periph_GPIOx则用来选择具体的GPIO口。

在给GPIO口配置时钟时,是通过RCC_APB2PeriphClockCmd函数来实现的。这个函数的第一个参数是要配置时钟的GPIO外设,可以是GPIOA、GPIOB等等,第二个参数是时钟使能的指令。例如 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 表示要使能GPIOB的外设时钟。

当我们要配置GPIO口的时候,需要先选择具体的GPIO口。在这个问题中,我们先配置了GPIOB的PB0口,然后选择了GPIOA的PA0口。所以 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 的位置需要在 GPIO_Init(GPIOB,&GPIO_InitStructure); 之前,以先配置GPIOB的外设时钟。

为什么需要先配置时钟?因为STM32系列的芯片中,每个GPIO口都有一个对应的时钟线与之相连。如果没有使能GPIO口的时钟,那么相应的GPIO口就无法工作,无法完成输入输出的功能。

综上所述,需要先配置GPIO口的外设时钟,然后选择要配置的GPIO口。所以在配置GPIO口时,只有B口需要先配置时钟,而A口可以后置。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^