stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》

这篇具有很好参考价值的文章主要介绍了stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。

简单用文字说一下原理。

如果先要清楚了解建议去b站看一下keysking大佬的教程,很有趣易懂(本视频的部分图也来自keysking视频中的图片,大家如果要学习强烈推荐他的视频

当EXTI触发时,正在运行的代码会暂停运行,跳转到中断函数的代码执行,结束后返回之前停止的代码,直到下一次中断触发。

外部的电平信号进入输入驱动器,经过上下拉电阻,经过施密特触发器,通过比较转换将模拟电路转化为数字电路(也可以不走触发器之间传到模拟输入口)后到达片上外设或者输入寄存器。到达外部事件/中断控制器

stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件

进入外部事件/中断控制器

输入线中其实有引脚对应的EXTI外部中断线,编号为相同数字的用一条线

stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件

边缘检测电路是帮我们配置下降沿/上升沿触发中断信号的 ,如果触发产生一个高电平。

软件中断事件寄存器是可以用代码模拟创造一个中断。

或门有一个相应中断就输出中断。

后面有个与门,要两个都产生相同电平才可以,所以中断屏蔽发生器可以控制中断的传递。

之后到达NVIC(嵌套向量中断控制器)

EXTI触发,就会执行对应的处理函数。函数处理完要将挂起寄存器清除为0,清除中断标志位

stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件

中断的优先级

①抢占优先级(先判断,相同就判断相应优先级)

②相应优先级

一个中断正在执行,被另一个打断,只比较抢占优先级。

2.标准库的代码初始化

标准库要AFIO选择中断引脚

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);

这个是标准库外部中断的定义

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

开启AFIO的时钟(GPIO为通用引脚,AFIO为复用引脚,都要开启外部时钟)

将要输入的引脚的模式设定为外部输入,其他像gpio那样配置

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

上面那条是开启GPIOB pin14的外部中断复用功能

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

这部分为EXTI外部中断的配置

   EXTI_InitStructure.EXTI_Line=EXTI_Line14;为配置外部中断线
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;打开使能开关
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;选择中断模式(有中断模式和事件模式)
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;触发方式(这里是下降沿触发)
    EXTI_Init(&EXTI_InitStructure);

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);

这里是NVIC优先级的定义

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//设置通道(IRQhandler)
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//通道使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级
    NVIC_Init(&NVIC_InitStructure);

至此外部中断是所有都配置好了

而中断处理函数,产生中断就会执行下面的函数

void TIM2_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line14);

	}

其中    EXTI_ClearITPendingBit(EXTI_Line14);//清除外部中断14号线的中断标志位

3.HAL库初始化

stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件GPIO mode为设置触发方式

GPIO pull up/pull down是设置端口的上下拉

然后在NVIC开启外部中断stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件

配置NVIC的优先级

stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》,stm32,学习,嵌入式硬件

较为方便,直接选数字就好,数值越小优先级越高

生成代码后再stm32f1xx_it.c文件中找到

void EXTI15_10_IRQHandler(void)
{
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}

这个就是中断处理函数

其中HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);//这个函数可以帮我们将挂起寄存器清除为0

在中断函数中写下中断时需要执行的代码。

补充:如果要使用delay函数,要考虑优先级问题,要将系统滴答(time base:system tick timer)的优先级调至高于中断的优先级delay才能实现延时,如果低于中断,着轮不到delay产生效果文章来源地址https://www.toymoban.com/news/detail-806319.html

到了这里,关于stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】基于HAL库的中断详细学习

    1.中断概述 1.1中断相关概念 1.2 STM32中断系统 2 .HAL库的中断处理 2.1 HAL 库的中断封装 2.2 外部中断处理流程 3.外部中断的HAL库定义 3.1. 外部中断的数据类型 3.2. 外部中断的接口函数 在计算机系统中,处理器常常需要与外部设备进行数据传输。常见的数据传输方式有以下四种:

    2024年02月02日
    浏览(81)
  • stm32——hal库学习笔记(外部中断)

    一、什么是中断?(了解) 打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断 中断的作用和意义 中断的意义:高效处理紧急程序,不会一直占用CPU资源 STM32 GPIO外部中断简图 二、NVIC(熟悉) 2.1,NVIC基本概念 2.2,NVIC相关寄存器介绍

    2024年02月22日
    浏览(55)
  • Stm32点亮LED灯(HAL库和标准库)

            日常生活中我们要点亮房间的灯,就是按开关。背后的本质,用初中物理的话说就是两个要素:形成闭合回路;给用电器电压。         单片机就是一个小型的集成电路,LED作为电路中的用电器也需要这两个要素。需要注意的是,发光二极管具有单向导通性,

    2024年02月20日
    浏览(43)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(47)
  • STM32基于HAL库的串口接受中断和空闲中断

    在通信方面。UART由于全双工通信,可以同时接受数据和发送数据而被广泛使用。 而接受数据则又有很多种方法 比如: 1根据结束符判断,数据是字符串形式,所以一般串口接受的接受符就是 \\\"rn\\\"  换成16进制ascil码显示就是 0X0D   0X0A (对应rn)  2定时器中断,设计\\\"喂狗信号量

    2023年04月08日
    浏览(49)
  • STM32 HAL库的串口中断服务函数详解

    最近在实现利用上位机通过串口发送指令给下位机执行操作的实验,在之前学习串口的过程中我就一直有一个疑惑,那就是为什么在串口中断回调函数内除了要加上自己的操作以外还要在末尾再执行一次 接收中断 ,在查阅了一些资料后我才发现原来和 中断服务函数 有关 我

    2024年02月10日
    浏览(43)
  • STM32 外部中断 标准库函数

    中断对于单片机来说是必不可少的存在。例如使用一个按键打开一个灯的方法,就可以使用 中断 的方式实现,并且效果更好。 中断的概念比较容易理解,就相当于做饭的时候,你的主任务是炒菜,炒菜炒到一半,来了个电话你就需要优先去接电话,然后电话处理完后才会继

    2024年01月16日
    浏览(50)
  • HAL库和标准库的区别

    本文回答来源于chat gpt4,非原创,也是我初学过程中所遇到的问题,答案分享给大家,如有侵权请联系删除: HAL 库(Hardware Abstraction Layer,硬件抽象层)和标准库(Standard Peripheral Library,标准外设库,又称为 SPL)都是 STM32 微控制器的固件库。它们的主要区别在于结构和抽象

    2024年02月07日
    浏览(36)
  • freemodbus移植进STM32(包含HAL库和标准库两种方法)

    基于freemodbus1.6 使用HAL库 软件:stm32cubemx stm32cubeide 后续会更新标准库的移植。以及rtos下的移植(尽量) 这个获取方法网上到处都是,不细说了。 新建工程只列出了与移植freemodbus相关的设置 这里我使用的是485通信,所以额外使能了一个引脚 使能一个定时器,这里我用的是

    2024年02月05日
    浏览(48)
  • STM32(三):外部中断 (标准库函数)

    前言 上一篇文章已经介绍了如何用按键点灯,使用的是按键扫描的方式,实现了点灯的第二步。这一篇则介绍如何用外部中断的方式实现按键点灯的过程。 中断想必大家都知道,通俗来说也就是你现在在做事情1,被打扰了先去做了事情2,事情2做完了回去继续做事情1。 而

    2024年04月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包