【STM32】标准库与HAL库对照学习教程三--使用库函数配置GPIO点亮LED灯


STM32全部教程【STM32】标准库与HAL库对照学习系列教程大全

一、前言

本章主要介绍如何使用标准库工程cubemx配置工程使LED灯闪烁,可以直接点击目录看自己想要看的内容,文章教程可以让您一步一步学会如何用标准库工程与cubemx使LED闪烁。

二、准备工作

  • STM32开发板(我使用的是普中的STM32F103ZE的Z200系列)
  • STM32cubemx、Keil5(MDK)、开发板原理图
  • 标准库工程模板

有关STM32芯片GPIO的讲解可以看这篇文章:【STM32】SMT32标准库与HAL库对照学习教程特别篇–GPIO详讲
有关库函数工程模板的创建可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
标准库模板工程文件我已上传至百度网盘,网盘链接https://pan.baidu.com/s/1Ok_wIMi1V1cVAHdGETPJzQ
密码:lob1

三、LED硬件电路

硬件原理图看自己的开发板
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


可以看到开发板的两个LED分别由PE5PB5引脚控制,由原理图可知,当两引脚给低电平时,发光二级管LED导通,LED被点亮,给高电平时,LED灯熄灭。

四、使用标准库工程点亮LED灯

1、GPIO初始化一般步骤

  • 打开对应GPIO引脚时钟
  • 定义GPIO端口结构体变量
  • 配置结构体变量(设置IO、设置模式、设置速率)。
  • 初始化GPIO函数

2、GPIO标准库函数介绍

(1)GPIO外设库的文件:
stm32f10x_gpio.c
stm32f10x_gpio.h
(2)GPIO常用标准库函数:


void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)

功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器


void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, 
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

功能:设置端口管脚输出电平,很少使用


uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t 
GPIO_Pin);

功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器


uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

功能:读取某组端口的输入电平。底层是通过读取IDR寄存器


uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t 
GPIO_Pin);

功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器


uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

功能:读取某组端口的输出电平。底层是通过读取ODR寄存器


(3)使能GPIO时钟函数

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

3、使用库函数编写程序使LED灯闪烁操作

(1)复制模板工程,重新命名为库函数点亮LED
在这里插入图片描述


(2)在工程文件中新建一个App文件夹,专门用来存放外设文件
在这里插入图片描述
(3)App在新建一个LED文件夹用来存放LED的.c和.h文件。
在这里插入图片描述

这样做的好处是便于移植外设文件


(4)打开工程,新建文件,格式保存为.h,写入LED初始化申明部分。


  • 在这里插入图片描述

  • 在这里插入图片描述

  • 程序:
#ifndef LED_H_
#define LED_H_

#include "stm32f10x.h"

/* 宏定义LED时钟端口、引脚的定义 */
#define LED0_GPIO_Port   GPIOB
#define LED0_Pin         GPIO_Pin_5
#define LED0_Port_RCC    RCC_APB2Periph_GPIOB

#define LED1_GPIO_Port   GPIOE
#define LED1_Pin         GPIO_Pin_5
#define LED1_Port_RCC    RCC_APB2Periph_GPIOE

void LED_Init(void);  //LED初始化函数

#endif

(5)新建文件,格式保存为.c,写入LED初始化函数。


  • 在这里插入图片描述

  • 程序:
#include "LED.h"


/*************************************************
*函数名:    LED_Init
*函数功能:  LED灯初始化函数
*输入:      无
*返回值:    无
**************************************************/
void LED_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
	
	RCC_APB2PeriphClockCmd(LED0_Port_RCC|LED1_Port_RCC,ENABLE); //使能时钟
	
	GPIO_InitStructure.GPIO_Pin=LED0_Pin;           //选择设置LED0的IO口
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //设置推挽输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//设置传输速率
	GPIO_Init(LED0_GPIO_Port,&GPIO_InitStructure);  /* 初始化GPIO */
	GPIO_SetBits(LED0_GPIO_Port, LED0_Pin);         //输出高电平,LED0熄灭
	
	GPIO_InitStructure.GPIO_Pin=LED1_Pin;           //选择设置LED1的IO口
	GPIO_Init(LED1_GPIO_Port,&GPIO_InitStructure);  /* 初始化GPIO */
	GPIO_SetBits(LED1_GPIO_Port, LED1_Pin);         //输出高电平,LED01熄灭
}

