概述

本文分析总结STM32 GPIO特点、编程方法。

关于GPIO可以参考Reference manual中GPIO章节或者《AN4899 STM32 microcontroller GPIO configuration for hardware settings and low-power consumption》。

内存映射

GPIOx_REG,其中x = A to H, Piny= 0 … 15。

STM32:

typedef struct
{__IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */__IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */__IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */__IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */__IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */__IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */__IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */__IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */__IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;

S32K1:

/** GPIO - Register Layout Typedef */
typedef struct {__IO uint32_t PDOR;           /**< Port Data Output Register, offset: 0x0 */__O  uint32_t PSOR;           /**< Port Set Output Register, offset: 0x4 */__O  uint32_t PCOR;           /**< Port Clear Output Register, offset: 0x8 */__O  uint32_t PTOR;           /**< Port Toggle Output Register, offset: 0xC */__I  uint32_t PDIR;           /**< Port Data Input Register, offset: 0x10 */__IO uint32_t PDDR;           /**< Port Data Direction Register, offset: 0x14 */__IO uint32_t PIDR;           /**< Port Input Disable Register, offset: 0x18 */
} GPIO_Type, *GPIO_MemMapPtr;

不同于NXP S32K1 MCU,复用功能在PORT、SIM等模块中指定,GPIO只是单纯的完成GPIO功能,STM32的GPIO寄存器组中还具有指定复用功能的AFR寄存器,指定上下拉等功能。

HAL GPIO

/* Initialization and de-initialization functions *****************************/
void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
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);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

STM32CubeMX中配置的引脚,调用HAL_GPIO_Init完成初始化,比如CAN引脚,则是在HAL_CAN_MspInit中调用HAL_GPIO_Init进行引脚初始化,其再被HAL_CAN_Init调用,再上被MX_CAN1_Init调用。

硬件特性

  • 每组多大16个IO
  • 输出状态:push-pull或者open drain + pull-up/down
  • 输出数据:GPIOx_ODR或者复用的外设功能
  • 每个IO可选择速度
  • 输入状态:floating, pull-up/down, analog
  • 输入数据:GPIOx_IDR或者复用的外设功能
  • 通过设置GPIOx_BSRR来设置清楚GPIOx_ODR
  • 通过GPIOx_LCKR提供冻结IO配置的锁定机制
  • 模拟功能,此时上下拉失能
  • 每个IO通过AFR选择复用功能,AFRL (for pin 0 to 7) 、AFRH (for pin 8 to 15),复用功能可以推挽带上下拉或者开漏带上下拉能力
  • 快速翻转再两个时钟周期内
    寄存器必须32位字访问,上电复位起来后,复用功能未被激活,引脚被设置成浮空输入模式,除了debug pins:
    • PA15: JTDI in pull-up
    • PA14: JTCK/SWCLK in pull-down
    • PA13: JTMS/SWDAT in pull-up
    • PB4: NJTRST in pull-up
    • PB3: JTDO in floating state [F4 Only, F1未指明]
    当配置为输出后,写入到GPIOx_ODR的值将出现在引脚上,GPIOx_IDR每APB2 [F1]、AHB1[F4]时钟周期捕获IO口上的值。每个GPIO都有内部弱上拉。中断功能需要在EXIT模块中配置。

对于COMS输入:VIHmin ~ 2 / 3 VDD and VILmax ~ 1 / 3 VDD.
对于TTL输入: VIHmin = 2V and VILmax = 0.8 V.
引脚最大吸收电流为25 mA。
每个GPIO电气特性被定义为三种:three-volt tolerant, five-volt tolerant, and also three-volt capable.
Tolerance代表GPIO可以承受这么大电压,capable代表可以输出这么大电压。
STM32可与5V的IIC TTL UART链接。

避免不使用引脚浮空输入,可以上拉或者下拉,考虑到ESD,可以上拉输出为低电平。VBAT GPIO pin允许接后备电池到后备域,此时大多数引脚shut down。
软件上可以将未使用的引脚配置为模拟输入,这将节省input Schmitt trigger消耗。长时间不用可通过HAL_RCC_GPIOx_CLK_DISABLE()关时钟。

结语

了解更多,请访问:
STM32专栏 https://blog.csdn.net/kinetis_linux/category_11592269.html
S32K1专栏 https://blog.csdn.net/kinetis_linux/category_11543275.html?spm=1001.2014.3001.5482
C++开发MCU专栏 https://blog.csdn.net/kinetis_linux/category_11548458.html

