9.3.1 外设寄存器结构体定义
#define _IO volatile
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
//GPIO寄存器结构体定义
typedef struct
{
_IO uint32_t CRL;
_IO uint32_t CRH;
_IO uint32_t IDR;
_IO uint32_t ODR;
_IO uint32_t BSRR;
_IO uint32_t BRR;
_IO uint32_t LCKR;
} GPIO_TypeDef;
9.3.2 外设存储器映射
#define PERIPH_BASE ((unsigned int) 0x4000 0000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE, GPIOA_BASE, GPIOB_BASE...GPIOG_BASE, RCC_BASE,
9.3.3 外设声明
#define GPIOA ((GPIO_TypeDde *) GPIOA_BASE)...GPIOB/C/D/E/F/G
#define RCC ((RCC_TypeDde *) RCC_BASE)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18
)
原程序被改写为:
RCC->APB2ENR |=(1<<3);
GPIOB->CRL &= ~(0x0F << (4*0));
GPIOB->CRL |= (1 << (4*0));
GPIOB->ODR |= (0<<0);
9.3.4定义位操作函数
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BSRR =GPIO_Pin;
}
void GPIO_ResetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BSRR =GPIO_Pin;
}
把表示16个引脚的操作数都定义成宏:
#define GPIO_Pin_0 ((uint16_t)0x001 )
#define GPIO_Pin_15 ((uint16_t)0x8000)
#define GPIO_Pin_All ((uint16_t)0xFFFF)
Set”表示“置位”,即高电平,“Reset”表示“复位”,即低电平
控制GPIOB的引脚10输出高电平
GPIO_SetBits(GPIOB, GPIO_Pin_10))
9.3.5定义初始化结构体GPIO_InitTypeDef
typedef struct
{
uint16_t GPIO_Pin;
uint16_t GPIO_Speed;
uint16_t GPIO_Mode;
}GPIO_InitTypeDef;
9.3.6定义引脚模式的枚举类型
typedef enum
{
GPIO_Speed_10MHz =1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz,
} GPIOSpeed_TypeDef;
typedef enum
{
GPIO_Mode_AIN= 0x0, //模拟输入,浮空输入,推挽输出等8种模式
} GPIOMode_TypeDef;
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
给GPIO_InitTypeDef初始化结构体赋值范例:
//选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//设置引脚模式为输出模式推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置引脚的速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
9.3.7定义GPIO初始化函数
9.3.8全新面貌,使用函数点亮LED灯
int main(void)
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2ENR |= (1<<3);
//选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//设置引脚模式为输出模式推 挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置引脚速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIO引脚
GPIO_Init(GPIOB,&GPIO_InitStructure);
//使引脚输出低电平,点亮LED1
GPIO_ResetBits(GPOIB,GPIO_Pin_0);
//一直执行亮-灭-亮-灭
while(1)
{
GPIO_ResetBits(GPOIB,GPIO_Pin_0);
Delay(0xFFFF);
GPIO_SetBits(GPOIB,GPIO_Pin_0);
Delay(0xFFFF);
}
}