实验一 GPIO口控制LED实验
1 实验目的
- 了解和掌握如何控制 STM32 的 GPIO;
- 掌握控制 LED 电路原理及程序代码;
2 实验环境
- 硬件:1 空气温湿度传感器模块1 个 ST-Link 调试器、1 根 USB2.0 方口线、1 根 USB3.0 数据线、1 台 PC 机;
- 软件: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 型号为 STM32F103C8T在芯片上, I/O 引脚 软件可以设置为输入或输出等各种功能,因此也称为 GPIO(General Purpose I/O)。 而 GPIO 引脚又分了 GPIOA、 GPIOB、 GPIOC、 GPIOD 除了 GPIOD 分为 3 除了个引脚,其他组分为 0~15 共 16 不同的引脚。 因此, LED 控制逻辑如下:
- GPIO 端口引脚多——需要控制的特定引脚。
- GPIO 配置所需的特定功能如此丰富。
- 控制 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的程序代码。