void LED_Init(void)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能PA端口时钟
(RCC时钟你可以先不用看)
GPIO的库函数
库函数中主要用到的有如下:
GPIO_Init
GPIO_StructInit
GPIO_SetBit
GPIO_ResetBit 其他的根据需要在用!
函数 GPIO_Init
这个是设置为0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8输出高
GPIO配置
LED0=0; // 使用了位带操作GPIO_ResetBits(GPIOA,GPIO_Pin_8);
#define LED0 PAout(8) //PA8
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
位操作
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
跟你讲一下寄存器怎么看?
下面这个表很重要,必须看懂!
GPIO寄存器描述
端口配置低寄存器(GPIOx_CRL) (x=A..E)
端口配置高寄存器(GPIOx_CRH) (x=A..E)
注意MODE[1:0]>00为输出模式,GPIO_Mode_AIN = 0x0,
举例子
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Mode_Out_PP = 0x10, PA8的
速率
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \
((SPEED) == GPIO_Speed_50MHz))
方式
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;
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \
((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \
((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
端口输入数据寄存器(GPIOx_IDR) (x=A..E)
端口输出数据寄存器(GPIOx_ODR) (x=A..E)
端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)
端口位清除寄存器(GPIOx_BRR) (x=A..E)