使用STM32CubeMX实现LED闪烁

news2025/2/22 13:22:58

需提前学习:STM32CubeMX新建工程并点亮一个LED;

目录

打开GPIO相关文件

我们需要看的部分

HAL_GPIO_ReadPin()

HAL_GPIO_WritePin()

函数声明

GPIOx 

GPIO_Pin

PinState

HAL_GPIO_TogglePin()

函数声明

GPIOx和GPIO_Pin

HAL_GPIO_LockPin()

函数声明

GPIOx和GPIO_Pin

返回值

延时函数

实验

使用HAL_GPIO_TogglePin()实现闪烁

使用HAL_GPIO_WritePin()实现闪烁


首先还是我们点灯的工程文件,本文我主要介绍GPIO相关库函数的使用。

打开GPIO相关文件

在Drivers/STM32F1xx_HAL_Driver文件夹下找到stm32f1xx_hal_gpio.c文件,双击即可打开。 

我们需要看的部分

这个文件中,我们只需要看How to use this driver部分。这部分介绍了GPIO的HAL库使用。

一些不重要的部分我就不说了,会讲解的部分在下图标号了。其他部分都不太重要,想了解的可以用翻译软件翻译一下。

HAL_GPIO_ReadPin()

这个是引脚为输入才使用的函数,我们点亮LED为输出,所以用不了。就先不介绍了,之后在按键扫描的时候说。

HAL_GPIO_WritePin()

函数声明

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

GPIOx 

这个是设置为哪个端口,现在我们是想让PB5输出,所以应该在函数中传入GPIOB。

可选参数如下

#define GPIOA               ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *)GPIOD_BASE)
#define GPIOE               ((GPIO_TypeDef *)GPIOE_BASE)
#define GPIOF               ((GPIO_TypeDef *)GPIOF_BASE)
#define GPIOG               ((GPIO_TypeDef *)GPIOG_BASE)

GPIO_Pin

这个是设置让哪个引脚输出,现在我们是想让PB5输出,所以应该在函数中传入GPIO_PIN_5。

可选参数如下。

注意一下,GPIO_PIN_All就是同时控制PIN0到PIN15共16个引脚。

#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */
#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected    */
#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected    */
#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected    */
#define GPIO_PIN_4                 ((uint16_t)0x0010)  /* Pin 4 selected    */
#define GPIO_PIN_5                 ((uint16_t)0x0020)  /* Pin 5 selected    */
#define GPIO_PIN_6                 ((uint16_t)0x0040)  /* Pin 6 selected    */
#define GPIO_PIN_7                 ((uint16_t)0x0080)  /* Pin 7 selected    */
#define GPIO_PIN_8                 ((uint16_t)0x0100)  /* Pin 8 selected    */
#define GPIO_PIN_9                 ((uint16_t)0x0200)  /* Pin 9 selected    */
#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 selected   */
#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 selected   */
#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 selected   */
#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 selected   */
#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 selected   */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */
#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */

PinState

这个是设置指定引脚输出高电平还是低电平。

GPIO_PIN_RESET  //引脚输出低电平
GPIO_PIN_SET    //引脚输出高电平

HAL_GPIO_TogglePin()

让指定引脚电平反转,意思就是如果指定的引脚原来是高电平,使用这个函数之后就是低电平。如果原来是高电平,使用这个函数之后就是低电平。

函数声明

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

GPIOx和GPIO_Pin

同上

HAL_GPIO_LockPin()

这个是用于锁死指定引脚输出的。如果指定引脚为高电平,使用这个函数之后,引脚只能为高电平。就算你之后调用HAL_GPIO_TogglePin()或者HAL_GPIO_WritePin()更改他的输出,也做不到。

改引脚直至程序复位(按下复位键,或者拔下供电口重新插上),才会解锁。

函数声明

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

GPIOx和GPIO_Pin

同上

返回值

我们看这个函数的返回值,如果锁死成功返回HAL_OK。锁死失败返回HAL_ERROR 

  if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK))
  {
    return HAL_OK;
  }
  else
  {
    return HAL_ERROR;
  }

延时函数

HAL自带延时函数HAL_Delay(x)。单位为ms

实验

现在我们知道了这几个函数了。HAL_GPIO_ReadPin()用不了,HAL_GPIO_LockPin()新手不建议使用。我们现在分别使用HAL_GPIO_TogglePin()和HAL_GPIO_WritePin()函数实现。

注意:这里的LED_R_GPIO_Port是GPIOB,LED_R_Pin是GPIO_PIN_5

详情请看:STM32CubeMX新建工程并点亮一个LED的 新建工程->User Label部分

使用HAL_GPIO_TogglePin()实现闪烁

