1. GPIO简介
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。STM32F407ZGT6,一共有7组GPIO口。每组IO口有16个IO,16X7 = 112,外加PH0、PH1,共有114个IO口,从GPIOA到GPIOG,PH0、PH1。
每个通用 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)。
IO口输入模式:浮空输入模式、上拉输入模式、下拉输入模式、模拟输入模式。IO口输出模式:开漏输出模式、开漏复用模式、推挽式输出模式、推挽式复用模式。四种最大速度:2MHz、25MHz、50MHz、100MHz。
2. GPIO控制LED
首先明确整体思路:
a. 找到需要控制的开发板硬件(一般有丝印)
b. 根据丝印在原理图中找到对应电路图,根据电路图找出关联的引脚及控制方式。
c. 在芯片手册找到对应引脚(PF8)的寄存器地址。
d. 编程。
2.1 开发板硬
开发板硬件如下,可见LED对应的丝印分别为LED1、LED2、LED3、LED4,其中LED4为硬件电源灯(不可编程)、其余三个灯均可编程控制。
2.2 开发板原理图
在开发板对应的硬件电路图上,定位硬件开发板上丝印所对应位置的电路图接线方式。可知控制LED1、LED2、LED3的GPIO引脚分别为GPIOF_Pin8(简称GPF8)、GPIOF_Pin9、GPIOF_Pin10。并且根据电路图可知,如果需要LED亮,则GPIOF_Pin8需要设置为低电平。反之,如果需要LED灭,则GPIOF_Pin8需要设置为高电平。
2.3 GPIO寄存器地址
上节我们找到控制LED亮灭的GPIO引脚,引脚控制需要对应的寄存器。stm32一般将寄存器地址分为:基地址和偏移地址。
基地址分布在“存储器映射”章节。如下图:GPIOF的寄存器地址范围为0x40021400 – 0x400217ff,其中0x40021400为基地址。该IO口挂载的总线为AHB1,编程时需要打开对应外设的时钟(寄存器AHB1ENR)。
GPIO寄存器的偏移地址在“GPIO寄存器映射”章节。如下图(部分寄存器):
2.4 LED编程控制
LED控制需要用到三个寄存器,分别是RCC_AHB1ENR、GPIOF_MODER、GPIOF_ODR。
|1. RCC_AHB1ENR寄存器
该寄存器控制对应总线上的外设时钟使能,如下图。该寄存地址为0x40023800 + 0x30。
外设GPIOF时钟使能编程如下:
#define RCCAHB1ENR (*(volatile unsigned int *)( 0x30 + 0x40023800 ) )
RCCAHB1ENR |= ( 1<< 5 );
|2. GPIOF_MODER寄存器
该寄存器用于设置IO口的工作方式,控制LED亮灭需要使用输出模式。,如下图。该寄存地址为0x40021c00 + 0x0。
#define GPIOFMODER (*(volatile unsigned int *)( 0x00 + 0x40021400 ) )
GPIOFMODER &= ~( 3 << 16 );
GPIOFMODER |= ( 1 << 16 );
|3. GPIOF_ODR寄存器
该寄存器用于设置IO口的输出的电平值:0为低电平、1为高电平,如下图。该寄存地址为0x40021c00 + 0x14。
#define GPIOFODR (*(volatile unsigned int *)( 0x14 + 0x40021400 ) )
GPIOFODR &= ~( 1 << 8 ); // LED亮
GPIOFODR |= ( 1 << 8 ); // LED灭