模块2 STM32程序开发-项目2 STM32 基础应用-任务1 点亮LED灯
基于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 输出打印信息
更多推荐


所有评论(0)