【STM32】HAL库点灯

【STM32】HAL库点灯

  • 一、探究目标
  • 二、探究原理
    • 2.1 ST开发库
    • 2.1.1 直接配置寄存器
    • 2.1.2 标准外设库
    • 2.1.3 HAL库
    • 2.2 HAL开发
      • 2.2.1 环境配置
      • 2.2.2 时钟配置
      • 2.2.3 GPIO配置
      • 2.2.4 工程创建
      • 2.2.5 KEIL代码![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bf1c95d5c6724a6a9eb4a5a1d4fb65a8.png)
      • 2.2.6 注意:加入核心文件stm32f10x_md.s
    • 2.3 GPIO函数
  • 三、代码实现
    • 3.1 实验一
      • 3.1.1 CubeMX配置
      • 3.1.2 KEIL代码
    • 3.2 实验二
      • 3.2.1 CubeMX配置
      • 3.2.2 KEIL代码
    • 3.3 KEIL仿真
  • 四、探究总结

一、探究目标

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

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

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

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

二、探究原理

2.1 ST开发库

ST 为开发者提供了非常方便的开发库,有标准外设库(SPL库)、HAL 库(Hardware Abstraction Layer,硬件抽象层库)、LL 库(Low-Layer,底层库)三种。前者是ST的老库已经停更了,后两者是ST现在主推的开发库。

我们之前所使用的寄存器开发是最底层的开发方法,开发者可以参照ST公司的数据手册迅速上手。HAL库和LL

2.1.1 直接配置寄存器

我们之前所使用的寄存器开发是最底层的开发方法。在之前学习51的过程中,我们是通过汇编语言直接操作寄存器实现功能的,而这种方法到了STM32就不太容易行得通了,因为STM32的寄存器数量是51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。
但直接操作寄存器的方法更接近原理,而且适用性更广泛,只要拥有数据手册,什么芯片都可以直接上手。

2.1.2 标准外设库

ST公司为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的。在使用过程中我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。
标准库同时也是目前最多人使用的方式,很多人的STM32启蒙——江协科技也是用到标准库教学的。

2.1.3 HAL库

HAL(Hardware Abstraction Layer,抽象印象层)库是ST公司目前主力推的开发方式。使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,而无需像标准库那样配置文件,可以说是方便至极。

2.2 HAL开发

2.2.1 环境配置

环境配置可参考博客STM32_Cube MX配置及使用HAL库

2.2.2 时钟配置

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

在这里插入图片描述
在方框内输入72,回车确认。

2.2.3 GPIO配置

由于我们LED所接引脚为PB9,因此我们需要将PB9引脚初始化为高电平输出,即High。
在这里插入图片描述

2.2.4 工程创建

在这里插入图片描述
在这里插入图片描述
Generate后工程就创建成功啦,此时我们只需要open project就可以打开KEIL工程了。

2.2.5 KEIL代码在这里插入图片描述

在敲代码的时候要注意,要把代码卸载BEGIN和END之间,写在外面的会在你操作cube生成代码的时候被清理掉。

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);

一个简简单单的LED灯闪烁就这样写好了。

2.2.6 注意:加入核心文件stm32f10x_md.s

我们可以将之前标准库文件中的md.s文件复制粘贴到Drivers中,但是注意:如果更改cubeMX并generate文件都会把这个清除,需要重新添加。
在这里插入图片描述
在这里插入图片描述

2.3 GPIO函数

  1. HAL_GPIO_WritePin函数:写入引脚高低电平
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;}
}
  1. HAL_GPIO_TogglePin函数:引脚电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{uint32_t odr;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));/* get current Output Data Register value */odr = GPIOx->ODR;/* Set selected pins that were at low level, and reset ones that were high */GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}

三、代码实现

3.1 实验一

用GPIO端口完成2只LED灯的周期闪烁。
这里用PB8、PB9输出。

3.1.1 CubeMX配置

按照2.2的步骤操作配置好时钟后,在GPIO选择我们需要的引脚PB8、PB9。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
初始化后我们可以观察到,生成的gpio.c文件中,有如上代码。

3.1.2 KEIL代码

