//LED的I/O口初始化程序 :顺序:1.是能io口时钟 2.初始化io口模式 ,配置相关参数(包括速度,pin脚,mode,最后进行配置)
//3.操作io口,输出高电平
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个名为 GPIO_InitStructure的结构体变量
/*
GPIO_InitTypeDef为一结构体变量,其中有三个类型变量, GPIO_Pin、GPIO_Speed 、GPIO_Mode
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
这其中 GPIOSpeed_TypeDef为枚举变量 ,即 GPIO_Speed只能从下面的三个中选一个
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
GPIOMode_TypeDef也是一枚举类型,即 GPIO_Mode也只能从下面的八个模式中选一个
typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
*/
//使能I/O口时钟,注意不同的I/O口使能函数不一样
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//是能GPIOB组的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//是能GPIOE组的时钟
// 配置GPIOB的模式 :配置成GPIOB.5,频率50MHz,推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //该句是将上面的信息配置到GPIOB端口,该句不能写在前面,设定好的信息才能进行配置
GPIO_SetBits(GPIOB,GPIO_Pin_5); //作用:GPIOB.5输出为高 ,与之相对应的为ResetBits输出为低
/*
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
// Check the parameters /参数核对
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));//核对端口是不是规定的端口GPIOA-GPIOG
assert_param(IS_GPIO_PIN(GPIO_Pin)); //核对 GPIO_PIN是不是规定的GPIO_Pin_0-15 (详见源代码)
GPIOx->BSRR = GPIO_Pin;
// GPIO_Pin_5对应的高电平0x0020(后两位0x20(十进制为32)对应二级制为0b010 0000)值正
//好对应的为BSRR寄存器的第六位,所以PB.5输出高电平
}
*/
// 配置GPIOE的模式 :配置成GPIOB.5,频率50MHz,推挽输出模式,和B的一样,
//所以战舰提供的省略了相同的,我这里为了便于理解没有省略
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}