图4-41I/O引脚等效原理图本节所有的寄存器和位以通用格式表示:小写的“x”表示端口的序号,而小写的“n”代表位的序号,但是在程序里要写完整。通用数字I/O的端口为具有可选上拉电阻的双向I/O端口。图4-42通用数字I/O说明:WRx、WPx、WDx、RRx、RPx和RDx对于同一端口的所有引脚都是一样的。注意SBI指令能够用来改变端口的单个位。表4-15端口引脚配置......
2023-06-26
1.端口特性
每个通用I/O端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)、1个32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁定寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH和GPIOx_AFRL)。每个I/O端口位均可自由编程,但I/O端口寄存器必须按32位字、半字或字节进行访问。
GPIO主要特性包括以下几点:
(1)受控I/O多达16个。
(2)输出状态:推挽或开漏+上拉/下拉。
(3)从输出数据寄存器(GPIOx_ODR)或外设(复用功能输出)输出数据。
(4)可为每个I/O选择不同的速度。
(5)输入状态:浮空、上拉/下拉、模拟。
(6)将数据输入输入数据寄存器(GPIOx_IDR)或外设(复用功能输入)。
(7)置位和复位寄存器(GPIOx_BSRR),对GPIOx_ODR具有按位写权限。
(8)锁定机制(GPIOx_LCKR),可冻结I/O配置。
(9)模拟功能。
(10)复用功能I/O选择寄存器(一个I/O最多可具有16个复用功能)。
(11)快速翻转,每次翻转最快只需要两个时钟周期。
(12)引脚复用非常灵活,允许将I/O引脚用作GPIO或多种外设功能中的一种。
根据以上列出的每个I/O端口的特性,可将通用I/O(GPIO)端口的各个端口位分别配置为多种模式:
(1)输入浮空。
(2)输入上拉。
(3)输入下拉。
(4)模拟功能。
(5)具有上拉或下拉功能的开漏输出。
(6)具有上拉或下拉功能的推挽输出。
(7)具有上拉或下拉功能的复用功能推挽。
(8)具有上拉或下拉功能的复用功能开漏。
2.端口使用
1)复位后的I/O引脚
在复位期间及复位刚刚完成后,复用功能尚未激活,I/O端口被配置为输入浮空模式。复位后,调试引脚处于复用功能上拉/下拉状态。
(1)PA15:JTDI处于上拉状态。
(2)PA14:JTCK/SWCLK处于下拉状态。
(3)PA13:JTMS/SWDAT处于下拉状态。
(4)PB4:NJTRST处于上拉状态。
(5)PB3:JTDO处于浮空状态。
当引脚配置为输出后,写入输出数据寄存器(GPIOx_ODR)的值将在I/O引脚上输出。可以在推挽模式或开漏模式下使用输出驱动器。输入数据寄存器(GPIOx_IDR)每隔一个AHB1时钟周期捕获一次I/O引脚的数据。所有GPIO引脚都具有内部弱上拉及下拉电阻,可根据GPIOx_PUPDR寄存器中的值来打开/关闭。
2)I/O引脚的复用和映射
微控制器I/O引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复用功能(AF)连接到I/O引脚。这可以确保共用同一个I/O引脚的外设之间不会发生冲突。每个I/O引脚都有一个复用器,该复用器采用16路复用功能输入(AF0~AF15),可通过GPIOx_AFRL(针对引脚0~7)和GPIOx_AFRH(针对引脚8~15)寄存器对这些输入进行配置。
(1)完成复位后,所有I/O都会连接到系统的复用功能0(AF0)。
(2)外设的复用功能映射到AF1~AF13。
(3)Cortex-M4FEVENTOUT映射到AF15。
3)I/O端口相关寄存器
每个GPIO有4个32位存储器映射的控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR),可配置多达16个I/O。GPIOx_MODER寄存器用于选择I/O方向(输入、输出、AF、模拟)。GPIOx_OTYPER和GPIOx_OSPEEDR寄存器分别用于选择输出类型(推挽或开漏)和速度(无论采用哪种I/O方向,都会直接将I/O速度引脚连接到相应的GPIOx_OSPEEDR寄存器位)。无论采用哪种I/O方向,GPIOx_PUPDR寄存器都用于选择上拉/下拉。
每个GPIO都具有2个16位数据寄存器,即输入数据寄存器和输出数据寄存器(GPIOx_IDR和GPIOx_ODR)。GPIOx_ODR用于存储待输出数据,可对其进行读/写访问。通过I/O输入的数据存储到输入数据寄存器(GPIOx_IDR)中,该寄存器是一个只读寄存器。
4)I/O端口数据位操作(www.chuimin.cn)
置位复位寄存器(GPIOx_BSRR)是一个32位寄存器,它允许应用程序在输出数据寄存器(GPIOx_ODR)中对各个单独的数据位执行置位和复位操作。置位复位寄存器的大小是GPIOx_ODR的2倍。
GPIOx_ODR中的每个数据位对应GPIOx_BSRR中的两个控制位:BSRR(i)和BSRR(i+SIZE)。当写入1时,BSRR(i)位会置位对应的ODR(i)位。当写入1时,BSRR(i+SIZE)位会清零ODR(i)对应的位。
在GPIOx_BSRR中向任何位写入0都不会对GPIOx_ODR中的对应位产生影响。如果在GPIOx_BSRR中同时尝试对某个位执行置位和清零操作,则置位操作优先。
使用GPIOx_BSRR寄存器更改GPIOx_ODR中各个位的值是一个“单次”操作,不会锁定GPIOx_ODR位,随时可以直接访问GPIOx_ODR位。GPIOx_BSRR寄存器提供了一种执行按位处理的方法。
在对GPIOx_ODR进行位操作时,软件无须禁止中断。
5)GPIO锁定机制
通过将特定的写序列应用到GPIOx_LCKR寄存器,可以冻结GPIO控制寄存器。冻结的寄存器包括GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL和GPIOx_AFRH。
要对GPIOx_LCKR寄存器执行写操作,必须应用特定的写/读序列。当正确的LOCK序列应用到此寄存器的第16位后,会使用LCKR[15:0]的值来锁定I/O的配置(在写序列期间,LCKR[15:0]的值必须相同)。将LOCK序列应用到某个端口位后,在执行下一次复位之前,将无法对该端口位的值进行修改。每个GPIOx_LCKR位都会冻结控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL和GPIOx_AFRH)中的对应位。
LOCK序列只能通过对GPIOx_LCKR寄存器进行字(32位长)访问的方式来执行,因为GPIOx_LCKR的第16位必须与[15:0]位同时置位。
6)I/O端口复用功能
有2个寄存器(GPIOx_AFRL和GPIOx_AFRH)可用来从每个I/O可用的16个复用功能I/O中进行选择。借助这些寄存器,可根据应用程序的要求将某个复用功能连接到其他某个引脚。
这意味着可使用GPIOx_AFRL和GPIOx_AFRH复用功能寄存器在每个GPIO上复用多个可用的外设功能。因此,应用程序可为每个I/O选择任何一个可用功能。由于AF选择信号由复用功能输入和复用功能输出共用,因此只需为每个I/O的复用功能I/O选择一个通道即可。所有端口都具有外部中断功能。要使用外部中断线,必须将端口配置为输入模式。
7)输入/输出配置方法
当I/O端口进行编程作为输入时,输出缓冲器被关闭;施密特触发器输入被打开;根据GPIOx_PUPDR寄存器中的值决定是否打开上拉和下拉电阻;输入数据寄存器每隔1个AHB1时钟周期对I/O引脚上的数据进行一次采样;对输入数据寄存器的读访问可获取I/O状态。
当I/O端口进行编程作为输出时,首先输出缓冲器被打开。在开漏模式下,输出寄存器中的“0”可激活N-MOS,而输出寄存器中的“1”会使端口保持高组态(P-MOS始终不激活)。在推挽模式下,输出寄存器中的“0”可激活N-MOS,而输出寄存器中的“1”可激活P-MOS。
其次施密特触发器输入被激活,根据GPIOx_PUPDR寄存器中的值决定是否打开弱上拉电阻和下拉电阻,输入数据寄存器每隔1个AHB1时钟周期对I/O引脚上的数据进行一次采样。在开漏模式下,对输入数据寄存器的读访问可获取I/O状态;在推挽模式下,对输出数据寄存器的读访问可获取最后的写入值。
8)模拟配置方法
当I/O端口进行编程作为模拟配置时,输出缓冲器被禁止;施密特触发器输入停用,I/O引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值(0),弱上拉和下拉电阻被关闭,对输入数据寄存器的读访问值为“0”。
3.I/O端口初始化函数
GPIO相关函数和定义分布在固件库文件stm32f4××_GPIO.c和头文件stm32f4××_GPIO.h文件中。在固件库开发中,操作4个配置寄存器初始化GPIO通过GPIO初始化函数完成:
这个函数有2个参数,第1个参数用来指定需要初始化的GPIO对应的GPIO组,取值范围为GPIOA~GPIOK。第2个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。
下面来看这个结构体的定义。
下面通过一个GPIO初始化实例来讲解这个结构体的成员变量的含义。通过初始化结构体初始化GPIO的常用格式如下:
上面代码的意思是,设置GPIOF的第9个端口为推挽输出模式,速度为100MHz,上拉形式。从上面初始化代码可以看出,结构体GPIO_InitStructure的第一个成员变量GPIO_Pin用来设置是要初始化哪个或哪些I/O口。
第2个成员变量GPIO_Mode用来设置对应I/O端口的I/O端口模式,这个值实际就是配置GPIOx的MODER寄存器的值。在MDK中端口模式是通过一个枚举类型定义的,其参数值GPIO_Mode_IN表示设置为复位状态的输入,GPIO_Mode_OUT表示通用输出模式,GPIO_Mode_AF表示复用功能模式,GPIO_Mode_AN表示模拟输入模式。
第3个成员变量GPIO_Speed是I/O口输出速度设置,有4个可选值,即配置GPIO对应的OSPEEDR寄存器的值。在MDK中输出速度同样是通过枚举类型定义的,其参数值GPIO_Speed_2MHz等同于GPIO_Low_Speed,GPIO_Speed_25MHz等同于GPIO_Medium_Speed,GPIO_Speed_50MHz等同于GPIO_Fast_Speed,GPIO_Speed_100MHz等同于GPIO_High_Speed。
第4个成员变量GPIO_OType是GPIO的输出类型设置,即配置GPIO对应的OTYPER寄存器的值。在MDK中输出类型设置也是通过枚举类型定义的,其参数值GPIO_OType_PP表示输出推挽模式,GPIO_OType_OD表示输出开漏模式。
第5个成员变量GPIO_PuPd用来设置I/O口的上下拉,即配置GPIO对应的PUPDR寄存器的值。同样,通过枚举类型列出,其参数值GPIO_PuPd_NOPULL为不使用上下拉,GPIO_PuPd_UP为上拉,GPIO_PuPd_DOWN为下拉,只需根据需要设置相应的值即可。
4.I/O端口主要固件函数
1)I/O端口输出控制函数
在固件库中设置ODR寄存器的值来控制I/O口的输出状态是通过函数GPIO_Write来实现的。函数格式如下:
该函数可用来一次性向GPIO的多个端口设值。大部分情况下,设置I/O口不用这个函数。使用实例如下:
2)I/O端口输出状态读函数
固件库函数可以通过读ODR寄存器检测I/O口的输出状态。函数格式如下:
这两个函数功能类似,只不过前者一次性读取某组端口所有I/O口输出状态,后者一次性读取某组端口的一个或多个I/O口的输出状态。使用实例如下:
3)I/O端口输入状态读函数
固件库函数可以通过读ODR寄存器检测I/O口的输入状态。函数格式如下:
使用实例如下:
4)I/O端口电平写函数
库函数操作BSRR寄存器来设置I/O电平的函数如下:
第1行用来设置某组端口中的一个或多个I/O口为高电平。第2行用来设置某组端口中一个或多个I/O口为低电平。使用实例如下:
有关嵌入式系统原理及应用:基于ARM Cortex-M4体系结构的文章
图4-41I/O引脚等效原理图本节所有的寄存器和位以通用格式表示:小写的“x”表示端口的序号,而小写的“n”代表位的序号,但是在程序里要写完整。通用数字I/O的端口为具有可选上拉电阻的双向I/O端口。图4-42通用数字I/O说明:WRx、WPx、WDx、RRx、RPx和RDx对于同一端口的所有引脚都是一样的。注意SBI指令能够用来改变端口的单个位。表4-15端口引脚配置......
2023-06-26
要想彻底理解单片机P0口加上拉电阻的问题,必须要从P0端口的结构及工作原理入手。51系列单片机有4个双向的8位并行I/O端口,分别记作P0、P1、P2、P3,共有32根端口线。这是针对最早的MCS-8051系列来说的,现在国内最新的STC公司生产的12系列、15系列的单片机对此有新的定义,读者可自行查阅相关资料进行了解。......
2023-11-17
Neuron芯片提供的串行I/O对象有Shift I/O对象、I2CI/O对象、Magcard输入对象、Magtrack 1输入对象、串行I/O对象、Dallas Touch I/O对象、Wiegand输入对象和Neurowire I/O对象等。该I/O对象类型用于使用异步串行数据格式传输数据,如RS-232通信。输入串行I/O对象将等待被接收的数据帧的开始位,直到已经等待了接收20个字符所需要的时间才结束。输入串行I/O对象将在收到无效停止位或奇偶校验位时停止接收数据。3)io-object-name:由用户为该I/O对象指定的名字,是ANSI C格式的变量标识符。......
2023-11-22
所谓I/O接口也就是输入/输出接口。根据信号传输方式的不同,I/O接口一般可分为并行接口和串行接口两种方式。通常所说的并行接口一般称为Centronics接口,也称为IEEE1284标准。当传输距离较远、位数又多时,并行接口会导致通信线路复杂且成本提高。图5-13所示为各类并行接口及并行电缆,传输的是数字量和开关量。串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS-485等。......
2023-06-23
直接I/O对象主要包括Bit(位)I/O对象、Byte(字节)I/O对象、Leveldetect输入对象和Nibble(半字节)I/O对象。其中,IO0~IO3所具有的高电流吸收能力可使这几个引脚直接驱动多个I/O设备。说明中指定的引脚是该I/O对象使用的引脚中编号最小的引脚,且必须是IO0。图5-21 字节I/O对象引脚分配图2)io-object-name:是用户指定的该I/O对象的名字,为ANSI C格式的变量标识符。该I/O对象类型输入和输出的数据范围为0~15B。这种I/O对象类型用于同时读取或控制4个相邻引脚。......
2023-11-22
具体I/O分配画面布局如图3-3所示。图3-2 I/O分配如果未对点数进行选择,则使用实际安装模块的点数。对于未进行起始XY设置的插槽,则从当前I/O编号的末尾开始以连号方式进行分配。......
2023-06-15
I/O模块是输入模块和输出模块的总称,按实际控制所需的I/O来确定模块规格及数量。实际系统配置时,I/O模块可多可少,但其最大模块数受到CPU单机所能控制的最大I/O点数限制。常见的I/O模块外形如图2-9所示。注意,设定方法请查看本书8.6节4.I/O模块输入响应速度的变更。Q系列PLC常见I/O模块的性能见表2-7。......
2023-06-15
图1-7磁盘I/O瓶颈现象调查最理想的I/O应用就是所有控制器相应的设备都得以均衡使用。图1-10所示为调查Oracle数据库内文件的I/O的SQL。图1-10调查Oracle数据库内文件通过上述分析结果,可采取的措施包括:将 /oracle上数据文件的一部分移至有其他控制器的挂载点,通过移动 RBS、TEMP、USERS中一两个数据文件使 I/O平衡并分散。该操作非一次性操作,分配一次后要重新进行监测,确定 I/O是否分散均衡。......
2023-11-01
相关推荐