想要实现LED1、LED2周期闪烁,我们可以用翻转电平操作。
由于初始LED1(PB9)高电平熄灭,LED2(LED8)低电平点亮。
加入延时函数,让二者电平翻转。

  while (1){HAL_Delay(500);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

3.2 实验二

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

3.2.1 CubeMX配置

配置输入,假如两个开关分别连引脚PA5\PA6。
在这里插入图片描述
将PA5、PA6选择为GPIO_Input模式。

3.2.2 KEIL代码

开关接高电平时LED灭,低电平时LED亮。
因此我们需要用到HAL_GPIO_ReadPin函数读取开关的输入电平。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{GPIO_PinState bitstatus;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET){bitstatus = GPIO_PIN_SET;}else{bitstatus = GPIO_PIN_RESET;}return bitstatus;
}

因此主函数的代码写简单几句就能实现。

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define  KEY1_State HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)
#define  KEY2_State HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
/* USER CODE END PD */
  /* USER CODE BEGIN WHILE */while (1){if(KEY1_State==GPIO_PIN_RESET){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}if(KEY2_State==GPIO_PIN_SET){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);}/* USER CODE END WHILE */

3.3 KEIL仿真

请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

四、探究总结

HAL库开发只要熟悉函数,很容易就能进行开发。但是HAL库的覆盖程度有限,有些芯片并没有HAL库,因此掌握寄存器开发和标准库开发还是很有必要的。

以上则是我本次探究的全部内容,如有错漏请在评论区指正。

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

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

相关文章

NextGen Mirth Connect XStream反序列化远程代码执行漏洞(CVE-2023-43208)

0x01 产品简介 NextGen Mirth Connect是是美国NextGen公司的一个医疗集成引擎,主要用于医疗领域的系统集成和数据交换,支持多种协议和标准。 0x02 漏洞概述 NextGen Mirth Connect 4.4.1之前版本存在远程代码执行漏洞,未经身份认证的攻击者可利用该漏洞远程执行代码。 0…

混合组网VS传统网络:智能硬件混合组网优劣势浅要解析

智能硬件混合组网是一种利用多种通信技术相结合的方法&#xff0c;以实现更灵活、更可靠的网络连接。通过蓝牙、Wi-Fi、LoRa、4G相互之间的不同通讯方式&#xff0c;根据应用场景的不同以及现场实际环境&#xff0c;优选最佳物联网混合组网方案&#xff0c;以达到部署最便捷性价…

一张SSL证书如何同时保护多个域名及其子域名?

在互联网时代&#xff0c;数据安全和隐私保护变得至关重要&#xff0c;而SSL证书作为确保网站安全的重要工具&#xff0c;其重要性不言而喻。本文将详细探讨一种特殊的SSL证书——多域名通配符SSL证书&#xff0c;它为网站管理员提供了一种高效、经济的方式来保护多个域名及其子…

MyBatis从入门到“入土“

&#x1f495;喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#xff01;&#x1f495;(●◡●) 目录 一、Mybatis为何物&#xff1f;&#x1f44c; 二、快速入门&#x1f923; 1、新建项目&#x1f60a; 2、数据库建表&#x1f60a; 3、导入依赖的jar包&#x1f60a;…

Linux学习笔记6

TFTP 服务器搭建和测试 关于TFTP:TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;简单文件传输协议&#xff09;&#xff0c;是一个基于UDP 协议实现 的用于在客户机和服务器之间进行简单文件传输的协议&#xff0c;适合于开销不大、不复杂的应用场合 搭建服务器…

后量子密码的发展和应用

后量子算法&#xff0c;特别是后量子密码(PQC)&#xff0c;是近年来密码学领域的一个热门话题。随着量子计算技术的快速发展&#xff0c;传统的公钥密码算法面临着被量子计算机破解的威胁。为了应对这一挑战&#xff0c;后量子密码应运而生&#xff0c;成为了一种能够抵抗量子计…

【论文笔记】| 蛋白质大模型ProLLaMA

【论文笔记】| 蛋白质大模型ProLLaMA ProLLaMA: A Protein Large Language Model for Multi-Task Protein Language Processing Peking University Theme: Domain Specific LLM Main work&#xff1a; 当前 ProLLM 的固有局限性&#xff1a;&#xff08;i&#xff09;缺乏自然…

Redis篇 在linux系统上安装Redis

安装Redis 在Ubuntu上安装Redis 在Ubuntu上安装Redis 在linux系统中,我们安装Redis,必须先使它有root权限. 那么在linux中,如何切换到root用户权限呢? sudo su 就可切换到用户权限了. 在切换到用户权限后,我们需要用一条命令来搜索Redis相关的软件包 apt search redis 会出现非…

ROS2学习——节点话题通信(2)

