STM32实现HAL库LED点灯

news2024/11/15 12:16:14

目录

一、相关环境

STM32CubeMX

介绍

安装下载

相关配置完善

尝试使用该软件,点亮LED灯

项目创建

代码示例 

二、任务实现

1、使用HAL库方式完成LED灯的周期闪烁

要求1

项目创建

代码示例

要求2

项目创建 

代码示例

2、使用仿真软件分析仪功能观察时序波形

项目创建

结果

代码示例(同上,也可在上面粘贴)

总结


学习目标:

一.  使用HAL库方式完成LED灯的周期闪烁;

二. 使用仿真软件分析仪功能观察时序波形。

一、相关环境

STM32CubeMX

介绍

STM32CubeMX是STMicroelectronics推出的图形化配置工具,简化了STM32微控制器的初始化和配置过程。其直观的界面和自动生成初始化代码的特点,使开发人员能够轻松配置引脚分配、时钟设置和外设参数。支持多种STM32系列微控制器,包括常用的STM32F系列。集成外设配置功能,包括GPIO、UART、SPI等,同时提供硬件资源冲突检测,帮助开发人员避免潜在问题。总之,STM32CubeMX是一款强大而方便的工具,加速了STM32微控制器应用的开发过程。

安装下载

下载地址:https://www.st.com/en/development-tools/stm32cubemx.html

根据以上地址进入官网,选择合适的版本,

再根据以下步骤进行操作,完成下载安装;

 点击应用程序,进入安装:

 接下来选择安装位置;

 等待上述进度条走完,再点击 "Next";

 点击 "Done" 过后,安装成功。

相关配置完善

注意:使用之前要完成用户信息的注册

点击 "Help" ,再选择其目录下的 "Manage ......" ,进入配置界面;

选择 "STM32F1" ,再选择 1.8.5 版本。

下载过后即可完成配置。

尝试使用该软件,点亮LED灯

项目创建

 左上角选择 "STM32F103C8T6" ,再选择下面的 "STM32F103C8T6" ,双击选择,即成功创建项目;

 在 "Categories" 下选择 "SYS" ,然后在 "Debug" 处选择 "Serial Wrie" ;

再选择上方的 "RCC" ,在高速时钟配置下选择最后一项 "Crysta......." ; 

 选择Clock Configuration,根据上图所示进行调整配置;

再配置引脚PC13,选择 "GPIO_Output" ;

 根据指示选择 "MDK-ARM"  ,并且选择 V4 版本;

勾选合适上图所示的部分,完成基本配置。

代码示例 

 注意:主函数代码中在while函数中添加下列代码


 while (1)
  {
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
//自定义部分
        HAL_Delay(500);
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//电平翻转函数
		HAL_Delay(500);
 
  }
  /* USER CODE END 3 */

连接开发板,即可点亮。 

二、任务实现

1、使用HAL库方式完成LED灯的周期闪烁

要求1

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

项目创建

接上述点亮LED灯的 RCC 配置过后,操作如下:


选择PC13,PA15,PB0,设置GPIO_OUTPUT;

并将输出改为高电频模式;

 再根据上述操作过后,接上上述点卡亮LED灯的后续操作,将代码同样处理即可。

代码示例
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1灭
	  
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);  // 灯2亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);  // 灯2灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 灯3亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  // 灯3灭

要求2

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

项目创建 

较上述区别如下:

 将0、1调整为下降沿触发

 再保存编写代码,和上述操作一致。

代码示例

代码操作较上有区别:在main主函数外加入下述代码。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
	switch(GPIO_Pin){
		case GPIO_PIN_0:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
		break;
		case GPIO_PIN_1:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
		break;
	}
}

2、使用仿真软件分析仪功能观察时序波形

具体要求:

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

项目创建

接上述要求1过后的操作

保存并打开项目,自动跳转KEIL

 将代码放入主函数中的while(1)

照上进行配置;

输入(PORTB & 0X00000000)>>0Display Type选择Bit,依次输入(PORTA & 0X00008000)>>15(PORTC & 0X00002000)>>13

完成配置后点击Close即可。

 最后点击图上的位置,完成观察。

结果

代码示例(同上,也可在上面粘贴)

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 灯1亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 灯1灭
	  
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);  // 灯2亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);  // 灯2灭
	  
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 灯3亮
	HAL_Delay(1000); // 延时1s
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  // 灯3灭

总结

相较于传统的标准外设库(SPL)和汇编语言,使用STM32的硬件抽象层(HAL)库可以带来更简化和高效的开发体验。HAL库提供了简单易用的编程接口,通过高级函数封装了对硬件的直接操作,使得代码更易读、易维护,并具有跨系列的代码兼容性。与此相比,传统方法需要更深的硬件了解、代码复杂度更高,并且在移植性方面存在挑战。因此,对于大部分应用而言,HAL库提供了更便捷、高效的开发路径,尤其是在商业应用中追求开发周期和成本效率的情况下。

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

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

相关文章

VS2022配合Qt与boost.asio实现一个TCP异步通信系统远程操作mysql数据库

