1. GPIO例程简述(熟悉API)
CubeMX初始化会自动包含,对手敲HAL感兴趣的同学可以熟悉下生成的代码框架学习哦~
1.1 配置GPIO引脚的模式和参数
c
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 输出模式
GPIO_InitStructure.Pull = GPIO_NOPULL; // 不使用内部上下拉电阻
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; // 低速
GPIO_InitStructure.Pin = GPIO_PIN_13; // 配置的引脚
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC外设
1.2 设置GPIO引脚的电平
c
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 设置引脚为高电平
1.3 读取GPIO引脚的电平
c
// 判断引脚是否为高电平
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET)
{
// 做一些操作...
}
1.4 GPIO应用示例代码
下面是一个简单的示例, 忽略了其他的初始化代码, 只说明如何使用HAL库配置一个GPIO引脚并控制其电平:
c
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化GPIOC外设
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStructure.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置GPIO引脚
GPIO_Config();
// 此处范例为500ms翻转一次PC13,对应炸鸡板的用户灯引脚,效果为闪光灯。
while (1)
{
// 设置引脚为高电平
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
// 延时一段时间
HAL_Delay(500);
// 设置引脚为低电平
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
// 延时一段时间
HAL_Delay(500);
}
}
2. GPIO扩展知识(可暂时跳过)
GPIO output level:
只有当引脚设置为“GPIO output”时才需要设置
参数 | 介绍 |
---|---|
High | GPIO输出初始化为高电平 |
Low | GPIO输出初始化为低电平 |
- GPIO mode
参数 | 介绍 |
---|---|
Output Push Pull | 推挽输出,能输出高低电平,且高低电平都有驱动能力 |
Output Open Drain | 开漏输出,只能输出低电平,需要借助外部上拉电阻才能输出高电平 |
Analog mode | 模拟输入,ADC采样信号输入引脚的配置模式 |
Alternate Function Push Pull | 推挽式复用功能 |
Input mode | 输入模式,配合No pull-up/pull-down可形成GPIO_Mpde_IN_FLOATING、GPIO_Mode_IPD、GPIO_Mode_IPU等不同工作模式 |
- GPIO Pull-up/Pul-down
参数 | 介绍 |
---|---|
No pull-up/pull-down | 无内部上拉或下拉 |
Pull-up | 内部上拉 |
Pull-down | 内部下拉 |
- Maximum output speed
参数 | 介绍 |
---|---|
Low | 低速 “GPIO_Speed_2MHz” |
Medium | 中速 “GPIO_Speed_10MHz” |
High | 高速 “GPIO_Speed_50MHz” |
3 课后作业
请完成:
- 文档中所述的工程创建和GPIO操作LED实现:亮、灭、亮、灭 的循环效果.
- 实现亮度可以调整的LED灯(跟后续PWM章节有关, 先试试用GPIO和延时实现).