目录 一、ROS2节点 1.概念 2.实例 &#xff08;1&#xff09;ros2 run &#xff08;2&#xff09;ros2 node list &#xff08;3&#xff09;remapping重映射 &#xff08;4&#xff09;ros2 node info 二、话题 &#xff08;1&#xff09; ros2 topic list &#xf…

头歌openGauss-存储过程第1关:创建存储过程

编程要求 1、创建第1个存储过程&#xff0c;并调用&#xff1b; 1&#xff09;创建存储过程&#xff0c;查询emp表数据&#xff1b; 2&#xff09;调用存储过程&#xff1b; --创建存储过程&#xff0c;获得计算机&#xff08;cs&#xff09;系学生选课情况并将结果写入临时表t…

人脸识别:基于卷积神经网络(CNN)分类思想的人脸识别系统

本文来自公众号 “AI大道理” —————— 项目配套视频课程&#xff1a; 平台&#xff1a;荔枝微课 链接&#xff1a;十方教育 项目地址&#xff1a;https://github.com/AIBigTruth/CNN_faces_recognition 之前很多人来询问这个项目怎么做&#xff0c;代码跑不起来&#…

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因&#xff0c;了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提&#xff0c;如果你通过快捷键“Ctrl D”删除了数据&#xff0c;那你可以从回收站中还原它们。如果你永久删除…

Isaac Sim仿真平台学习(1)认识Isaac Sim

0.前言 上一个教程中我们下载好了Isaac Sim&#xff0c;这一章我们将来简单了解一下Isaac Sim平台。 isaac Sim仿真平台安装-CSDN博客 1.Isaac Sim是啥&#xff1f; What Is Isaac Sim? — Omniverse IsaacSim latest documentation Isaac Sim是NVDIA Omniverse平台的机器…

【编译原理复习笔记】属性文法

属性文法 也称为属性翻译文法&#xff0c;由 Knuth 提出&#xff0c;以上下文无关文法为基础 &#xff08;1&#xff09;为每个文法符号&#xff08;终结符与非终结符&#xff09;配备相关的属性&#xff0c;代表与该文法符号相关的信息 &#xff08;2&#xff09;属性文法对于…

数据链路层协议——以太网协议

1. 数据链路层 网络层用于将数据从一台主机发送到另一台主机。传输层用于将数据可靠的从一台主机发送到另一台主机。&#xff08;网络层没有保证可靠性的策略&#xff0c;传输过程中可能会出现各种意外&#xff0c;例如&#xff1a;丢包&#xff0c;网络拥塞等。通过传输层可以…

跨域问题的4种解决方案

文章导读 前言 跨域问题指的是在Web开发中&#xff0c;由于浏览器的同源策略限制&#xff0c;当一个网页尝试访问与它不同源&#xff08;协议、域名或端口不同&#xff09;的资源时&#xff0c;可能会遇到安全限制导致无法正常访问的问题。这种策略旨在防止恶意网站读取或修改其…

订餐系统总结、

应用层&#xff1a; SpringBoot:快速构建Spring项目&#xff0c;采用“约定大于配置”的思想&#xff0c;简化Spring项目的配置开发。 SpringMvc&#xff1a;Spring框架的一个模块&#xff0c;springmvc和spring无需通过中间整合层进行整合&#xff0c;可以无缝集成。 Sprin…

完整的数据可视化方法集

在当前的大数据时代&#xff0c;了解如何可视化数据是UI/UX设计师技能的重要组成部分。如今&#xff0c;几乎所有的公司都需要良好的数据可视化作为确定业务方向和决策的参考。数据的可视化结果越好&#xff0c;用户的决策就越科学。 1、什么是数据可视化 数据可视化是将信息…

张量 t-product 积(matlab代码)

参考文献&#xff1a;Tensor Robust Principal Component Analysis with a New Tensor Nuclear Norm 首先是文章2.3节中 t-product 的定义&#xff1a; 块循环矩阵&#xff1a; 参考知乎博主的例子及代码&#xff1a;&#xff08;t-product与t-QR分解&#xff0c;另一篇傅里叶对…

vue通过for循环生成input框后双向绑定失效问题

有些时候页面上有太多的表单元素&#xff0c;一个个的写太过繁琐&#xff0c;拿 input 框举例&#xff0c;众多的 input 框&#xff0c;无非就是输入框前的说明和 input 框的 name 属性不一样 <el-form :inline"true" :model"formInline" size"mi…