我只提供while(1)中程序,其他地方不用改动。

  while (1)
  {
    /* USER CODE END WHILE */
		HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
		HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

使用HAL_GPIO_WritePin()实现闪烁

  while (1)
  {
    /* USER CODE END WHILE */
		HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
		HAL_Delay(1000);
		HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
		HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

538页21万字数字政府大数据云平台项目建设方案

2 项目建设需求 2.1 项目建设目标 2.2 项目建设内容 2.3 项目建设要求 2.3.1 基础设施服务建设 2.3.2 信息安全服务建设 2.3.3 运行保障服务建设 2.3.4 业务应用支撑建设 3 平台建设方案 3.1 总体建设原则 3.2 总体方案设计 3.2.1 方案设计思路 3.2.2 总体架构设计 …

Spark RDD编程模型及算子介绍(二)

文章目录常见的Action算子常见分区操作算子常见的Action算子 countByKey算子:统计Key出现的次数,部分代码如下: rdd_file sc.textFile("../Data/input/words.txt") rdd_map rdd_file.flatMap(lambda line: line.split(" &…

Mybatis拦截器源码详解

Mybatis拦截器源码详解Mybatis相关全览一、简介执行与添加顺序拦截器生效入口二、使用例子三、原理加载入口生成代理遍历拦截器匹配&生成代理四、实践例子本文用的是3.5.10版本 源码地址:https://github.com/mybatis/mybatis-3/releases 文档地址:ht…

【云原生监控系列第三篇】Prometheus普罗米修斯进阶——PromQL的指标类型

目录一、PromQL 的指标类型1.1 Counter1.2 Gauge1.3 Histogram1.4 Summary1.5 Histogram 与 Summary 的异同二、Prometheus 的聚合函数三、PromQL 的聚合表达式一、PromQL 的指标类型 PromQL 有四个指标类型: Counter :计数器,用于保存单调递…

医疗产品设计的重要性,你了解多少?

医疗产品设计直接关系患者生活的方式与治疗,一个好的医疗产品设计不但要逐渐细化、便于实际操作,而且还要有利于医师操纵,让患者觉得舒服。这是一种具备重大意义的产品。让我们一起来看看有关医疗产品设计的具体内容! 什么叫医疗产品设计? 医…

【Java技术专题】「原理分析系列」Lambda表达式实现原理分析

Lamdba表达式起源 java8引入了lambda表达式是我们java编程方式变革的一个伟大的创举,由了它我们可以采用闭包的形式区开发任何想开发的方法,让java程序与C或者C更加有了贴合的感觉,虽然编程方式和我们目前的命令式编程方式有很大的不同&#…

仿真必修课:计算电磁学入门(附件参考文献与笔记)

转载自电磁CAEer ,作者:刘兵 “作为一个电磁设计师,有必要了解计算电磁学吗?” 答案是肯定的。电磁计算从业人员按照分工大致可以分为两类:一类从事CEM(计算电磁学),一类从事CAE&a…

ROS 开源项目 TurtleBot3 安装与使用

功能介绍 启动slam完成地图的搭建与保存启动navigation并读取保存的地图,完成自动导航。 注:人工咨询 如果按照下面方案也无法成功解决,可以进入我淘宝咨询,可进行远程辅助解决。 1、安装部分 1.1 创建工作空间lee_ws mkdir…

java项目-第140期ssm高校二手交易平台-ssm毕业设计_计算机毕业设计

java项目-第140期ssm高校二手交易平台-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm高校二手交易平台》 该项目分为2个角色,管理员和用户。 用户在前台浏览商品,并且可以进行购买。用户购买后可以在后台查看自己的订单等…

论文阅读-基于低秩分解的网络异常检测综述

论文地址:基于低秩分解的网络异常检测综述 摘要: 异常检测对于网络管理与安全至关重要.国内外大量研究提出了一系列网络异常检测方法,其 中大多数方法更关注数据包及其独立时序数据流的分析、检测与告警,这类方法仅仅利用了网络数据之 间的…

嵌入式分享合集104

一、不用串口,如何打印STM32单片机log 本文主要介绍在嵌入式开发中用来输出log的方法。 最常用的是通过串口输出uart log,这种方法实现简单,大部分嵌入式芯片都有串口功能。但是这样简单的功能有时候却不是那么好用,比如&#xf…

入门 Activiti 工作流,通俗易懂

概念 工作流。通过计算机对业务流程自动化执行管理,主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 Activiti7 介绍 Activiti是一个工作…

Spring启动流程

Spring启动流程 按Bean状态描述: 创建Bean工厂对Bean工厂后置处理通过Component和Import扫描BeanDefinition,加入到Bean工厂注册Bean后置处理器,用于拦截Bean创建实例化填充属性初始化 调用aware方法BeanPostProcessor实例化前执行调用初始…

【java进阶01:final关键字】final修饰的变量只能赋一次值

目录 final修饰的类无法继承。 final修饰的引用一旦指向某个对象,则不能再指向其他对象,但该引用指向的对象内部的数据是可以修改的。​编辑 final修饰的实例变量必须手动初始化,因为系统不会赋默认值,强制手动赋值&#xff0c…

【router-view】切换组件 深刻理解用法 vue的设计思想

之前学的时候没学明白,导致写项目有些功能的实现上走了歪路。 今天询问了学长,更加深刻的理解的Vue的设计思想。 因为vue是单页面应用,所以学会用router-view来切换频繁变化的地方的组件是非常重要的。 之前,我的一个主页组件由…

Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息查看Linux的内核版本和系统是多少位的Ubuntu版本各种验证禁用nouveau安装显卡驱动卸载显卡驱动安装显卡驱动加入PPA,然后更新库方法一&#xf…

maven离线模式及设置

maven离线模式及设置 maven离线模式使用场景? 遇到的问题: 最近遇到个项目支持,他在打jar包的时候,总是去网上下载 maven依赖,不去找我本地仓库的,就比较头大,原因不明 现在需求:就…

SpringBoot 玩一玩代码混淆,防止反编译代码泄露

编译 简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。 比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进…

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm农产品供销服务系统》 该项目分为2个角色,管理员和用户。 用户可以浏览前台,包含功能有: 首页、农产品、农产品资讯、我的、跳转到后…

JavaScript DOM中获取元素、事件基础、操作元素、节点操作

目录 JavaScript事件三要素 常见的事件​编辑 2、执行事件的步骤: 1. 获取元素 1.1 方式 1.1.1 根据ID获取 1.1.2 根据标签名获取 1.1.3 通过html5新增的方法获取 1.1.4 特殊元素获取 2. 事件基础 2.1 事件三要素 2.1.1 事件源 2.1.2 事件类型 2.1.3…