当前位置: 首页 > news >正文

基于HAL库控制LED流水灯

一. 了解并掌握HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:

1、重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。

2、接上,再用GPIO端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。

二. 在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。

文章目录

  • 一、安装 stm32CubeMX及项目创建
  • 二、GPIO端口完成2只LED灯的周期闪烁
    • 1、代码编写
    • 2、编译与烧录
  • 三、中断控制LED周期性闪烁
    • 1、创建项目
    • 2、代码编写
    • 3、编译和烧录
  • 四、使用Keil观察波形
    • 1、设置相关参数
    • 2、点击放大镜,选择逻辑分析仪->点击setup,选择要观察的引脚
    • 3、最终波形及分析
  • 总结
  • 参考资料

一、安装 stm32CubeMX及项目创建

参考资料:https://blog.csdn.net/weixin_56102526/article/details/120877293

二、GPIO端口完成2只LED灯的周期闪烁

这里用到的2只LED灯分别接PA5、PA6端口。

1、代码编写

在main.c文件的main函数下的while循环中,添加下面几行代码。

注意所有自己编写的代码请放在/* USER CODE BEGIN XXX / / USER CODE END XXX */之间;这样我们修改工程的时候你自己写的代码就不会被删除。

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);  // PA6亮HAL_Delay(1000); // 延时1sHAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);  // PA6灭HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);  // PA5亮HAL_Delay(1000); // 延时1sHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);  // PA5灭

2、编译与烧录

点击魔法棒

点击Debug->点击Settings

在这里插入图片描述

点击Flash Download->勾选Reset and Run->点击确定

在这里插入图片描述

将面包板与电脑连接,点击编译后,再点击load

在这里插入图片描述

最终的效果

在这里插入图片描述

三、中断控制LED周期性闪烁

设置PA5、PB9端口分别接一个LED灯,其次设置PA0接一个开关。设置LED灯初始状态为灭,即GPIO口初始化为高电平;因为当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作,所以PA0口选择上升沿下降沿触发。这里设置一个变量n,当该变量为0时流水灯工作,当n为1时流水灯停止,而这个变量由中断函数内部控制,当检测到电平变化时,将n取反,0变1,1变0,实现整个过程。

1、创建项目

(1)选择芯片,STM32F103C8T6

在这里插入图片描述

在这里插入图片描述

(2)时钟RCC配置

在这里插入图片描述

(3)SYS配置

在这里插入图片描述

(4)GPIO配置

在芯片图中选择PA5、PB9为GPIO_Output,PA0设置为EXTI0_Line

在这里插入图片描述

点击左侧表格,设置PA5、PB9初始状态为High;选中PA0,将GPIO Mode设置为上升沿下降沿触发,将GPIO Pull-up/Pull-down设置为上拉电阻模式(Pull-up),别名设置为switch interrupt

(6)NVIC配置

勾选如图所示的中断方式

在这里插入图片描述

(7)时钟树配置

在这里插入图片描述

(8)设置工程名与工程路径
在这里插入图片描述

(9)设置工程文件,并导出

在这里插入图片描述
在这里插入图片描述

2、代码编写

定义全局变量

uint8_t n=0;

中断触发函数的设置

在Keil文件中的在Keil文件中的stm32f1xx_hal_gpio.c文件可以找到中断服务函数。HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。

前面的 __weak 表示此函数为虚函数,需要用户重写的。

在这里插入图片描述

我们在main.c文件中找个地方重新写一下。

位置在main函数下方。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源{                                                                                                                                                                                                                                                                     n=!n;//转变n的状态}
}

在这里插入图片描述

