掘金 后端 ( ) • 2024-03-28 18:20

一、 实验简介(实验目的)

本实验要实现的是控制ALIENTEK战舰STM32开发板上的两个LED 实现一个类似跑马灯的效果,该实验的关键在于如何控制STM32 的IO 口输出。将通过代码控制ALIENTEK 战舰STM32 开发板上的两个LED:DS0 和DS1 交替闪烁,实现类似跑马灯的效果。


二、 实验设备(实验设备及用到的模块)

1.电脑:window10及以上

2.开发板名称:正点原子战舰V3 STM32F103开发板

3.模块名称:LED模块

4.数据通信方式及设备


三、 实验原理(软硬件全面阐述)

1. 芯片该部分工作原理

本跑马灯实验需要控制LED0和LED1,即让红绿灯光交替闪烁。首先就是要在MCU里定位到LED0和LED1连接的引脚。

image.png 如上图所示,LED0连接的引脚是PB5,LED1连接的引脚是PE5。所以在led.h文件中通过引脚宏定义LED0和LED1,具体如下:

#define LED0 PBout(5)
#define LED1 PEout(5)

2.模块工作原理、电路图等

image.png

通过位带来操作引脚输出高低电平,以LED0为例:

LED0=1; //通过位带操作控制 LED0 的引脚 PB5 输出高电平 
LED0=0; //通过位带操作控制 LED0 的引脚 PB5 输出低电平

通过LED电路图分析可知:当引脚PB5输出低电压时,即LED0=0时灯亮;当引脚PB5输出高电压时,即LED0=1时灯灭。LED1同理。

3.用到的库函数阐述

(1). 使用固件库操作和寄存器操作来实现 IO 口操作。库函数操作方法如下:通过函数GPIO_SetBits()和函数GPIO_ResetBits()来完成。以PB.5为例:

GPIO_SetBits(GPIOB, GPIO_Pin_5);
 GPIO_ResetBits (GPIOB, GPIO_Pin_5);

(2). 库函数操作就直接调用两个函数即可控制 IO 输出高低电平。我们也通过直接操作寄存器BRR 和BSRR 的方式来操作IO 口输出高低电平,方法如下:

GPIOB->BRR=GPIO_Pin_5; //设置GPIOB.5 输出1,等同LED0=1; 
GPIOB->BSRR=GPIO_Pin_5; //设置GPIOB.5 输出0,等同LED0=0;

(3).如下代码的作用是使能 APB2 总线上的GPIOB 和GPIOE 的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| 
RCC_APB2Periph_GPIOE, ENABLE);

4.关键程序分析

在跑马灯中设置LED1和LED0的亮灭,并通过延时函数进行延时。

int main(void)
{
delay init();
//延时函数初始化
LED Init ();
//初始化与LED连接的硬件接口
while(1)
{
LEDO=0;
LED1=1;
delay_ms(300);
//3延时300ms
LEDO=1;
LED1=0;
de1aym3(300);//延时300ms
}
}

四、 程序分析(程序总体介绍,模块设计)

1. 程序总体概述

先在led.h中通过引脚宏定义LED0和LED1:

#define LED0 PBout(5)
#define LED1 PEout(5)

再在led.c中编写LED的初始化函数:引入系统文件中的GPIO_InitTypeDef结构体,再使能PB、PE端口始时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOE, ENABLE);

通过GPIO 初始化函数来配置IO口的模式和速度:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

双击入口参数类型GPIO_InitTypeDef 后右键选择“Go to definition of …” 可以查看结构体的定义,再在初始化GPIO中分别定义GPIO_InitTypeDe结构体中的成员变量Pin、Mode、Speed。

最后在主函数main.c中先初始化延时函数delay和LED函数,再在while循环中通过引脚输出高低电平来控制LED0和LED1的交替闪烁并设置每段效果的延时时间:

//红灯亮绿灯灭并延时300ms该效果
LED0=0; 
LED1=1; 
delay_ms(300); 
//红灯灭绿灯亮并延时300ms该效果
LED0=1; 
LED1=0; 
delay_ms(300); //延时300ms

2.各个模块阐述

① 组 USER 下面存放的主要是用户代码。system_stm32f10x.c 里面主要是系统时钟初始化函数SystemInit 相关的定义,一般情况下文件用户不需要修改。stm32f10x_it.c 里面存放的是部分中断服务函数。main.c函数主要存放的是主函数了。

② 组 HARDWARE 下面存放的是每个实验的外设驱动代码,他的实现是通过调用FWLib

下面的固件库文件实现的,比如led.c 里面调用stm32f10x_gpio.c 里面的函数对led 进行初始化。

③ 组 SYSTEM 是ALIENTEK 提供的共用代码,包含Systick 延时函数,IO 口位带操作以及串口相关函数。

④ 组 CORE 下面存放的是固件库必须的核心文件和启动文件。

⑤ 组 FWLib 下面存放的是ST 官方提供的外设驱动固件库文件,每个stm32f10x_ppp.c 源文件对应一个stm32f10x_ppp.h 头文件。

⑥ README 分组主要就是添加了README.TXT 说明文件,对实验操作进行相关说明。

3.程序分析总结

  1. 在电路图中定位跑马灯需要配置的IO口:PB5&PE5。
  2. 分析需要配置的寄存器:RCC_APB2ENR外设时钟使能寄存器、GPIOx_CRL端口配置低寄存器、ODR端口输出寄存器、BSRR端口位设置/清除寄存器、BRR端口位清除寄存器。
  3. 对寄存器操作(以RCC为例):在led.c中鼠标放在RCC->APB2ENR|上右键选择“Go to definition of …”跳转到stm32f10x.h文件相应位置可以看到RCC本身就是个指针格式,指针类型为“RCC_TypeDef *”类型,对该指针进行再次跳转,可以查看stm32f10x.h文件中的结构体RCC_TypeDef的成员。