下述代码只可使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口可以后置。