时代汇创网站建设,网站怎么做实名认证,wordpress 腾讯视频插件,seo北京公司1.EXTI简介
EXTI是External Interrupt的缩写#xff0c;指外部中断。在嵌入式系统中#xff0c;外部中断是一种用于处理外部事件的机制。当外部事件发生时#xff08;比如按下按钮、传感器信号变化等#xff09;#xff0c;外部中断可以立即打断正在执行的程序#xff0…1.EXTI简介
EXTI是External Interrupt的缩写指外部中断。在嵌入式系统中外部中断是一种用于处理外部事件的机制。当外部事件发生时比如按下按钮、传感器信号变化等外部中断可以立即打断正在执行的程序转而执行一个特定的中断服务程序ISR以响应和处理外部事件。
在大多数嵌入式系统中外部中断可以配置为上升沿触发、下降沿触发、高电平触发、低电平触发等不同的触发方式以适应不同的外部事件类型。外部中断通常用于实时性要求较高的应用如实时控制系统、传感器数据采集等。
在使用外部中断时需要了解具体的硬件平台和编程语言的相关知识以确保正确地配置和处理外部中断。
2.EXTI功能框图讲解 首先中断源从输入线进入总共有20根中断/事件线每一条线对应着PXx,例如EXTI0的输入源可以是PX0(X为A、B、C、D、E、F、G、H、I)因为GPIO端口有16个所以x的取值在0-15EXTI16的输入源是PVD输出EXTI17的输入源是RTC闹钟事件EXTI18的输入源是USB唤醒事件EXTI19的输入源是以太网唤醒事件只适用互联型。
通过外部中断配置寄存器1(AFIO_EXTICR1)配置来选择输入线每一个EXTIx有四个位可以选择16个GPIO端口。 选择输入线和输入源后进入边缘检测电路 边缘检测电路通过寄存器上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)选择触发方式。
通过配置的触发方式边缘检测电路输出“1”给到或门然后另一个输入由软件中断事件寄存器输入当软件中断事件寄存器相应位为’0’时写’1’将设置EXTI_PR中相应的挂起位是否相应中断请求由后面的总开关中断屏蔽寄存器(EXTI_IMR)决定这样或门输入两个“1”或门也输出“1”将这个“1”输入给请求挂起寄存器就是中断输入给与门就是事件然后请求挂起寄存器输出“1”给与门然后中断屏蔽寄存器(EXTI_IMR)对应位置“1”开放来自线x的中断请求与门输出“1”给到NVIC中断控制器NVIC在内核中由内核响应这个中断内核就会去查找相应的中断服务函数ESR。
3.GPIO中断实例
3.1.初始化GPIO 通过原理图查看按键对应的GPIO端口 通过原理图可以知道按键SW2连接的是GPIO的PA0那么我们需要初始化PA0并且将PA0连接到EXTI0。
初始化GPIO GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, GPIO_InitStructure);
3.2.初始化EXTI用于产生中断/事件 初始化EXTI方法和初始化GPIO相似首先打开系统时钟然后选择输入线通过函数GPIO_EXTILineConfig()配置接着通过EXTI_InitTypeDef结构体定义一个变量通过这个变量配置EXTI的输入线、模式、触发方式然后将配置的结构体变量的地址传递给初始化EXTI函数EXTI_Init()。 EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line EXTI_Line0;EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd ENABLE;EXTI_Init(EXTI_InitStructure);
3.3.初始化NVIC 初始化NVIC和初始化GPIO和初始化EXTI相似都需要通过定义结构体变量去配置相应参数。首先定义结构体变量NVIC_InitStructure。然后设置中断优先级级分组通过函数NVIC_PriorityGroupConfig(),有5个组 没个组有主优先级和次优先级我们配置中断优先级的时候stm32使用了四个位当主优先级只是用0位时取值就是0次优先级就使用四个位取值就是0-15。同理当主优先级只是用1位时取值就是0-1次优先级就使用3个位取值就是0-7以此类推。然后通过定义的结构体变量配置中断源抢占优先级子优先级。注意这里的中断源配置如果是GPIO0-4都是单独的EXTIx_IRQn,但是如果你说4以后的端口就会使用到EXTI9_5_IRQn和EXTI15_10_IRQn。然后将配置的结构体变量的地址传递给初始化NVIC初始化函数NVIC_Init()。 NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStructure);
3.4.编写中断服务函数 通断服务函数都放在stm32f10x_it.c这个文件里面中断服务函数的名字已经定义好了放在startup_stm32f10x_hd.s文件的向量表中。通过if语句判断函数EXTI_GetITStatus()的返回值来判断是否产生中断如果产生中断EXTI_GetITStatus()返回值位1。通过宏定义LED_G_TOGGLE
#define LED_G_TOGGLE {GPIOB-ODR ^ GPIO_Pin_0;}
通过控制端口输出数据寄存器ODR异或运算控制LED交替异或运算符与1异或改变与0异或不变。为了防止一直在中断里面最后需要清除中断位通过函数 EXTI_ClearITPendingBit()。
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) ! RESET){LED_G_TOGGLE;}EXTI_ClearITPendingBit(EXTI_Line0);
}3.5.main函数 最后通过main函数调用前面写的函数
int main(void)
{LED_GPIO_RCC();LED_GPIO_Config();EXIT_Key_Config();while(1){}
}