STM32学习笔记

一、GPIO简介

中文名称:通用输入输出。

作用:外界向芯片内部输入信号和芯片向外输出信号。是芯片和外界进行数据交流的唯一通道。

二、STM32下的GPIO

2.1、STM32中的GPIO的功能:

在STM32中GPIO有四种功能:

  1. 输入功能:信号从外界输入到芯片内部,输入信号是数字量信号。用于芯片检测外围电路的电平状态。
  2. 输出功能:信号从芯片内部输出到外界,输出信号是数字量信号。用于芯片影响控制外围电路工作。
  3. 复用功能:芯片上集成了很多的片上外设,用于实现某些特定功能,这些功能在实现过程中,也需要使用GPIO,此时有片上外设直接控制GPIO输入输出高电平电平。CPU只需要告诉片上外设要做什么事,但是具体是怎么完成的CPU不考虑。
  4. 模拟功能:模拟量的输入输出,信号输入到STM32内部集成的ADC片上外设中。仅用于AD、DA。

2.2、STM32F4的GPIO的基本特性

参考《STM32F4xx中文参考手册》7.2章节。

  • 在STM32中,GPIO按照16个IO口为1组进行划分,分为GPIOA、GPIOB、GPIOC……,在STM32F407ZGT6芯片中,总共有112个IO。一组GPIO共用一套完整寄存器,用户对GPIO的使用需要将相关设置参数写入到寄存器中。
  • 在输出模式下,有四种方式:推挽上拉、推挽下拉、开漏上拉、开漏下拉。推挽模式驱动能力较强,可以独立输出高电平信号,开漏模式下无法独立输出高电平,必须借助上拉电阻。上拉电阻在输出时,可以提高驱动能力,下拉电阻在输出时可以提高稳定性。在学习过程中常用推挽模式,在工作中,实际产品中常用开漏模式,上拉电阻和下拉电阻是可以选择都不使用的。
  • 在输出模式下,数据从输出数据寄存器①输出,在复用功能模式下,数据从片上外设②输出。
  • 可为每个IO选择不同的速度,速度指的是输出时的IO的高低电平的变化速度。
  • 输入模式下有3种方式:浮空输入,上拉输入,下拉输入。浮空输入时,不使用内置上拉电阻和下拉电阻。在STM32芯片内部每一个IO都集成接入了一个可选则的弱上拉电阻和弱下拉电阻。一般如果在外围电路中已经有接入上拉电阻和下拉电阻则选择使用浮空。在外围电路中没有接入上拉电阻/下拉电阻时根据情况选择选择使用一个,用于确定引脚悬空(外围没有接入任何东西)时的电平状态。
  • 锁定机制,可以冻结IO配置,很少使用,在一些可能影响芯片运行的环境中才使用,例如磁场、电场。
  • 每一个IO最多可以有16种复用功能,在使用时,一个IO在同一个时刻只能使用一种功能。

三、STM32F4下的GPIO基本结构

3.1、通用输出结构 

在开漏输出模式下,在输出数据寄存器中写入0,N-MOS将被打开,I/O将输出低电平,在输出数据寄存器中写入1,P-MOS不会打开,IO处于高阻抗状态,IO的电平将由外围电路决定。

在推挽输出模式下,在输出数据寄存器中写入0,N-MOS将被打开,I/O将输出低电平,在输出数据寄存器中写入1,P-MOS被打开,IO输出高电平。

施密特触发器被打开,IO的电平状态将每个1个AHB1时钟周期被检测保存在输入数据寄存器中。

可以设置输出的速度 以及 是否启用内置的弱上拉/弱下拉电阻。

输出数据寄存器可以通过程序直接写入,也可以通过程序写入 置位/复位寄存器 间接控制。

可以通过程序读取输出数据寄存器获取最近一次设置的 输出数据寄存器 的值。

STM32学习笔记_第1张图片3.2、通用输入结构 

在输入模式下,输出缓冲器被关闭,无法实现输出功能。

施密特触发器将被打开,IO的电平状态将每个1个AHB1时钟周期被检测一次并保存在输入数据寄存器中,用户可以通过读取输入数据寄存器获取IO状态。

可以设置是否使用内置弱上拉/弱下拉电阻。

STM32学习笔记_第2张图片

 

四、STM32下的GPIO的使用方法

4.1、寄存器表的阅读

STM32学习笔记_第3张图片 4.2、GPIO相关寄存器

寄存器的物理地址计算和程序中的表示:

寄存器的物理地址 = 外设寄存器起始地址(参考存储器映射 寄存器边界地址表) + 偏移地址。

在ST官方提供的文件 中对STM32F4系列芯片的 片上外设的相关寄存器都进行了定义。用户不需要自己计算寄存器的物理地址。寄存器的定义和《STM32F4xx中文参考手册》中寄存器表中的名字基本相同。

以GPIO的寄存器为例:

在STM32F4xx.h中对GPIO外设有相关定义:输入GPIOA,然后点击鼠标右键。

STM32学习笔记_第4张图片

关于类型 GPIO_TypeDef 的定义:

STM32学习笔记_第5张图片

STM32学习笔记_第6张图片 

 其中 __IO 为宏定义:关键字 volatile :表示不优化,计算机在进行数据处理时,如果对于同一个变量进行连续读取,且在两次读取之间没有进行过程序写入,则计算机会优化处理,不从存储空间中读取而是直接使用上一次读取的数据。如果有volatile声明,则表示该变量可能随时被隐性修改,计算机在读取时将每次都从存储空间中读取最新值。

STM32学习笔记_第7张图片 

uint32_t 也是类型重定义:unsigned int  也有类型重定义为  u32,uint16_t 是类型重定义 unsigned short ,也有类型重定义为 u16,还有u8 和uint8_t 是unsigned char。

关于 GPIOA_BASE 的定义:

STM32学习笔记_第8张图片

AHB1 外设基址定义:

STM32学习笔记_第9张图片 

外设基地址定义:

因此:GPIOA_BASE = 0x4000 0000 + 0x0002 0000 + 0x0000 = 0x4002 0000。

根据文件,GPIOA的边界地址为:0x4002 0000 ~0x4002 03FF

STM32学习笔记_第10张图片

*(unsigned int *)(0x4002 0000+ 0x00) = 0x01; 和 GPIOA->MODER = 0x01; 等效。

你可能感兴趣的:(STM32,学习,单片机,stm32)