标签:
- GPIOx_MODER : 模式设置 - GPIOx_OTYPER :类型设置 - GPIOx_OSPEEDR :速度选择 - GPIOx_PUPDR :上拉下拉
- GPIOx_IDR : 输入数据寄存器 - GPIOx_ODR :输出数据寄存器
- GPIOx_BSRR
- GPIOx_LCKR
- GPIOx_AFRH : 高32位 - GPIOx_AFRL :低32位
每个GPIO段都有16个引出引脚以供使用,引脚标号是Px0~Px15,这点与K60有区别
//外设的基地址
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region
//各个总线的基地址
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)
#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
#define AHB2PERIPH_BASE       (PERIPH_BASE + 0x10000000)
//AHB1外设节选
/*!< AHB1 peripherals */
#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)
#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
#define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800)
#define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00)
#define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000)
#define GPIOJ_BASE            (AHB1PERIPH_BASE + 0x2400)
#define GPIOK_BASE            (AHB1PERIPH_BASE + 0x2800)
void gpio_init(GPIOx_SELECT gpiox, GPIOx_pn_SELECT gpiox_pn,                GPIO_PULL_TYPE pull, GPIO_IO_TYPE io, GPIO_STATUS_TYPE stat, GPIO_OUTPUT_TYPE otype)
{
    GPIO_TypeDef *GPIOx;
    /* Get the GPIOx‘s GPIO_TypeDef struct */
    GPIOx = BYM_GET_GPIO_struct(gpiox);
    RCC->AHB1ENR  |= (1 << gpiox);  //Enable the clock of GPIOx
    /* Set the io type of GPIOx‘s pn */
    GPIOx->MODER  &= ~(3 << (gpiox_pn * 2));       //Clear the old register data
    GPIOx->MODER  |= (io << (gpiox_pn * 2));        //Set the mode of GPIOx‘s pn
    /* Set the io ouput type of GPIOx‘s pn */
    GPIOx->OTYPER &= ~(1 << gpiox_pn);             //Clear the old register data
    GPIOx->OTYPER |= (otype << gpiox_pn);           //Set the output type of GPIOx‘s pn
    /* Pull down or pull up or nothing for GPIOx‘s pn */
    GPIOx->PUPDR  &= ~(3 << (gpiox_pn * 2));       //Clear the old register data
    GPIOx->PUPDR  |= (pull << (gpiox_pn * 2));
    /* Only set the pin status when the ‘io‘ value is ‘BYM_GPO‘ */
    if(io == BYM_GPO)
    {
        GPIOx->ODR  &= ~(1 << gpiox_pn);
        GPIOx->ODR  |= (stat << gpiox_pn);
    }   
}
/* 
 * Get GPIO pin status
 */
uint32_t gpio_get(GPIOx_SELECT gpiox, GPIOx_pn_SELECT gpiox_pn)
{
    GPIO_TypeDef *GPIOx;
    /* Get the GPIOx‘s GPIO_TypeDef struct */
    GPIOx = BYM_GET_GPIO_struct(gpiox);
    return ((GPIOx->IDR) & (1 << gpiox_pn));
}
//枚举变量的定义
/* GPIO 段的选择枚举 */
typedef enum
{
    BYM_GPIOA, BYM_GPIOB, BYM_GPIOC, BYM_GPIOD,
    BYM_GPIOE, BYM_GPIOF, BYM_GPIOG, BYM_GPIOH,
    BYM_GPIOI, BYM_GPIOJ, BYM_GPIOK,
}GPIOx_SELECT;
/* GPIO管脚号的选择枚举 */
typedef enum
{
    BYM_Px0,    BYM_Px1,    BYM_Px2,    BYM_Px3,    BYM_Px4,    BYM_Px5,    BYM_Px6,    BYM_Px7,
    BYM_Px8,    BYM_Px9,    BYM_Px10,   BYM_Px11,   BYM_Px12,   BYM_Px13,   BYM_Px14,   BYM_Px15,
}GPIOx_pn_SELECT;
/* 上拉下拉的枚举 */
typedef enum
{
    BYM_NO_PULL,
    BYM_PULL_UP,
    BYM_PULL_DOWN,
}GPIO_PULL_TYPE;
/* 输出模式枚举 */
typedef enum
{
    BYM_PUSH_PULL,
    BYM_OPEN_DRAIN,
}GPIO_OUTPUT_TYPE;
/* IO管脚复用模式枚举 */
typedef enum
{
    BYM_GPI,    BYM_GPO,
    BYM_GPALT,  BYM_GPANA,
}GPIO_IO_TYPE;
/* 当管脚设置为输出的时候管脚状态的枚举 */
typedef enum
{
    BYM_LOW_LEVEL,
    BYM_HIGH_LEVEL,
}GPIO_STATUS_TYPE;
/* Get the GPIO‘s GPIO_TypeDef struct */
#define BYM_GET_GPIO_struct(gpiox) \
    ((GPIO_TypeDef *)(AHB1PERIPH_BASE + (gpiox * 0x400)))
AF0 system AF1 TIM1/TIM2 AF2 TIM3~TIM5 AF3 TIM8~TIM11 AF4 I2C1~I2C3 AF5 SPI1~SPI2 AF6 SPI3 AF7 USART1~USART3 AF8 USART4~USART6 AF9 CAN1/CAN2,TIM12~TIM14 AF10 OTG_FS,OTG_HS AF11 ETH AF12 FSMC,SDIO,OTG_HS(1) AF13 DCMI AF14 AF15 EVENTOUT
管脚锁存通过寄存器的一系列操作之后达到gpio管脚状态锁定,直到下一次CPU复位或者gpio管脚模块复位时才允许改变状态
操作步骤,通过向GPIOx_LCKR寄存器进行写操作来完成
WR LCKR[16] = ‘1’ + LCKR[15:0]
WR LCKR[16] = ‘0’ + LCKR[15:0]
WR LCKR[16] = ‘1’ + LCKR[15:0]
/* 上面三步是要求的操作步骤 */
RD LCKR
RD LCKR[16] = ‘1’ 
/* 上面两步是为了保证gpio管脚状态被成功的设置了 */
不同点:
- 可选的上拉下拉电阻
 - 可设置的IO频率
 - 可锁存
 - 明确的输入输出状态
 
相同点:
- 都可设置外设功能
 - 都有推挽、开漏、普通IO口三种模式
 
标签:
原文地址:http://blog.csdn.net/u013904227/article/details/51336593