【2022年的STM32】 04-GPIO特性、使用及与NXP GPIO比较相关推荐

  1. keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)

    [朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...

  2. STM32单片机初学者编程之常用小程序--GPIO配置延时函数

    声明:本专题系列的博文主要是用于个人学习以及后续查阅调用,由于是这方面的初学者,所以写的比较浅陋,有喜欢的朋友可以一起学习,编程大神们请略过...... 1.以一个GPIO的初始化程序为例,以下是GP ...

  3. 【北邮果园微处理器设计】gpio.c 应用解读(附gpio.c源码)

    该工具类为北邮-国院-电信工程及管理专业(物联网工程)-通信方向-大三课程-微处理器设计(Microprocessor System Design)- Lab 2内英方给的Driver类 gpio.c ...

  4. linux的gpio设备,Linux 4.x之Gpio分析(一)Gpiolib库1

    下面的内容均在imx6平台上举例,这一次分析希望将整个GPIO子系统的所有细节整理清晰. 第一篇从gpiolib入手,后面的边分析边写. 开始之前给自己提几个问题 驱动开发中的GPIO API 究竟是 ...

  5. 官宣!等你来赛,2022 第二届 STM32 Hackathon 挑战赛海选开放报名!

    2022,我们将迎来 第二届 STM32 Hackathon 24小时挑战赛 挑战赛制及开发平台 全面升级 4款高性能开发平台供选择 STM32 峰会现场24小时疯狂开发 ST一线专家指导及点评 参与 ...

  6. STM32的I2C特性及架构

    软件模拟协议:使用CPU直接控制通讯引脚(GPIO)的电平,产生出符合通讯协议标准的逻辑. 硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要 ...

  7. STM32第二课(cubemx,clk,gpio,)

    cubemx用来生成platform. ++++++++++++++++++++++++++ 复制IOC工程. 新建一个文件夹,将需要的IOC文件拷贝到新建的文件夹中. 修改IOC文件的名称, 然后用 ...

  8. GeekPro 2022安装 win10+ubuntu20.04.4双系统

    参考链接: 1.Win11+Ubuntu20.04双系统安装教程_Jason.WuT的博客-CSDN博客_win11+ubuntu双系统 2.Windows 和 Ubuntu 双系统从安装到卸载_哔哩 ...

  9. UBUNTU12.04系统特性

    Ubuntu Server 12.04 的新特性一览表 中文科技资讯: Ubuntu 12.04 (代号为 Precise Pangolin) 版本主要侧重于发布.稳定性和质量.Ubuntu 12.0 ...

最新文章

  1. feng作品推荐あかね色に染まる坂 染成茜色的坂道 (含下载、攻略)
  2. ie-css3.htc参数无效,ie-css3.htc怎么用?
  3. ConcurrentHashMap的源码分析-addCount
  4. iOS开发学无止境 - NSFileManager文件操作的十个小功能
  5. 关于指针释放的小领悟
  6. 网站去色的通用方法(简单)
  7. go和python对比的优缺点_Python与Golang对比
  8. poj 3468 A Simple Problem with Integers 基础线段树
  9. 实验吧——Recursive
  10. php面向对象精要(3)
  11. 账龄分析表excel模板_这种高端表格模板你会做吗?Excel制作带照片的员工信息查询表...
  12. 五款APP让你告别拖延症!余生愿你活成自己想要的样子
  13. 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(上)
  14. 电脑上有什么类似全能扫描王的软件?这4款扫描app1分钟帮你搞定几十张图片
  15. (二十一) Sed编辑器高级部分
  16. PVE下的黑群晖的其他后续设置
  17. LeetCode 39 组合总和
  18. MySQL自学笔记详细版(从安装到入门)
  19. Java基础教程:k8s快速入门
  20. freeBSD镜像下载和主要的更新查询

热门文章

  1. 分词工具比较及使用(ansj、hanlp、jieba)
  2. pap.er - Mac必备5K壁纸下载软件
  3. H5游戏引擎为什么选择egret和怎么学习egret
  4. 7张图大总结:SQL 数据分析常用语句!
  5. python写入文件后读取空白,写入文件无法读取解决方案
  6. QT编写的学生管理系统
  7. ecmall php传变量,PHP_ECMall支持SSL连接邮件服务器的配置方法详解,首先,主要是ecmall使用的phpmail - phpStudy...
  8. 代码太多不要怕,分享一个阅读代码的神器
  9. 电工技术(7)—正弦量的向量表示法
  10. Spring Boot干货系列:(十二)Spring Boot使用单元测试 | 嘟嘟独立博客