HAL库中断方式控制LED灯亮灭

2023-11-01 20:30
文章标签 led 中断 方式 控制 hal 灯亮

本文主要是介绍HAL库中断方式控制LED灯亮灭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、中断介绍
    • 1.中断的定义
    • 2.中断过程执行示意图
    • 3.中断的作用
    • 4.中断优先级
    • 5.中断响应过程
    • 6.GPIO引脚的外部中断触发方式
    • 7.HAL库的中断处理流程
  • 二、STM32CubeMX工程创建
    • 1.新建项目
    • 2.芯片选择
    • 3.参数设置
    • 4.引脚设置
    • 5.开启中断
    • 6.配置时钟
    • 7.生成项目
  • 三、程序编写及编译
    • 1.代码编写
    • 2.代码编译及hex文件创建
  • 四、电路连接及烧录运行
    • 1.电路连接
    • 2.程序烧录
    • 3.运行结果
  • 四、总结
  • 五、参考链接

一、中断介绍

1.中断的定义

中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等。
中断全过程:
中断发生(当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理)
中断处理(CPU暂停当前的工作,转去处理事件B)
中断返回(当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继续处理事件A)
整个过程称为中断

2.中断过程执行示意图

3.中断的作用

(1)速度匹配 可以解决快速的CPU与慢速的外部设备之间传送数据的矛盾
(2)分时操作 CPU可以分时为多个外部设备服务,提高计算机的利用率
(3)实时响应 CPU能够及时处理应用系统的随机事件,增强系统的实时性
(4)可靠性高 CPU可以处理设备故障及掉电等突发事件,提高系统可靠性

4.中断优先级

处理器根据不同中断的重要程序设置不同的优先等级。不同优先级中断的处理原则是:高级中断可以打断低级中断;低级中断不能打断高级中断
中断嵌套:

5.中断响应过程

(1)中断源发出中断请求
(2)判断处理器是否允许中断,以及该中断源是否被屏蔽
(3)中断优先级排队
(4)处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序
(5)执行中断服务程序
(6)恢复被保护的状态,执行中断返回指令,回到被中断的程序

6.GPIO引脚的外部中断触发方式

上升沿触发、下降沿出发、双边沿触发

7.HAL库的中断处理流程

(1)中断程序的编程步骤
设置中断触发条件→设置中断优先等级→设能外设中断→清除中断标志→编写中断服务程序
(2)HAL库对中断的封装处理
①统一规定处理各个外设的中断服务程序HAL_PPP_IRQHandler(PPP代表外设名称)
②在中断服务程序HAL_PPP_IRQHandler完成了中断标志的判断和清除
③将中断中需要执行的操作以回调函数(由外设初始化、中断、处理完成/出错触发的函数)的形式提供给用户
(3)由CubeMX生成的MDK工程中与中断相关的编程文件
①启动文件:startup_stm32fxxx.s
◉该文件存放在MDK-ARM组中。在该文件中,预先为每个中断编写了一个中断服务程序,只是这些中断服务程序都是死循环,目的只是初始化中断向量表;
◉中断服务程序的属性定义为“weak”。weak属性的函数表示:如果该函数没有在其他文件中定义,则使用该函数;如果用户在其他地方定义了该函数,则使用用户定义的函数。
②中断服务程序文件:stm32fxxx_it.c
◉该文件存放在User组中,用于存放各个中断的中断服务程序;
◉在使用CubeMX软件进行初始化配置时,如果使能了某一个外设的中断功能,那么在生成代码时,相对应的外设中断服务程序HAL_PPP_IRQHandler就会自动添加到该文件中,用户只需要在该函数中添加相应的中断处理代码即可。

二、STM32CubeMX工程创建

1.新建项目

打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目

2.芯片选择

在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project”

3.参数设置

(1)先点击System Core将其展开,再点击RCC,将HSE设置为Crystal/Ceramic Resonator

(2)点击SYS,将Debug设置为Serial Wire

4.引脚设置

(1)点击GPIO,点击PA4,将其设置为GPIO_Output,再根据自己需要设置User Label(也可以不设置),我这里设置的是LED

(2)点击PB9,将其设置为外部中断触发器GPIO_EXTI9,再点击GPIO mode,将其设置为Extemal Interrupt Mode with Rising/Failing edge

当开关接高电平时,LED亮灯;接低电平时,LED灭灯,所以选择上升沿和下降沿触发

5.开启中断

点击NVIC,勾选EXTI line[9:5] interrupts

6.配置时钟

勾选PLLCLK和HSE,将晶振频率设置为最大值72MHz

7.生成项目

(1)点击Project Manager→Project,配置好自己的项目名和项目存放路径,然后将Application Structure设置为Basic,将IDE设置为MDK-ARM

(2)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建工程

三、程序编写及编译

1.代码编写

(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写

(2)打开main.c文件,向其中添加如下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/* Prevent unused argument(s) compilation warning */HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);  //翻转电平/* NOTE: This function Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
}

2.代码编译及hex文件创建

点击Rebuild编译代码,若没有错误即可成功创建hex文件

四、电路连接及烧录运行

1.电路连接

USB转TTLSTM32F103C8T6
GNDGND
3v33v3
TXDA10
RXDA9

STM32F103C8T6的引脚3.3要接面包板上灯的正极所在的地方
STM32F103C8T6的引脚A4接灯的负极,引脚B9接一根杜邦线当作控制LED灯亮灭的开关。

2.程序烧录

置BOOT0为0,BOOT1为1
(1)打开mcuisp,选择串口为COM5,并选择生成的hex文件

(2)点击读器件信息,若显示一切正常则进行下一步

(3)点击开始编程,若显示一切正常则说明烧录成功

3.运行结果

四、总结

在做实验之前,要提前了解中断的相关知识,HAL库的中断处理流程等与实验相关的知识,在实验过程中可以发现在stm32cubemx上使用HAL库配置好相关引脚后,在生成的代码里可以很容易的实现中断控制LED灯,线路也很简单。本实验需要注意的是记得开启中断,不然运行不了,还有要注意电路连接,如果达不到实验效果也可能是电路连接错误。总而言之,做实验需要耐心,按照实验步骤一步步来,不要着急,这样子才不容易出错。

五、参考链接

https://blog.csdn.net/weixin_46129506/article/details/121119702?spm=1001.2014.3001.5506

这篇关于HAL库中断方式控制LED灯亮灭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325559

相关文章

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初