STM32如何使用中断?

编程入门 行业动态 更新时间:2024-10-23 06:33:06

STM32<a href=https://www.elefans.com/category/jswz/34/1771452.html style=如何使用中断?"/>

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 线路的挂起位

更多推荐

STM32如何使用中断?

本文发布于:2023-12-07 13:56:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1671372.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何使用

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!