2.TrikeBot小车七彩探照灯

您当前位置: 首页 > STM32-Trikebot > 4、实验课程

TrikeBot小车七彩探照灯

例程2-TrikeBot小车七彩探照灯.rar  点击下载

实验STM32平台-------TrikeBot小车七彩探照灯

 

1、实验前准备

image.png 

1-1 STM32主控板

 

image.png 

 图1-2七彩探照灯模块

 

2、实验目的

STM32单片机上电之后,实验效果为报警灯光模拟和七彩灯轮询,主要是学习STM32的GPIO口控制和PWM控制LED。

 

3、实验原理

  RGB三色灯和普通的LED灯其实没有什么不同,只是在封装上,RGB灯内封装了三个LED(红,绿,蓝),通过控制三种LED亮度(256种亮度级别可选),可以混合出不同的颜色(256*256*256)。

  由电路原理图可知,本实验中采用的RGB LED灯是共阴LED,一个引脚接地,其余的三个RGB引脚分别接在STM32主控板上的PB1、PB0、PA7引脚上.同时每个LED灯需要串联一个220欧的电阻作为限流电阻,我们只需在STM32主控板上控制相应的引脚为高电平,即可点亮相应的LED。通过调节不同的PWM可以输出不同的颜色值。

这里需要说明一下,我们在讲解固件库之前会首先对重要寄存器进行一个讲解,这样是为了大家对寄存器有个初步的了解。大家学习固件库,并不需要记住每个寄存器的作用,而只是通过了解寄存器来对外设一些功能有个大致的了解,这样对以后的学习也很有帮助。

首先要提一下, 在固件库中, 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主控板电路图

image.png 

图4-2  RGB LED灯


4-2.理解原理图

   由电路原理图可以知道相应的连接电路,LED_R连接到主控板上的数字PB1口,LED_G和LED_B分别接在主控板上的PB0和PA7口。

 

4-3.烧录程序

如出现小车无法烧录或小车无法动作的情况下可以按一下复位键。

 

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

  详情见TrikeBot小车七彩探照灯代码。