背景

在上一讲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. 对C语言符号的一些冷门知识运用的剖析和总结

    符号 目录 符号 注释 奇怪的注释 C风格的注释无法嵌套 一些特殊的注释 注释的规则建议 反斜杠'\' 反斜杠有续行的作用,但要注意续行后不能添加空格 回车也能起到换行的作用,那续行符的意义在哪? 反 ...

  2. 记录——Qt Qcreator 顶部菜单栏的隐藏与恢复

    问题 我有一个朋友(嗯~无中生友),手残点击了 QCreator 中视图下的这个玩意儿: 当人的眼神不好时,可能不会看到这些快捷键以及无视这些弹窗. 解决方案 快捷键 ctrl + alt + M 可 ...

  3. 远程协助软件哪个好,IT远程支持用什么软件

    软件行业做售后支持,有时候需要远程控制客户电脑以实现远程协助,远程解决客户问题. IT远程支持用什么软件比较好?这个我们可以逐个分析下. 一.QQ远程 一看就不专业,的确也不专业.QQ远程协助可以实现 ...

  4. Docker 必知必会3----使用自己制作的镜像

    前面的两篇文章分别讲了,docker的基础概念,设计思路以及docker的基本操作.感兴趣的同学可以查阅: https://www.cnblogs.com/jilodream/p/18177695ht ...

  5. 【漏洞复现】蓝凌OA sysUiComponent 任意文件上传漏洞

    阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站.服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作.利用此文所提供的信息而造成的直接 ...

  6. Istio(三):服务网格istio可观察性:Prometheus,Grafana,Zipkin,Kiali

    目录 一.模块概览 二.系统环境 三.可观察性 四.指标 4.1 代理级指标 4.2 服务级指标 4.3 控制平面度量 五.Prometheus 5.1 安装Prometheus 5.2 部署示例应用 ...

  7. 设置MySQL数据库的远程连接权限

    解决方案 在服务器上登录数据库,然后执行如下授权SQL语句.该授权SQL语句的含义为root用户可用任何IP地址登录数据库,操作任何数据库中的任何对象.   GRANT ALL PRIVILEGES ...

  8. RuoYi(若依)前后端分离版本,windows下部署(nginx)

    摘自:https://blog.csdn.net/yueyekkx/article/details/105505490 上一篇用了tomcat部署(https://blog.csdn.net/yuey ...

  9. Qt-FFmpeg开发-打开本地摄像头(6)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头[软解码+ OpenGL显示YUV] 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-打开本地摄像头[软解码+ Open ...

  10. NOIP模拟49

    虚伪的眼泪,会伤害别人,虚伪的笑容,会伤害自己. 前言 暑假集训过后的第一次考试,成绩一般,没啥好说的 T1 Reverse 解题思路 看到这个题的第一眼就感觉是最短路,毕竟题目的样子就好像之前做过的 ...