实验一 GPIO口控制LED实验

1 实验目的

  1. 了解并掌握如何控制 STM32 的 GPIO;
  2. 掌握控制 LED 的电路原理和程序代码;

2 实验环境

  1. 硬件:1 个空气温湿度传感器模块、1 个 ST-Link 调试器、1 根 USB2.0 方口线、1
    根 USB3.0 数据线、1 台 PC 机;
  2. 软件:Windows 7/XP、MDK 集成开发环境。

3 实验功能

实现Status、 RS485-R、 RS485-T、 User1 四个指示灯轮流闪烁。
1)硬件原理 :温湿度传感器模块有四个指示灯,分别是 Status、 RS485-R、 RS485-T 和 User1。 在后面的实验中, 可先不考虑这些名称,它们是根据该模块与物联魔盒系列中其他模块结合应用时的功能定义的,本课程中只需掌握它们的控制原理。模块上四个指示灯的控制原理,如下图所示:
在这里插入图片描述

下表列出了这四个指示灯的引脚配置信息,请注意原理图编号,信号名称与MCU控制引脚间的对应
在这里插入图片描述

2)软件原理
由图 2.1.1 分析, 要让 LED 点亮, 使 MCU 的 PB4、 PB5、 PB6、 PB7 引脚输
出低电平即可。感知执行模块的 MCU 型号为 STM32F103C8T6,在该芯片上, I/O 引脚
可以被软件设置成各种不同的功能,如输入或输出,所以又被称为 GPIO(General Purpose
I/O)。 而 GPIO 引脚又被分为 GPIOA、 GPIOB、 GPIOC、 GPIOD 四个不同的组,除了
GPIOD 分为 3 个引脚外,其他组都分为 0~15 共 16 个不同的引脚。
因此, LED 的控制逻辑如下:

  1. GPIO 端口引脚多——就要选定需要控制的特定引脚。
  2. GPIO 功能如此丰富——配置需要的特定功能。
  3. 控制 LED 的亮和灭——设置 GPIO 输出电压的高低。
    下面,根据硬件原理图分析程序代码,见下图。
    在这里插入图片描述

4. 实验步骤

1.将USB3.0数据线的一端连接感知执行模块的USB3.0调试烧写口,另一端连接ST-Link调试器的“Debug”接口。
2.将USB2.0方口线的一端连接PC机的USB口,另一端连接ST-Link调试器“USB-Debug”接口。
3.编写程序。
4.在工具栏中点击按钮,编译工程成功后,信息框中出现“0 Error(s),0 Warning(s)”的信息。如果编译失败,检查确认相关选项是否配置正确。
5.确认与硬件调试相关的选项已设置正确。
6.点击“LOAD”按钮,将程序下载到温湿度传感器模块中。下载成功后,信息框显示下图所示的信息,表明程序下载成功并已自动运行。
在这里插入图片描述
7.观察模块上四个指示灯的变化。

5 实验程序

#include "stm32f10x.h"
void gpio_init(void) // GPIO 的初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO_InitTypeDef 类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE); 
// 开启 AFIO 时钟和 GPIOB 的外设时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 禁用 JTAG 功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6|GPIO_Pin_7;
// 选择要控制的 GPIOB 引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为 50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); // 调用库函数,初始化 GPIOB
}
void Delay(unsigned int i)
{
	unsigned int j,k;
	for(j = 0 ; j < i ; j++)
		for(k = 0 ; k < 10000; k++);
}
void led_set(int num,int sta)
{
	if(num==1)
	{
		if(sta==0){
	GPIO_WriteBit(GPIOB,GPIO_Pin_4,(BitAction)0x00);}
		if(sta==1){
	GPIO_WriteBit(GPIOB,GPIO_Pin_4,(BitAction)0x01);}
		}
		if(num==2)
	{
		if(sta==0){
	GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)0x00);}
		if(sta==1){
	GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)0x01);}
		}
		if(num==3)
	{
		if(sta==0){
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,(BitAction)0x00);}
		if(sta==1){
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,(BitAction)0x01);}
		}
		if(num==4)
	{
		if(sta==0){
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0x00);}
		if(sta==1){
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0x01);}
		}
	}
void led_init(void)
{
	int i;
for(i=1;i<5;i++)
{
led_set(i,1); // 关闭四个 LED
}
}
int main(void) // 主函数
{
gpio_init(); // GPIO 初始化
led_init(); // LED 初始化
while(1) // 周期性控制 status 指示灯点亮与熄灭
{
 led_set(1,0); // 点亮 Status 指示灯
 Delay(500); // 延时子程序
 led_set(1,1); // 熄灭 Status 指示灯
 Delay(500);
 led_set(2,0); // 点亮 RS485-R 指示灯
 Delay(500);
 led_set(2,1); // 熄灭 RS485-R 指示灯
 Delay(500);
 led_set(3,0); // 点亮 RS485-T 指示灯
 Delay(500);
 led_set(3,1); // 熄灭 RS485-T 指示灯
 Delay(500);
 led_set(4,0); // 点亮 User1 指示灯
 Delay(500);
 led_set(4,1); // 熄灭 User1 指示灯
 Delay(500);
 }
}

6 实验结果

程序成功运行后,将可以看到 Status、 RS485-R、 RS485-T、 User1 四个指示灯逐个点亮。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验心得

实验中,开始环境配置不成功,后面发现设备出现问题,更换设备之后可以完成实验。
实验中建立工程的过程中一定要正确的完成相关配置,否则实验结果会不正确。通过编写部分程序代码,知道了如何初始化配置STM32的GPIO引脚,掌握了控制 LED的程序代码。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