在main.c文件的main函数下的while循环中,添加下面几行代码。

   switch(n){case 0:{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA4亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_Delay(1000);//延时1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA4熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC15熄灯HAL_Delay(1000);//延时1s	break;}case 1:   {HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,1);break;}}

3、编译和烧录

步骤与上一个实验一致

烧录结果

HAL

四、使用Keil观察波形

1、设置相关参数

点击魔法棒->点击Debug

在这里插入图片描述

2、点击放大镜,选择逻辑分析仪->点击setup,选择要观察的引脚

点击右上角的添加输入:

输入PORTX.y回车,信号输入类型选择bit(X为GPIO口号,y为选择的引脚号)

在这里插入图片描述
在这里插入图片描述

3、最终波形及分析

在这里插入图片描述

由波形可知,一个波形的变化约为1s,与我们预期设计一致。

总结

这次HAL库点灯实验,相比于标准库和寄存器,它的编写显得更加简单。提高了动手能力,也对中断函数的应用更加熟练。

参考资料

https://blog.csdn.net/m0_63650001/article/details/133896352

https://blog.csdn.net/weixin_55376063/article/details/127414616

相关文章:

基于HAL库控制LED流水灯

一. 了解并掌握HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务: 1、重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。 2、接上,再用GPIO端某一管脚接一个开关(用杜邦…...

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master(2C/4G) 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01(2C/2G) 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02(…...

明天(周六)下午!武汉Linux爱好者线下沙龙,我们在华中科技大学等你!

2024 年 5月 25 日(周六)下午,我们将在「武汉市洪山区」 珞喻路 1037 号华中科技大学南五楼 613 室举办武汉 Linux 爱好者线下沙龙(WHLUG),欢迎广大 Linux 爱好者来到现场,与我们一同交流技术&a…...

MySQL主从复制(五):读写分离

一主多从架构主要应用场景:读写分离。读写分离的主要目标是分摊主库的压力。 读写分离架构 读写分离架构一 架构一结构图: 这种结构模式下,一般会把数据库的连接信息放在客户端的连接层,由客户端主动做负载均衡。也就是说由客户…...

阿里巴巴 EasyExcel 真正的高效与通用导入(亿级数据秒级导入)

需要lombok、hutool、alibaba EasyExcel 相关依赖包 基于Lamba表达式的通用监听器 import cn.hutool.core.util.StrUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.experimental.UtilityClass…...

32.5k star!!替换 postman?【送源码】

在软件开发过程中,API(应用程序接口)扮演着至关重要的角色。为了确保 API 的可靠性和性能,开发人员需要一种高效的方式来测试和调试它们。这方面的工具,大家经常用到的应该就是 postman 了。不过,今天了不起…...

课时135:awk实践_逻辑控制_综合实践

1.3.8 综合实践 学习目标 这一节,我们从 网络实践、文件实践、小结 三个方面来学习 网络实践 简介 所谓的网络实践,主要是借助于awk的数组功能,进行站点的信息统计操作。准备网络环境 安装软件 yum install nignx -y重启nginx [rootloca…...

c++ 读取MNIST数据集实现softmax回归

pytorch教材 3.4. softmax回归 — 动手学深度学习 2.0.0 documentation c实现代码 代码太长了就没整理了&#xff0c;也暂时没有运行效果截图 同样没有本文也没有实现反向自动求导 超长代码警告&#xff0c;757行。不过可能注释占一半 #include <bits/stdc.h> usin…...

JS-04何为继承以及实现方式

目录 1 JS中继承的概念 2 为什么要使用继承&#xff1f;-解决内存浪费 2.1 问题引入 2.2 问题解决 2.3 拓展 3 继承的实现方式 3.1 原型链继承 1 3.2 原型链继承 2 1 JS中继承的概念 通过【某种方式】让一个对象可以访问到另一个对象中的属性和方法&#xff0c;我们把这种…...

6款网站登录页(附带源码)

6款网站登录页 效果图及部分源码123456 领取源码下期更新预报 效果图及部分源码 1 部分源码 <style>* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);}.l…...

spring boot打的包直接运行

Spring Boot 提供了一个插件 spring-boot-maven-plugin 把程序打包成一个可执行的jar包&#xff0c;直接执行java -jar xxx.jar即可以启动程序 1、引用 spring-boot-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot<…...

移除元素-力扣

第一种解法&#xff0c;暴力解法&#xff0c;使用两个for循环一个进行遍历&#xff0c;一个进行覆盖&#xff0c;代码如下&#xff1a; class Solution { public:int removeElement(vector<int>& nums, int val) {int size nums.size();for(int i 0; i < size; …...

代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表

203.移除链表元素 题目链接&#xff1a; 203.移除链表元素 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;做题的时候定义了一个cur指针跳过了目标val遍历了一遍链表&#xff0c;实际上并没有删除该删的节点。 错误代码&#xff1a; public ListNode re…...

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…...

LSPatch免root手机模块应用

软件介绍 LSPatch是一款免root手机模块应用&#xff0c;兼容大部分机型&#xff0c;使用LSPatch&#xff0c;您可以个性化您的Android设备&#xff0c;添加新的功能&#xff0c;修改系统设置&#xff0c;甚至完全改变系统的外观。您可以根据自己的需求选择和安装各种Xposed模块…...

深入解析kube-scheduler的算法自定义插件

目录 ​编辑 一、问题引入 二、自定义步骤 三、最佳实践考虑 一、问题引入 当涉及到 Kubernetes 集群的调度和资源分配时&#xff0c;kube-scheduler 是一个关键组件。kube-scheduler 负责根据集群的调度策略&#xff0c;将 Pod 分配到适当的节点上。kube-scheduler 默认使…...

java原型模式 (Prototype Pattern) 介绍

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有的实例来创建新对象&#xff0c;而不是通过实例化类来创建对象。这个模式允许你创建对象时避免复杂的初始化步骤&#xff0c;并且能够动态地创建对象的副本。 原型模式的关键…...

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档&#xff1a;Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务&#xff0c;复…...

MariaDB 给指定列值自动加密(持久数据加触发器)

文章目录 代码插入时&#xff0c;自动加密更新时&#xff0c;自动加密查看触发器数据操作示例update数据取出解密取 注意一次尝试&#xff0c;看加密后数据长度 参考链接&#xff1a; 一篇非常好的讲解触发器的文章&#xff1a;示例、原理MySQL/MariaDB触发器。 用触发器自动加…...

深入理解Linux系统管理与网络配置高级指南

深入理解Linux系统管理与网络配置高级指南 目录 深入理解Linux系统管理与网络配置高级指南 一、Linux文件系统管理 二、Linux进程管理 三、Linux系统管理 四、Linux网络管理 五、Linux磁盘管理 一、Linux文件系统管理 1.1 文件和目录操作 在Linux中&#xff0c;一切皆…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...