实现目标
1、掌握GPIO 输出模式控制
2、学会STM32CubeMX软件配置GPIO
3、具体目标:1、开发板4个LED实现流水灯;2、开发板4个LED实现跑马灯灯。
一、STM32 GPIO 概述
1、GPIO定义
GPIO(General-purpose input/output)是通用输入输出端口的英文简写,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
STM32单片机的GPIO被分为很多组,每组有16个引脚,不同型号的MCU的GPIO个数是不同的,比如STM32F103C6T6只有PA、PB以及个别PC引脚而STM32F103ZET6拥有PA~PG的全部112个引脚。所有的GPIO都有基本的输入输出功能,同时GPIO还可以作为其它的外设功能引脚。
STM32的大部分引脚除了当GPIO使用之外,还可以复用为外设功能引脚(比如串口、PWM、ADC等)。
2、GPIO硬件结构框图
关键器件解析:
1、保护二极管:防止I/O引脚外部过高、过低的电压输入,当引脚电压高于VDDIOx时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
2、开关:开关为TTL肖特基触发器,将模拟信号转化为0和1的数字信号,但当GPIO作为ADC采集电压通道时,此时信号不再经过触发器进行TTL电平转换。
3、P-MOS、N-MOS:单元电路使得GPIO具有“推挽输出”和“开漏输出”的功能。
3、GPIO工作模式
STM32的GPIO共有8种工作模式:输入模式的模拟输入、上拉输入、下拉输入和浮空输入以及输出模式的推挽输出、开漏输出、推挽复用输出和开漏复用输出。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。
GPIO_Mode_AIN // 模拟输入
GPIO_Mode_IN_FLOATING // 浮空输入
GPIO_Mode_IPD // 下拉输入
GPIO_Mode_IPU // 上拉输入
GPIO_Mode_Out_OD // 开漏输出
GPIO_Mode_Out_PP // 推挽输出
GPIO_Mode_AF_OD // 复用开漏输出
GPIO_Mode_AF_PP // 复用推挽输出
4、GPIO每种工作模式的应用方式
二、原理图设计
说明:四个LED都是低电平点亮。开发板上管脚对应LED1--PB9,LED2--PB8,LED3--PB5,LED4--PB4.
三、STM32CubeMX 配置
1.4个LED配置
配置1:(1)上电初始电平为 High ,LED先不点亮;(2) 4个LED配置为推挽输出模式(OutPut Push Pull );(3)不需要上拉,下拉;(4)输出速度为Low 2MHz; (5)设置管脚标号 LED1--LED4
四、主要函数说明
1、GPIO外设库的文件:
stm32f10xx_hal_gpio.h、
stm32f10xx_hal_gpio.c
2、操作GPIO常用HAL库函数
(1)功能:读取一个引脚的电平。
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
(2)功能:写一个引脚的电平,可写高电平,也可以是低电平。
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
(3)功能:翻转一个引脚的电平
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
五、程序设计
1、流水灯
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET); //LED1亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET); //LED2亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET); //LED3亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_RESET); //LED4亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED4_Pin|LED3_Pin|LED2_Pin|LED1_Pin, GPIO_PIN_SET);//关闭4个灯
HAL_Delay(200); //延时200m
2、跑马灯
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET); //LED1亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET); //LED1灭
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_RESET); //LED2亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED2_Pin, GPIO_PIN_SET); //LED2灭
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_RESET); //LED3亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED3_Pin, GPIO_PIN_SET); //LED3灭
HAL_GPIO_WritePin(GPIOB, LED4_Pin, GPIO_PIN_RESET); //LED4亮
HAL_Delay(200); //延时200m
HAL_GPIO_WritePin(GPIOB, LED4_Pin|LED3_Pin|LED2_Pin|LED1_Pin, GPIO_PIN_SET);//关闭4个灯
HAL_Delay(200); //延时200m