基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网

任务1 点亮LED灯

一、任务描述

本任务基于STM32F103C8T6最小系统板,硬件连接为PA6 引脚驱动LED灯。在Keil中编写、编译、下载程序,实现GPIO输出高电平点亮 LED的功能,掌握STM32 GPIO最基础的输出控制方法。

二、任务目标

1.知识目标

1)理解STM32 GPIO端口的输出模式、推挽输出、开漏输出工作原理。

2)掌握LED点亮的硬件原理:高电平点亮/低电平点亮的区别。

3)熟悉HAL库中GPIO初始化、电平控制的核心函数。

4)了解STM32工程下载、运行的完整流程。

2.能力目标

1)能够生成工程并在Keil中编写GPIO电平控制代码。

2)能够独立完成程序编译、下载,实现LED点亮功能。

3)能够排查硬件接线、软件配置导致的LED不亮问题。

3.素质目标

1)培养嵌入式开发先配置、后编程、再调试的规范流程。

2)提升硬件与软件结合的分析、调试能力。

3)养成严谨、耐心排查问题的工程素养。

三、任务重难点

1.任务重点

1)PA6引脚正确配置:GPIO推挽输出、无上拉下拉、低速模式。

2)掌握HAL库控制GPIO电平函数:HAL_GPIO_WritePin()。

3)区分LED高电平点亮/低电平点亮,正确设置输出电平。

4)工程编译无错误,程序成功下载并运行。

2.任务难点

1)硬件判断:LED是高电平点亮还是低电平点亮。

2)正确调用HAL库GPIO函数,参数匹配无误。

3)排查LED不亮原因:接线错误、引脚配置错误、电平设置错误。

4)解决下载失败、程序不运行的基础问题。

四、知识准备

1.STM32F103C8T6的GPIO详细介绍

(1)GPIO基本概念

GPIO(General Purpose Input Output)通用输入输出口,是STM32单片机与外部硬件(LED、按键、传感器等)交互的最基础接口。STM32F103C8T6一共有GPIOA、GPIOB、GPIOC三组端口,每组端口包含16个引脚(Pin0~Pin15),如图1所示。本任务使用:GPIOA第6号引脚——PA6。

(2)GPIO端口结构

每组GPIO包含:

一组16个引脚

控制寄存器(控制模式、速度、电平)

数据寄存器(读取/写入引脚电平)

(3)GPIO四种工作模式

输入模式:读取外部电平(按键、传感器)

输出模式:控制外部设备(LED、继电器)

复用功能模式:串口、SPI、I2C等硬件外设

模拟模式:ADC采集

(4)GPIO输出模式(点亮LED必须掌握)

输出模式分为两种:

推挽输出(Push-Pull)

可输出强高电平+强低电平,驱动能力强,适合驱动LED。

开漏输出(Open-Drain)

只能输出强低电平,需要外部上拉,一般不用于LED。

本任务PA6必须配置为:通用推挽输出

(5)GPIO上拉/下拉(Pull-up/Pull-down)

上拉:引脚默认高电平

下拉:引脚默认低电平

无上拉无下拉:电平由程序控制

点亮LED推荐:无上拉无下拉

(6)GPIO输出速度

低速(2MHz)

中速(10MHz)

高速(50MHz)

LED属于慢速设备,使用低速即可。

图1 STM32F103C8T6引脚定义

2.HAL库GPIO函数详细使用(点亮LED核心)

(1)GPIO初始化结构体

GPIO_InitTypeDef GPIO_InitStruct ={0};

//开启GPIOA时钟

__HAL_RCC_GPIOA_CLK_ENABLE();

//配置PA6为推挽输出、无上下拉、低速

GPIO_InitStruct.Pin = GPIO_PIN_6;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;

//初始化引脚

HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);

(2)最核心函数:设置引脚电平(点亮/熄灭LED)

HAL_GPIO_WritePin(GPIOx,GPIO_Pin,PinState);

三个参数含义:

GPIOx:端口,如GPIOA

GPIO_Pin:引脚号,如GPIO_PIN_6

PinState:电平状态

GPIO_PIN_SET→高电平(1)

GPIO_PIN_RESET→低电平(0)

(3)点亮LED常用代码示例

//点亮LED(根据硬件决定高低电平)

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);

//熄灭LED

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);

(4)翻转电平函数(闪烁LED用)

GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);

3.LED点亮原理知识

(1)LED点亮条件

LED是单向导通的二极管,必须加正向电压才会亮。

(2)两种常见电路

低电平点亮(最常见)

PA6输出0→LED亮

PA6输出1→LED灭

高电平点亮

PA6输出1→LED亮

PA6输出0→LED灭

4.时钟使能知识(非常重要)

GPIO使用前必须开启时钟!

__HAL_RCC_GPIOA_CLK_ENABLE();

如果不开启时钟,GPIO无法工作,LED不会亮。

5.程序执行流程知识

(1)系统初始化(时钟、GPIO)

(2)进入main函数

(3)执行MX_GPIO_Init()初始化PA6

(4)在while(1)之前点亮LED

(5)程序保持运行,LED常亮

五、硬件连接

LED模块接线如图2所示:

U6 为 LED 灯模块,有两个引脚:

引脚 1(标记为 A6):直接连接到 STM32 核心板的 PA6 引脚,作为 LED 的控制端。

引脚 2(标记为 GND):直接连接到系统地(GND)。

图2 LED模块接线

六、任务实现
任务1.1重定义fputc函数

为了让printf函数输出的打印信息重定向到串口调试助手,在usart.c文件中添加如下代码:

/* USER CODE BEGIN 0 */

#include <stdio.h>

/*********************************************************

*

*重定义fputc函数

*

*********************************************************/

int fputc(int ch,FILE *f)

{

HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );

return ch;

}

/* USER CODE END 0 */

任务1.2 添加LED驱动

1.在项目根目录新建hardware文件夹,在其中再建src和inc两个文件夹,将led.c文件放到src文件夹中,将led.h文件放到inc文件夹中,如图3所示。

图3 新建hardware文件夹

2.在项目根目录下的MDK-ARM下双击TEST.uvprojx文件,打开工程,如图4所示。

图4 打开工程

3.单击按钮,打开”Manager Project Items”对话框,点击按钮,添加hardware,再点击“Add Files...”按钮,将hardware\src下led.c文件添加进来,如图5所示。

图5 添加led.c文件

4.单击按钮,打开“Options for Target ’TEST’”对话框,选择“C/C++”选项卡,在“Include Paths”后选择头文件所在目录“hardware\inc”,如图6所示。

图6 选择“hardware\inc”

任务1.3 修改main.c文件

1.添加头文件

在main.c文件中添加头文件。

/* USER CODE BEGIN Includes */

//C库

#include <string.h>

#include <stdio.h>

//LED驱动

#include "led.h"

/* USER CODE END Includes */

2.在main函数中添加如下代码。

 /* USER CODE BEGIN 2 */

Led_Init(); //LED初始化

    printf("任务1 点亮LED灯\r\n");

Led_Set(LED_ON);

  /* USER CODE END 2 */

任务1.4 编译、下载程序,查看结果

1.点击编译按钮,编译程序。

2.点击下载按钮,下载程序。

3.打开串口调试助手,按stm32f103c8t6主控板上的复位键,在串口调试助手中输出打印信息,如图7所示,同时LED灯点亮。

图7 输出打印信息

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