委员 2023-08-24 15:34 采纳率: 0%
浏览 9

在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)
    {
        
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-24 18:11
    关注

    【以下回答由 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口可以后置。


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

报告相同问题?

问题事件

  • 修改了问题 8月24日
  • 创建了问题 8月24日