欢迎来到军工软件开发人才培养基地——学到牛牛

技术文章分享|aSTM32点灯

时间:2024-05-06 07:01:10 来源:学到牛牛

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灭