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

STM32如何使用中断?

一:EXTI 简介

STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。

EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升

沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。

二:EXTI 配置步骤

(EXTI 相关库函数在 stm32f10x_exti.c 和stm32f10x_exti.h 文件中)

(1)使能 IO 口时钟,配置 IO 口模式为输入

(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系

1、使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2、将端口A 映射 引脚0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

(3)配置中断分组(NVIC),使能中断

EXTI产生中断线 ---> 流向NVIC

NVIC初始化

NVIC_InitTypeDef NVIC_InitStructure; 
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;    //EXTI15 中断通道 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;      //子优先级 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //IRQ 通道使能 
NVIC_Init(&NVIC_InitStructure);                       //根据指定的参数初始化 VIC 寄存器

(4)初始化 EXTI,选择触发方式

文件在stm32f10x_exti.c和 stm32f10x_exti.h 当中

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

函数形参是有一个结构体 EXTI_InitTypeDef 类型的指针变量

typedef struct 
{ uint32_t EXTI_Line;                 //中断/事件线  EXTIMode_TypeDef EXTI_Mode;         //EXTI 模式 EXTITrigger_TypeDef EXTI_Trigger;  //EXTI 触发方式 FunctionalState EXTI_LineCmd;       //中断线使能或失能 
}EXTI_InitTypeDef;EXTI_Line:EXTI 中断/事件线选择,可配置参数为 EXTI0-EXTI20,可参考上表。
EXTI_Mode:EXTI 模式选择,可以配置为中断模式 EXTI_Mode_Interrupt 和事件模式 EXTI_Mode_Event。 
EXTI_Trigger:触发方式选择,可以配置为上升沿触发 EXTI_Trigger_Rising、下降沿触发 EXTI_Trigger_Falling、上升沿和下降沿触EXTI_Trigger_Rising_Falling 。
EXTI_LineCmd:中断线使能或者失能,配置 ENABLE 为使能,DISABLE 为失能,我们这里要使用外部中断,所以需使能

(5)编写 EXTI 中断服务函数

中断服务函数名是固定的,在开始文件startup_stm32f10x_md.s 当中寻找

EXTI0_IRQHandler         
EXTI1_IRQHandler         
EXTI2_IRQHandler         
EXTI3_IRQHandler         
EXTI4_IRQHandler
EXTI15_10_IRQHandler     

stm32f10x_exti.h 函数

stm32f10x_exti.h 函数将外设 EXTI 寄存器重设为缺省值
void EXTI_DeInit(void);根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);把 EXTI_InitStruct 中的每一个参数按缺省值填入
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);产生一个软件中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); EXTI_Line:待使能或者失能的 EXTI 线路检查指定的 EXTI 线路标志位设置与否
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);EXTI_Line:待检查的 EXTI 线路标志位清除 EXTI 线路挂起标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);EXTI_Line:待清除标志位的 EXTI 线路检查指定的 EXTI 线路触发请求发生与否
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);EXTI_Line:待检查 EXTI 线路的挂起位清除 EXTI 线路挂起位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);EXTI_Line:待清除 EXTI 线路的挂起位

http://www.lryc.cn/news/195646.html

相关文章:

  • 用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)
  • 热成像仪的工作原理及在工业设备状态监测中的应用
  • 什么是库存管理?无需Excel,2023年这几款大热库存管理软件你get了吗?
  • c# xml 参数配置表的使用
  • ubuntu20.04 nerf Instant-ngp
  • 隐写术--python隐写
  • MySQL的InnoDB存储引擎中的自适应哈希索引技术
  • 交互设计主要做什么?新手入门必读
  • 【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
  • flutter 消息并发时处理,递归查询
  • 第五十八章 学习常用技能 - 查看查询缓存
  • AI 辅助学 Java | 专栏 1 帮你学 Java
  • 2023_Spark_实验十六:编写LoggerLevel方法及getLocalSparkSession方法
  • 彻底搞懂:防止表单重复提交,前端限制还是后端限制?
  • OCPP1.6协议
  • 【数据存储:小端模式和大端模式】
  • 【git】gitlab安装、备份
  • C51--基本认知
  • centos7 安装 mysql 8.0
  • Vue15 计算属性VS监视属性(侦听属性)
  • 快速全面掌握数据库系统核心知识点
  • 学习笔记 | 音视频 | 推流项目框架及细节
  • 拓扑几何学
  • 1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计
  • SpringBoot介绍
  • 2022最新版-李宏毅机器学习深度学习课程-P17 卷积神经网络CNN
  • 微博清理僵尸粉
  • 创建React Native的第一个hello world工程
  • 基础课3——自然语言处理的应用
  • 理解 Git 的三个工作区:工作区、暂存区和版本库