背景

在上一讲STM32 CubeMX 学习:搭建开发环境中,我们已经利用CubeMx搭建了可编译的工程。

今天就开始来介绍STM32 GPIO的有关知识,以及如何驱动它。

HOST-OS : Windows-10

STM32 Cube :v5.6

MCU : STM32F429

LIB : stm32cube_fw_f4_v1250

知识

在STM32中,GPIO可以被用作:

  • 中断源(GPIO_MODE_IT)和事件源(GPIO_MODE_EVT)
  • 接收模拟量(GPIO_MODE_ANALOG)
  • 复用I/O,(比如可以被作为串口模块使用,要用GPIO_MODE_AF_x来设置)
  • 设置输入或者输出

当作为输入或者输出时,GPIO有这些属性:输入输出方向;也可以设置速度,上下拉,推挽开漏等电器特性。

Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h中有关于 GPIO属性的 定义。

/**
* @brief GPIO Init structure definition
*/
typedef struct
{
uint32_t Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */ uint32_t Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIO_mode_define */ uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
This parameter can be a value of @ref GPIO_pull_define */ uint32_t Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIO_speed_define */ uint32_t Alternate; /*!< Peripheral to be connected to the selected pins.
This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;

Pin : 指定的引脚号,右值表达式可以是 GPIO_PIN_0 ~ GPIO_PIN_15, GPIO_PIN_All 任意相或

Mode: 引脚的模式(作为中断时还有更多的选项)

  • GPIO_MODE_INPUT       浮空输入模式:电平状态取决于GPIO外部的电平状态;若在GPIO外部的引脚悬空时,读取结果是不确定的。
  • GPIO_MODE_OUTPUT_PP    推挽(Pull)输出模式(输出较大电流):推拉输出 既提高电路的负载能力,又提高开关速度。
  • GPIO_MODE_OUTPUT_OD    开漏(Drain)输出模式(一般外接上拉电阻,如果外部不接上拉电阻只能输出低电平),可用于不同电压的系统之间的通信
  • GPIO_MODE_AF_PP       复用推挽输出模式
  • GPIO_MODE_OUTPUT_OD    复用开漏输出模式
  • GPIO_MODE_ANALOG      复用模拟输入输出模式(ADC/DAC专用)

Pull:上/下拉模式

  • GPIO_NOPULL   无(针对输出模式)
  • GPIO_PULLUP   上拉输入(针对输入模式)
  • GPIO_PULLDOWN 下拉输入(针对输入模式)

假设有一个GPIO口接到了 一个按键的一端,在此时:

  • 如果按键的右端接正电源,那么就要 为 GPIO_PULLDOWN(下拉模式),因为这样才能使得按键按下去的时候,能把I / O脚拉高,否则按键的功能等于摆设。
  • 同理,如果按键另一端接地,我们就要设置为GPIO_PULLUP(上拉模式)了。

Speed:IO口速率(I/O口驱动电路的响应速度)

当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,通过选择速度来选择不同的驱动电路,达到最佳的噪声控制和降低功耗的目的。(高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。)

STM32F429的端口输出速率为括号内容:

  • GPIO_SPEED_LOW;    (2)   2MHz注意:
  • GPIO_SPEED_MEDIUM;  (25)  12.5MHz ~ 50MHz
  • GPIO_SPEED_FAST;   (50)  25MHz ~ 100 MHz
  • GPIO_SPEED_HIGH;   (100)  50MHz ~ 200MHz

Alternate:复用功能

本节课不讲。

CubeMx对GPIO的配置

注意,使用GPIO之前需要配置相应的时钟。当配置了引脚而显示了RCC,证明需要RCC没有配置好。

1)在Pinout& Confiurgation页的Pinout view中,点击引脚,设置为GPIO_InputGPIO_Output

2)点击左栏的GPIO,选择配置的引脚,在界面下方中部靠左的位置可以看到 类似PF4 Configuration这一栏,根据引脚输入输出类型的不同,有这些选项

  • GPIO output level(初始化输出电平)
  • GPIO mode(模式)
  • GPIO Pull-up/Pull-down(上下拉)
  • Maximum output speed (输出响应速度)
  • User Label(用户标签): 可以标记这个引脚是做什么用的,提高可读性。

3)点击右上角的GENERATE CODE生成工程

4)使用外部的工具链编译工程,确保没有问题。

代码分析

我们看关键函数

初始化


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
} /**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_SET); /*Configure GPIO pin : PF0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*Configure GPIO pin : PF4 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*Configure GPIO pin : PF5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); }

读写有关api

读取引脚


GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
返回值: GPIO_PIN_SET(1) 或者 GPIO_PIN_RESET(0) 参数:
GPIOx : 端口,可以是 GPIOA ~ GPIOK
GPIO_Pin:引脚,可以是 GPIO_PIN_0 ~ GPIO_PIN_15 范例:
// 将 GPIOF 的 Pin5 设置为 低电平
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET);

设置引脚

    // 设置
  void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); // 翻转引脚电平
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin); 参数:
GPIOx : 端口,可以是 GPIOA ~ GPIOK
GPIO_Pin:引脚,可以是 GPIO_PIN_0 ~ GPIO_PIN_15, GPIO_PIN_All 任意相或
PinState:电平状态, GPIO_PIN_SET(1) 或者 GPIO_PIN_RESET(0)

STM32 CubeMX 学习:001-GPIO的使用的更多相关文章

  1. cubemx+stm32串口学习汇总资料

    这篇文章是串口中断的文章--STM32基于CubeMX的高速串口收发程序(中断模式)比较有帮助. http://www.stmcu.org.cn/module/forum/thread-616613- ...

  2. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

  3. 【转载-Andrew_qian】stm32中断学习

    [转载]stm32中断学习 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大 ...

  4. stm32串口学习笔记

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  5. STM32 FSMC学习笔记+补充(LCD的FSMC配置)

    STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD

  6. 02-JZ2440裸机学习之GPIO实验【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/54910717 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  7. 基于STM32的学习型通用红外遥控设备的设计实现(三)

    CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 http://blo ...

  8. STM32 CubeMx使用教程

    一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以 ...

  9. STM32学习笔记——GPIO

    单片机型号STM32F407VET6. 概述 GPIO的分类: 可接受5V输入的(FT),绝大多数引脚都是: 只能接受3.3V输入的(TTa),只有PA4和PA5,就是DAC输出的两个引脚: 其他,包 ...

  10. 【转载】stm32中断学习

    中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加 ...

随机推荐

  1. 003_Orcad菜单讲解与偏好设置

    003_Orcad菜单讲解与偏好设置 菜单栏用的比较多的是File和Options项. 网格建议用lines,比较方便对齐. Auto Reference和Intertool Commuication ...

  2. 老外为了在MacBook上玩原神,让M1支持了所有iOS应用 | Github每周精彩分享第一期

    大家好,这里是每周更新的Github有趣项目分享,我是每周都在吃瓜的蛮三刀酱. 我会从Github热门榜里选出 高质量.有趣,牛B 的开源项目进行分享. 废话不多说,看看最近有什么有意思的Github ...

  3. Solution Set - SAM

    讲解一些 SAM 经典的应用.可以结合 字 符 串 全 家 桶 中 SAM 的部分食用. 洛谷P2408 求不同子串个数.在 SAM 中,所有结点是一个等价类,包含的字符串互不相同.结点 \(u\) ...

  4. 十、Doris操作参考手册

    1.SQL参考 1.1  用户账户管理 1.2  集群管理 1.3  DDL 1.4  DML 2.函数参考 2.1  日期函数 2.2  字符串函数 2.3  聚合函数 2.4  Cast转换函数 ...

  5. 跟羽夏学 Ghidra ——简述

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  6. linux开发vue项目,不能热更新?

    只需要运行下面的命令即可: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo ...

  7. linux sftp连接报错:JSchException: Algorithm negotiation fail解决方案

    问题描述 我们用jsch包进行ssh登录的时候会报这个错误: com.jcraft.jsch.JSchException: Algorithm negotiation fail at com.jcra ...

  8. 记一次 .NET某酒店后台服务 卡死分析

    一:背景 1. 讲故事 停了一个月没有更新文章了,主要是忙于写 C#内功修炼系列的PPT,现在基本上接近尾声,可以回头继续更新这段时间分析dump的一些事故报告,有朋友微信上找到我,说他们的系统出现了 ...

  9. Python Pandas 数据分组

    在数据处理中,分箱.分组是一种常见的技术,用于将连续数据的间隔分组到"箱"或"桶"中.我们将讨论以下两种方法: 使用 Pandas 的 between 和 lo ...

  10. MySQL知识网络

    MySQL知识网络 引擎 InnoDB 支持表锁 .行锁 支持事务 *.frm 表结构文件 *.idb 表数据和索引文件 MyISAM 支持表锁 *.frm 表结构文件 *.MYD 表数据文件 *.M ...