背景

在上一讲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. [Python急救站]人脸识别技术练习

    这段时间做了一个用于初学者学习人脸识别系统的程序,在上代码时,先给说说事前准备: 首先我们需要一个OpenCV的一个haarcascade_frontalface_default.xml文件,只要去G ...

  2. CRAPS赌博小游戏

    游戏规则 代码实现 首先把这个规则用代码写出来 再在它基础上进行简单的可视化(主要是利用Easygui的界面) 最后查缺补漏,看看有没有什么Bug 利用pyinstaller -F -w -i xx. ...

  3. Spring学习一(依赖注入/Bean/注解等)

    1.Spring依赖注入的方式. 2.依赖注入的类型 3.Bean的作用域 4.自动注入 5.使用注解的方式 6.在spring配置文件中引入属性文件 1.Spring依赖注入的方式 平常的java开 ...

  4. python3使用dpkt生成PCMA格式rtp流

    操作系统 :CentOS 7.6_x64 Python版本:3.9.12 dpkt版本:1.9.8 PCMA编码是VoIP通信中常见的格式,今天整理下CentOS7环境下,python3如何使用dpk ...

  5. sql计算列中并非零值的平均值

    avg不考虑空值 AVG (NULLIF(Value, 0)) NULLIF(expression, expression) 如果两个 expression 相等,则返回 NULL,该 NULL 为第 ...

  6. 简说Python之flask初体验

    目录 flask初体验 1.安装Flask 2.创建"Hello, World" Flask应用 3.执行结果 flask是python web的轻量框架,简单的几条命令就可以创建 ...

  7. 基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用

    安装负载均衡metalb 安装metalb kubectl create namespace metallb-system 配置metalb #kubectl create secret generi ...

  8. go高并发之路——缓存穿透、缓存雪崩

    缓存击穿.缓存穿透.缓存雪崩是使用Redis的三个经典问题,上篇文章讲了缓存击穿,今天就讲下剩下的两个问题. 一.缓存穿透 定义:缓存穿透是指查询一个根本不存在的数据,缓存层和DB层都不会命中.这样缓 ...

  9. BigDecimal类的基本使用

    概述 java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的 ...

  10. vue3+vant 引入Dialog Toast都会失败报错not defined

    今天在封装vant组件的时候,刚好要用到toast提示信息的组件,索性就按照官网提供的引入方法进行正常的引入,嘿,好家伙,一顿操作下来后发现竟然报Toast未定义,这就纳闷了,明明步骤都是对的啊,所以 ...