一,GPIO知识回顾
1,四种输入模式:
输入浮空
输入上拉
输入下拉
模拟输入
2,四种输出模式:
开漏复用输出
推挽输出
推挽复用输出
3,三种最大输出速度
2MHz
10MHz
50MHz
每组GPIO共16个IO口,含下7个寄存器
GPIOx_CRL : 端口配置低寄存器
GPIOx_CRH : 端口配置高寄存器
GPIOx_IDR : 端口输入寄存器
GPIOx_ODR : 端口输出寄存器
GPIOx_BSRR : 端口位设置/清除寄存器
GPIOx_BRR : 端口位清除寄存器
GPIOx_LCKR : 端口配置锁存寄存器
二,LED硬件连接:
LED0连接PB5引脚
LED1连接PE5引脚
三,LED跑马灯实现流程
1,使能GPIO时钟
使用IO口前先要使能相应的GPIO时钟
2,初始化IO口 GPIO_Init()
配置IO口的引脚工作方式(最大速度,输入/输出模式)
3,操作IO口输出高低电平
控制响应IO口输出高电平或低电平
四,源码分析
1,GPIO初始化函数
stm32f10x_gpio.h头文件中找到GPIO_Init函数声明
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
1
stm32f10x_gpio.c中找到GPIO_Init函数的实现
/**
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO peripheral.
* @retval None
*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
/*---------------------------- GPIO CRL Configuration ------------------------*/
/* Configure the eight low port pins */
if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
{
tmpreg = GPIOx->CRL;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if (currentpin == pos)
{
pos = pinpos << 2;
/* Clear the corresponding low control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}
}
}
}
GPIOx->CRL = tmpreg;
}
/*---------------------------- GPIO CRH Configuration ------------------------*/
/* Configure the eight high port pins */
if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
{
tmpreg = GPIOx->CRH;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = (((uint32_t)0x01) << (pinpos + 0x08));
/* Get the port pins position */
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
if (currentpin == pos)
{
pos = pinpos << 2;
/* Clear the corresponding high control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
}
}
GPIOx->CRH = tmpreg;
}
}
GPIO_Init函数两个入参为GPIO_TypeDef和GPIO_InitTypeDef两个结构体指针
GPIO_TypeDef参数:
stm32f10x.h中找到GPIO_TypeDef结构体声明
/**
* @brief General Purpose I/O
* 定义了GPIO的7个寄存器
*/
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;
GPIO_TypeDef有效性判断:
/** @defgroup GPIO_Exported_Types
* GPIOA->GPIOG
*/
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||
((PERIPH) == GPIOB) ||
((PERIPH) == GPIOC) ||
((PERIPH) == GPIOD) ||
((PERIPH) == GPIOE) ||
((PERIPH) == GPIOF) ||
((PERIPH) == GPIOG))
GPIO_InitTypeDef参数:
stm32f10x_gpio.h中找到GPIO_InitTypeDef结构体声明
/**
* @brief GPIO Init structure definition
* GPIO_InitTypeDef结构体-设置IO口,速度,工作模式
*/
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
GPIO_InitStruct->GPIO_Speed有效性校验
/**
* @brief Output Maximum frequency selection
*/
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))
GPIO_InitStruct->GPIO_Mode有效性校验
/**
* @brief Configuration Mode enumeration
* 八种输入/输出模式
*/
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_PP) ||
((MODE) == GPIO_Mode_AF_OD) ||
((MODE) == GPIO_Mode_AF_PP))
GPIO_InitStruct->GPIO_Pin有效性校验
/** @defgroup GPIO_pins_define
* GPIO_Pin_0->GPIO_Pin_15
*/
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
上一篇:新建工程模板-库函数
下一篇:STM32 SysTick定时器和delay延迟函数
设计资源 培训 开发板 精华推荐
- Bus Pirate 5 :开源串口,SPI,I2C和1-Wire开发工具
- 使用具有 PowerPath 和 2A 输入限制的 LTC4162IUFD-L42 9V 至 35V、2 节、3.2A 充电器的典型应用
- 具有串行接口的 LTC2381-16、16 位、250ksps、低功耗 SAR ADC 的典型应用
- LT3825 演示板,具有同步整流功能的隔离式反激式转换器
- HV816DB3,高亮度 16.5 英寸 2 EL 灯驱动器演示板
- LTC6261HS6 230 uA 电源电流运算放大器的典型应用
- 使用 Analog Devices 的 REF198GRUZ-REEL 的参考设计
- REF194 精密微功率、低压差电压基准的典型应用
- DC2154A,LTM8056 演示板,降压-升压模块稳压器,7V = VIN = 58V,VOUT = 24V at 3A
- MIC4605-1YM EV,具有单 PWM 输入的 MIC4605-1YM 半桥 MOSFET 驱动器的评估板