1.点亮一个LED

您当前位置: 首页 > STM32视觉巡线小车 > 4、实验课程

1、点亮一个LED.rar  点击下载

实验一:STM32平台-------点亮一个LED

 

1、实验前准备

image.png 

             图1-1 STM32主控板
image.png

             图1-2 STM32转向车

 

 

2、实验目的

  STM32单片机上电之后,按下PS2标志旁边的启动按键后,实验效果为拓展板上面的LED灯闪烁,主要是学习STM32的GPIO口控制。

 

3、实验原理

  由电路原理图可知,本实验中采用的LED阴极接STM32主控板上的PA1、引脚上.同时LED灯需要串联一个10K的电阻作为限流电阻,我们只需在STM32主控板上控制相应的引脚为低电平,即可点亮相应的LED。由于单片机引脚不够用,LED的引脚和七彩探照灯共用了一个引脚,所以在点亮拓展板的LED的时候七彩探照灯可能也会亮,在控制七彩探照灯的时候LED灯也可能会亮。这里需要说明一下,我们在讲解固件库之前会首先对重要寄存器进行一个讲解,这样是为了大家对寄存器有个初步的了解。大家学习固件库,并不需要记住每个寄存器的作用,而只是通过了解寄存器来对外设一些功能有个大致的了解,这样对以后的学习也很有帮助。

首先要提一下, 在固件库中, GPIO 端口操作对应的库函数以及相关定义在文件stm32f10x_gpio.h 和 stm32f10x_gpio.c 中。

 

STM32 的 IO 口相比 51 而言要复杂得多,所以使用起来也困难很多。

首先STM32 的 IO 口

可以由软件配置成如下 8 种模式:

1、 输入浮空

2、 输入上拉

3、 输入下拉

4、 模拟输入

5、 开漏输出

6、 推挽输出

7、 推挽式复用功能

8、 开漏复用功能

 

  每个 IO 口可以自由编程, IO 口寄存器必须要按 32 位字被访问。 STM32 的很多 IO 口都是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level FT 的就是 5V 电平兼容的)。
STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 32 位的端口配置寄存器 CRL CRH 2 32 位的数据寄存器 IDR ODR 1 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR 1 32 位的锁存寄存器 LCKR。大家如果想要了解每个寄存器的详细使用方法,可以参考《STM32 中文参考手册 V10 P105~P129
CRL CRH 控制着每个 IO 口的模式及输出速率。
STM32 IO 口位配置表如表 3.1 所示:
image.png

3.1 STM32 IO 口位配置表

 

STM32 输出模式配置如表 3.2 所示:

 

image.png 

3.2 STM32 输出模式配置表

 

在固件库开发中, 操作寄存器 CRH CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化

函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx,  GPIO_InitTypeDef* GPIO_InitStruct)

这个函数有两个参数, 第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG

  第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。下面我们看看这个结构体的定义。首先打开我们的实验,然后找到 FWLib 组下面的 stm32f10x_gpio.c文件,定位到 GPIO_Init 函数体处,双击入口参数类型GPIO_InitTypeDef 后右键选择Go to definition of …” 可以查看结构体的定义:

typedef struct
{

uint16_t  GPIO_Pin;
GPIOSpeed_TypeDef  GPIO_Speed;
GPIOMode_TypeDef  GPIO_Mode;
}GPIO_InitTypeDef;

下面我们通过一个 GPIO 初始化实例来讲解这个结构体的成员变量的含义。
通过初始化结构体初始化
GPIO 的常用格式是:
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin
  =  GPIO_Pin_1;  //RED LED-->PB.1 端口配置
GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed  =  GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//
根据设定参数配置 GPIO
上面代码的意思是设置 GPIOB 的第 1 个端口为推挽输出模式,同时速度为 50M 从上面初始化代码可以看出,结构体 GPIO_InitStructure 的第一个成员变量 GPIO_Pin 用来设置是要初始化哪个或者哪些 IO 口; 第二个成员变量 GPIO_Mode 是用来设置对应 IO 端口的输出输入模式,
这些模式是上面我们讲解的
8 个模式, MDK 中是通过一个枚举类型定义的:
typedef enum
{

GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //通用推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽
}GPIOMode_TypeDef;
第三个参数是 IO 口速度设置, 有三个可选值,在 MDK 中同样是通过枚举类型定义:
typedef enum
{
GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

 

  要想知道某个 IO 口的电平状态,你只要读这个寄存器,再看某个位的状态就可以了。使用起来是比较简单的。

在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

比如我要读 GPIOB.1 的电平状态, 那么方法是:

GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1);

返回值是 1(Bit_SET)或者 0(Bit_RESET);

 

在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数

GPIO_Write 来实现的:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该函数一般用来往一次性一个 GPIO 的多个端口设值。

 

BRR寄存器是端口位清除寄存器。该寄存器的作用跟 BSRR 的高 16 位雷同,这里就不做详细讲解。 STM32 固件库中, 通过 BSRR BRR 寄存器设置 GPIO 端口输出是通过函数
GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

在多数情况下,我们都是采用这两个函数来设置 GPIO 端口的输入和输出状态。 比如我们要设置 GPIOB.1 输出 1,那么方法为:

GPIO_SetBits(GPIOB, GPIO_Pin_1);

反之如果要设置 GPIOB.1 输出位 0,方法为:

GPIO_ResetBits (GPIOB, GPIO_Pin_1);

GPIO 相关的函数我们先讲解到这里。 虽然 IO 操作步骤很简单,这里我们还是做个概括性的总结,操作步骤为:

1 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()

2 初始化 IO 参数。调用函数 GPIO_Init();

3 操作 IO。操作 IO 的方法就是上面我们讲解的方法。

上面我们讲解了 STM32  IO 口的基本知识以及固件库操作 GPIO 的一些函数方法,下面我们来讲解我们的七彩探照灯硬件和软件设计。

4、实验步骤

4-1.看懂原理图

image.png 

        图4-1 STM32主控板电路图

 

 

4-2  LED

4-2.理解原理图

由电路原理图可以知道相应的连接电路,LED连接到主控板上的数字PA1口。

image.png  

4-3 程序代码如下(简单GPIO控制):

1、RGB七彩探照灯GPIO初始化:

image.png 

2、所有外设初始化

image.png 

硬件设备初始化,这里包含了延迟函数初始化。

3、主函数

 

 

image.png