1.TrikeBot小车鸣笛

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

TrikeBot小车鸣笛

例程1-TrikeBot小车鸣笛.rar  点击下载

实验一:STM32平台-------TrikeBot小车鸣笛

 

1、实验前准备

image.png 

1-1 STM32主控板

image.png 

 图1-2有源蜂鸣器


2、实验目的

STM32单片机上电之后,实验效果为小车的蜂鸣器一直鸣笛,主要是学习STM32的GPIO口控制。

 

3、实验原理

  蜂鸣器有“有源”和“无源”两种类型,有源是指其内部自带多谐振荡器等结构,外部只需要提供工作电压,它(内部的振荡器就工作)就能发出固定频率的声音;而无源的是指内部没有带振荡源,需要外部驱动电路提供一定频率的驱动信号。

  我们这次实验所使用的蜂鸣器就是有源蜂鸣器,外部只需要提供工作电压就能发出固定频率的声音。

  由电路原理图可知,有源蜂鸣器的正极接3.3V,负极接一个8550三极管,三极管的集电极接地,基极接一个1K的电阻,电阻的另一头接STM32的PA0口。

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

首先要提一下,在固件库中,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_0;  //RED LED-->PA.0 端口配置
GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed  =  GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIO
A, &GPIO_InitStructure);//根据设定参数配置 GPIO


上面代码的意思是设置 GPIOB 的第 0 个端口为推挽输出模式,同时速度为 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)

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

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

返回值是 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 端口的输入和输出状态。 比如我们要设置 GPIOA.0 输出 1,那么方法为:

GPIO_SetBits(GPIOA, GPIO_Pin_0);

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

GPIO_ResetBits (GPIOA, GPIO_Pin_0);

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  有源蜂鸣器

4-2.理解原理图

由电路原理图可以知道相应的连接电路,有源蜂鸣器连接在主控板上的数字PA0口。

4-3.烧录程序

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

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

详情见TrikeBot小车鸣笛代码.