所有寄存器都需要时钟才能配置吧,寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。例如,某个功能不需要,但是它还是一直运行。stm32需要配置时钟,就可以把不需要那些功能的功耗去掉。
如下为STM32配置GPIO
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义一个GPIO_InitTypeDef类型的结构体
// 使能LED_RED所用引脚端口时钟;使用端口判断的方法使能时钟, 以使代码移植更方便
if(LED_RED_GPIO == GPIOA) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
if(LED_RED_GPIO == GPIOB) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
if(LED_RED_GPIO == GPIOC) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
if(LED_RED_GPIO == GPIOD) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
if(LED_RED_GPIO == GPIOE) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);
if(LED_RED_GPIO == GPIOF) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF , ENABLE);
if(LED_RED_GPIO == GPIOG) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF , ENABLE);
// 使能LED_RED所用引脚端口时钟;使用端口判断的方法使能时钟, 以使代码移植更方便
if(LED_BLUE_GPIO == GPIOA) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
if(LED_BLUE_GPIO == GPIOB) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
if(LED_BLUE_GPIO == GPIOC) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
if(LED_BLUE_GPIO == GPIOD) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
if(LED_BLUE_GPIO == GPIOE) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);
if(LED_BLUE_GPIO == GPIOF) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF , ENABLE);
if(LED_BLUE_GPIO == GPIOG) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF , ENABLE);
// 配置LED_RED引脚工作模式
GPIO_InitStructure.GPIO_Pin = LED_RED_PIN; // 选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为50MHz
GPIO_Init(LED_RED_GPIO , &GPIO_InitStructure); // 调用库函数,初始化GPIO
// 配置LED_RED引脚工作模式
GPIO_InitStructure.GPIO_Pin = LED_BLUE_PIN; // 选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为50MHz
GPIO_Init(LED_BLUE_GPIO , &GPIO_InitStructure); // 调用库函数,初始化GPIO
LED_RED_GPIO -> BSRR = LED_RED_PIN ; // 点亮LED_RED, 低电平点亮
LED_BLUE_GPIO ->BSRR = LED_BLUE_PIN ; // 点亮LED_BLUE,低电平点亮
}