前面提到STM32F407ZGT6有114个GPIO,分为8组,分别是PA,PB,…,PH口,那么它们映射的物理地址是多少呢?编程前必须弄清楚它们挂在哪个总线上,映射的地址是多少。图2-4是STM32F4xx的结构框图。从框图可以看出,GPIO都挂在了AHB1上,从表0-6可找到AHB1的地址范围是0x4002 0000~0x4007 FFFF,而8组GPIO对应的基地址与偏移量如表2-2所示。
表2-2 8组GPIO对应的地址分布
续表
图2-4 STM32F4xx总线框架图
有两个值得注意的地方:GPIOA(PA口)的基地址对应的正好是AHB1的基地址,也就是AHB1的第一个设备就是GPIOA,它们的边沿地址对齐了。GPIOB与GPIOA相隔了0x400,即和GPIOA有关的所有寄存器都在0x4002 0000~0x4002 03FFF。再观察几组GPIO的基地址,它们都相隔0x400,也就是说,所有的GPIOx基地址都可以从AHB1推导出来。
除了前面讲到的4个设置模式的寄存器外,还有其他需要设置的寄存器,如表2-3所示。表中以GPIOF(PF口)为例,GPIOF的基地址是0x4002 1400,对应的寄存器有GPIOF_MODER、GPIOF_OTYPER、GPIOF_OSPEEDR、GPIOF_PUPDR、GPIOF_IDR、GPIOF_ODR、GPIOF_BSRR、GPIOF_LCKR、GPIOF_AFRL、GPIOF_AFRH。这么多寄存器,它们之间的偏移量都是0x04,同样的道理,它们都可以通过固定的偏移量+基地址进行推导。
表2-3 使用GPIOF需要设置的相关寄存器
这些寄存器都是32位。下面将这10个寄存器作简要的说明。
(1)GPIOx_MODER(x=A,B,…,H,下同):端口模式寄存器,如图2-5所示。其作用是设置Px口工作在输入、输出、复用或模拟模式,具体设置代码如表2-1所示。它的复位值比较特殊:PA口是0xA800 0000,PB口是0x0000 0280,其他端口是0x0000 0000。
图2-5 GPIOx_MODER寄存器
寄存器的32位分为16组,每组2位,分别对应Px口的16个引脚,比如bit1与bit0用于设置Px0的工作模式。00代表输入模式;01代表通用输出模式;10代表复用功能模式;11代表模拟模式。
(2)GPIOx_OTYPER:端口输出类型寄存器。其作用是将GPIOx设置为推挽模式或开漏模式,复位值是0x0000 0000。其中32位只使用了低16位,高16位保留,但必须保持复位值0x0000,如图2-6所示。
图2-6 GPIOx_OTYPER寄存器
bit0~bit15分别设置Px0~Px15这16个引脚的推挽、开漏模式。0代表输出推挽;1代表输出开漏。
(3)GPIOx_OSPEEDR:端口输出速度寄存器,用于设置GPIOx的工作速度,复位值也比较特殊,PB口是0x0000 00C0,其他端口是0x0000 0000,如图2-7所示。
图2-7 GPIOx_OSPEEDR寄存器
同理,32位分成16组,每组2位,对应16个引脚设置。00代表2MHz(低速);01代表25MHz(中速);10代表50MHz(快速);11代表100MHz(高速,30pF时)/80MHz(高速,15pF时)。(www.xing528.com)
(4)GPIOx_PUPDR:端口上拉/下拉寄存器,用于设置引脚端口的上拉/下拉,复位值也比较特殊,PA口是0x6400 0000,PB口是0x0000 0100,其他端口是0x0000 0000,如图2-8所示。
图2-8 GPIOx_PUPDR寄存器
32位分为16组,每组2位,用于设置对应的16个引脚的上拉/下拉。00代表无上拉/下拉;01代表上拉;10代表下拉;11代表保留。
(5)GPIOx_IDR:输入状态寄存器,其作用是将Px口的电平状态保存,供CPU访问读取。由于16个GPIO为一组,因此这个32位的寄存器只使用了低16位,高16位保留,复位值为0x0000 XXXX(其中X表示未定义),如图2-9所示。高16位虽然保留,但在应用时保持复位值,即bit16~bit31全为0,bit0~bit15则对应了Px0~Px15引脚的输入电平。IDR寄存器操作时是只读状态。
图2-9 GPIOx_IDR寄存器
(6)GPIOx_ODR:输出状态寄存器,作用是保存将要输出到Px口的数据。CPU只需将需要输出的数据保存到此寄存器,Px口即出现相应的电平输出,位数的使用情况和IDR一样,只使用了低16位,高16位保留。复位值为0x0000 0000。bit16~bit31应用时保持全0,bit0~bit15对应输出的Px口的输出电平,如图2-10所示。
图2-10 GPIOx_ODR寄存器
(7)GPIOx_BSRR:GPIO端口置位/复位寄存器,复位值为0x0000 0000,用于对Px口GPIO个别端口进行置0与置1操作,其中R(Reset)代表置0,S(Set)代表置1,如图2-11所示。使用时,“1”有效,只要在相应位写1,则寄存器响应。比如BS5(bit5)=1,代表Px口的5脚置1;又比如BR7(bit23)=1,代表Px口的7脚置0。若同一个位的BR与BS同时为1,则BS的优先级更高,即置1而不会置0。
图2-11 GPIOx_BSRR寄存器
(8)GPIOx_LCKR:GPIO端口配置锁定寄存器,用于锁定Px口GPIO状态,使之不能改变,复位值为0x0000 0000。这个锁定可以具体到位,如图2-12所示。bit16(LCKK)是GPIO锁定总开关,为1时,打开锁定功能;为0时,则关闭锁定功能。bit0~bit15则表示是具体锁定哪个引脚,1表示锁定,0表示不锁定。
图2-12 GPIOx_LCKR寄存器
(9)GPIOx_AFRL:复用功能低位寄存器,用于设定Px口GPIO的复用功能,复位值为0x0000 0000。GPIOx_AFRL寄存器针对Px口16个GPIO里的Px0~Px7设置复用功能,共8个引脚,剩下的Px8~Px15的8个引脚由GPIOF_AFRH控制。
GPIOx_AFRL里的32位分为8组,每组4位,如图2-13所示。每4位二进制数可以有16个组合,从0000到1111,对应GPIO的16种复用功能的代号(16种复用功能不是指所有的引脚都有16种复用可用),如图2-14所示。0000代表AF0,0001代表AF1,0010代表AF2,…,1111代表AF15。比如设置bit11~bit8为0111,即AF7,则意味着Px2使用了USART功能。
图2-13 GPIOx_AFRL寄存器
图2-14 GPIOx_AFRL对应的AF代号与功能
(10)GPIOx_AFRH:复用功能高位寄存器,其作用与GPIOx_AFRL类似,负责Px口的Px8~Px15这8个引脚的复用设置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。