(6)添加文件在目录,并添加文件路径。


  • 在这里插入图片描述

  • 在这里插入图片描述

(7)编写主函数,并编译烧入程序。
程序:

#include "LED.h"

/*************************************************
*函数名:   delay
*函数功能: 延时函数,通过while循环占用CPU,到达延时目的
*输入:     i
*返回值:   无
**************************************************/
void delay(u32 i)
{
	while(i--);
}

/*************************************************
*函数名:    main
*函数功能: 主函数
*输入:     无  
*返回值:   无
**************************************************/
int main()
{
	LED_Init();
	while(1)
	{
		GPIO_SetBits(LED0_GPIO_Port, LED0_Pin);
		GPIO_ResetBits(LED1_GPIO_Port, LED1_Pin);
		delay(6000000);
		GPIO_SetBits(LED1_GPIO_Port, LED1_Pin);
		GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin);
		delay(6000000);
	}
}

  • 编译后无错误,无警告,烧入程序到开发板。
    在这里插入图片描述

我使用的普中提供的串口烧入软件

在这里插入图片描述

4、实验效果

在这里插入图片描述

五、使用cubemx生成HAL库工程点亮LED灯

有关cubemx一些使用可以看:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
有关cubemx功能部分,下面的配置不会多做介绍。

1、cubemx配置生成工程

(1)打开cubemx,点击ACCESS TO MCU SELECTOR
在这里插入图片描述


(2)选择自己开发板的芯片。
在这里插入图片描述


(3)配置SYS
在这里插入图片描述


(4)配置RCC,选择外部时钟
在这里插入图片描述


(5)配置PB5、PE6引脚。


  • 在这里插入图片描述

  • 在这里插入图片描述

PE5操作相同


(6)点击GPIO配置模式。
在这里插入图片描述

PE5操作相同


(7)配置时钟树
在这里插入图片描述
有关时钟树不懂的可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程特别篇–系统时钟RCC详讲


(8)点击Project Manager,配置文件,生成工程。


  • 在这里插入图片描述

重点提醒:路径和工程名都不要带中文


  • 在这里插入图片描述

2、HAL库控制函数介绍

(1)GPIO外设库的文件:
stm32f10xx_hal_gpio.h
stm32f10xx_hal_gpio.c
(2)操作GPIO常用HAL库函数:


GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

功能:读取一个引脚的电平


void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

功能:写一个引脚的电平,可写高电平,也可以是低电平


void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

功能:翻转一个引脚的电平


3、编写使LED灯闪烁的程序

程序:

HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(500);  //HAL库自带的ms级延时函数
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);

在这里插入图片描述

编译后0错误0警告,烧入到开发板。

在这里插入图片描述

4、实验效果

在这里插入图片描述
到这里就结束啦!
在这里插入图片描述

  • 28
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要实现STM32F103HAL库点亮LED,你可以按照以下步骤进行操作: 1. 首先,确保你的工程环境已经搭建好,并且STM32F103芯片已经正确连接到开发板上。 2. 在代码包中,找到点亮LED的代码程序。该程序会使用HAL库函数来控制GPIO引脚输出来点亮LED。 3. 打开IDE,选择你使用的IDE,例如STM32CubeIDE或Keil MDK-ARM。 4. 在IDE中创建一个新项目,并设置项目名称为"led" 。 5. 生成代码。点击IDE中的"Generate Code"按钮,根据你选择的IDE生成代码。 6. 配置下载器。在CubeIDE中,点击"Run"按钮,然后在弹出的配置选项中选择下载器的类型,如果你使用的是ST-LINK调试探头,选择"ST-LINK(ST-LINK GDB Server)",如果你使用的是J-Link调试探头,选择第二项"J-LINK"。其他选项保持默认即可。 7. 下载代码。将生成的代码下载到STM32F103芯片上。 8. 运行代码。当代码成功下载到芯片上后,LED应该会点亮。 这样,你就可以使用STM32F103HAL库点亮LED了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32F103C8T6(HAL库)部分例程(点、串口通信)](https://download.csdn.net/download/weixin_43716074/12874935)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一、【STM32 HAL库开发】点亮led](https://blog.csdn.net/qq_27849725/article/details/121937526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值