上一篇博客我们通过boost.asio搭建了一个简单的异步服务器,但是那是基于命令行的,所有用起来还是相当枯燥的,这次我们配合Qt实现一个简陋的前端页面来控制后端mysql数据库中的表,实现添加密钥的功能(本次博客使用的boost版本是1.8…

为什么大部分新手做抖音小店赚不到钱?

大家好,我是喷火龙。 今天来给大家聊聊,为什么大部分新手做抖店赚不到钱? 不知道大家想过这个问题没有,可能有些人把赚不到钱的原因归结于市场、或者平台、又或者运营技术以及做店经验。 但我觉得这些都不是重点,重…

关于RAG(检索增强生成)的一些知识

写在前面 最近一直在看AI相关的文章,不出意外的话,后续几篇应该都是关于这方面的。希望能和大家一起了解这方面的技术。 什么是RAG 检索增强生成 (RAG,全称Retrieval-Augmented Generation) 是一种利用从外部来源获取的事实来提高生成式 AI 模型的准确…

视频监控管理平台LntonCVS安防监控平台实现接入监控视频资源的视频汇聚方案

随着各行业数字化转型的不断推进,视频监控技术在行业内的安防应用及管理支撑日益增多。然而,由于前期规划不清晰、管理不到位等问题,视频监管系统普遍存在以下问题: 1. 各部门单位在视频平台建设中以所属领域为单位,导…

Intellij IDEA创建springboot 3.2.5 项目

1、idea file -> new ->Project 点击 2、创建项目配置 完成配置-> 点击Next 3、选择对应jar 包 -> 点击Create 4、删除 .mvn、mvnw、mvnw.cmd

宝塔Nginx设置图片访问跨域

宝塔Nginx设置图片访问跨域 针对某一个站点设置 找到对应的站点点击 “设置” 增加对应header设置 代码: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${#允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requeste…

数字图像处理系列 | 非线性滤波 (4)

非线性滤波就不能做卷积了 文章目录 前言. 去除噪声如果使用线性滤波 1. 中值滤波2. 重新思考一下 -- 高斯平滑滤波高斯平滑哪里不好用呢?but,我们是不是可以结合高斯平滑滤波的优点和非线性滤波的优点,来做这个去噪呢? 3. Bilat…

融资融券保证金比例,融资融券最低利率4.0%

融资融券保证金比例是指投资者交付的保证金与融资、融券交易金额的比例,用于控制投资者初始资金的放大倍数。这个比例分为融资保证金比例和融券保证金比例。 融资融券保证金比例的计算 1. 融资保证金比例是指投资者融资买入证券时交付的保证金与融资交易金额的比例…

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感,其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…

线程池(详细)

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二&…

2024年电工杯数学建模竞赛思路资料汇总贴

下文包含:2024电工杯(电工杯数学建模竞赛)思路解析、电工杯参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大家…

前端怎么使用svg格式的图片

目录 第一步,找到图标 第二步,使用 第一种,SVG下载 第二种,粘贴SVG代码 第一步,找到图标 以阿里巴巴矢量图标库为例,随便找一个图标,如下图 第二步,使用 第一种,SV…

Matlab 2023b学习笔记1——界面认识

下载安装好Matlab后,可以看到如下界面: 可以看到,这时只有命令行窗口。我们在上方工具栏中选择“布局”—— “默认”,即可看到左右两边多出来了“当前文件夹”与“工作区”两栏。 一、当前文件夹界面 这个界面显示的是当前目录下…

什么是独特摆动交易策略?fpmarkets1分钟讲清楚

摆动交易策略想必各位投资者都已经接触过了,但是什么是独特摆动交易策略?各位投资者知道吗?其实很简单,这是一种基于斐波纳契工具的独特摆动交易策略。下面fpmarkets1分钟讲清楚,趋势总会经历调整,而这些调…

一个Python浏览器自动化操作神器:Mechanize库

今天,我们将介绍一个强大的Python库——Mechanize,通过它,我们可以轻松实现网页浏览的自动化。 Mechanize是一个用于模拟浏览器行为的Python库。它允许你自动化地与网站进行交互,就像真实用户一样。你可以使用它填写表单、点击按…

Python考试复习--day3

1.统计字符串个数 ninput() z0 s0 k0 o0 for i in n:if i.isalpha():zz1elif i.isnumeric():ss1elif i.isspace():k1else:o1 print(字母有{}个,数字有{}个,空格有{}个,其他字符{}个.format(z,s,k,o))2.分类统计字符 ninput() x0 d0 s0 k0 o0 for i in n:if i.islower():x1elif …

ENVI5.6详细安装教程,亲测可用(附安装包和破解文件)

文件准备 下载链接如下,包括安装包envi5.6.exe和破解需要的文件Crack 链接:https://pan.baidu.com/s/1fLE6VcEOqWpN7h0j99evSw?pwd77zx 提取码:77zx --来自百度网盘超级会员V4的分享开始安装 选择下载好的文件进行解压,鼠标…

17 - grace数据处理 - 补充 - 地下水储量计算过程分解 -- 陆地水储量变化

17 - grace数据处理 - 补充 - 地下水储量计算过程分解 -- 陆地水储量变化 0 引言1 Grace陆地水储量过程整合0 引言 最近关于GRACE地下水储量计算的有关过程多被问起,接下来几篇将介绍关于地下水储量计算的有关内容。由水量平衡方程可以将地下水储量的计算过程分解为4个部分,第…

数据集003:猫类识别-12种猫分类数据集 (含数据集下载链接)

数据集简介: 训练集共有2160张猫的图片, 分为12类. train_list.txt是其标注文件 测试集共有240张猫的图片. 不含标注信息. 训练集图像(部分) 验证集图像(部分) 标签 部分代码: # 定义训练数据集 class T…

Devexpress中GridControl控件中的表格遍历逻辑问题

当我们在执行其他事件时,常常需要对GridControl控件里的表内容进行一个遍历逻辑判断,该文以确认2列中的值是否为空为例;首先在遍历模块当然是使用foreach作为遍历的基础,在这其中在此例中存在具体业务细节,需要对选中行…