标签:
- 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