网页游戏网站官网,一站式网站建设平台,外国做美食视频网站,青岛企业网站建设优化一、简介 中断#xff1a;在主程序运行过程中#xff0c;出现了特定的中断触发条件#xff08;中断源#xff09;#xff0c;使得CPU暂停当前正在运行的程序#xff0c;转而去处理中断程序#xff0c;处理完成后又返回原来被暂停的位置继续运行#xff1b; 中断优先级在主程序运行过程中出现了特定的中断触发条件中断源使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级当有多个中断源同时申请中断时CPU会根据中断源的轻重缓急进行裁决优先响应更加紧急的中断源 中断嵌套当一个中断程序正在运行时又有新的更高优先级的中断源申请中断CPU再次暂停当前中断程序转而去处理新的中断程序处理完成后依次进行返回。 不用开启外设时钟特殊EXTI可以监测指定GPIO口的电平信号当其指定的GPIO口产生电平变化时EXTI将立即向NVIC发出中断申请经过NVIC裁决后即可中断CPU主程序使CPU执行EXTI对应的中断程序 支持的触发方式上升沿/下降沿/双边沿/软件触发 支持的GPIO口所有GPIO口但相同的Pin不能同时触发中断 通道数16个GPIO_Pin外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒 触发响应方式中断响应/事件响应
二、基本结构 硬件中断选择通过下面的过程来配置20个线路做为中断源 ● 配置20个中断线的屏蔽位(EXTI_IMR) 中断屏蔽寄存器(EXTI_IMR) 允许至NVIC中断寄存器 ● 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR) 边沿检测电路---配置触发信号 ● 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位使得20个中断线中的请求可以被正确地响应。最重要逻辑即下图 AFIO复用:(记得开启 外设时钟)通过AFIO_EXTICRx配置GPIO线上的外部中断/事件必须先使能AFIO时钟。112通用I/O端口以下图的方式连接到16个外部中断/事件线上 使用函数 GPIO_EXTILineConfig进行配置 要产生中断必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器上升沿还是下降沿同时在中断屏蔽寄存器的相应位写’1’允许中断请求如下图利用与门的特点0x 0,1x x。当外部中断线上发生了期待的边沿时将产生一个中断请求对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’将清除该中断请求。 从上图还可以看出支持的触发方式上升沿/下降沿/双边沿/软件触发边沿检测电路进来后经过一个或门或门是有1为1故不管是软件中断寄存器进行触发还是边沿检测电路触发都能触发中断一路发生中断一路是事件触发同样都存在屏蔽寄存器。而请求挂起寄存器 此外在配置nvic时还需要注意的是EXTI9_5和EXTI15_10 EXPORT 表示本程序里面用到的变量提供给其他模块调用的。 EXPORT EXTI0_IRQHandler EXPORT EXTI1_IRQHandler EXPORT EXTI2_IRQHandler EXPORT EXTI3_IRQHandler EXPORT EXTI4_IRQHandler EXPORT EXTI9_5_IRQHandler EXPORT EXTI15_10_IRQHandler 中断线 0-4 每个中断线对应一个中断函数中断线 5-9 共用中断函数 EXTI9_5_IRQHandler中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。 NVIC配置代码 NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn; //选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; //指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; //指定NVIC线路的响应优先级为1NVIC_Init(NVIC_InitStructure); //将结构体变量交给NVIC_Init配置NVIC外设 三、外部中断代码实现 外部中断一般配置步骤 1.初始换IO口为输入GPIO_Init(); 2.开启IO口复用时钟RCC_APB2PeriphClockCmd(); /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO的时钟外部中断必须开启AFIO的时钟/*GPIO初始化*/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); //将PB14引脚初始化为上拉输入 为什么配置成上拉 3.设置IO口与中断线的映射关系: void GPIO_EXTILineConfig()
/*AFIO选择中断引脚*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB即选择PB14为外部中断引脚 4.初始化线上中断设置触发条件等EXTI_Init(); /*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure; //定义结构体变量EXTI_InitStructure.EXTI_Line EXTI_Line14; //选择配置外部中断的14号线EXTI_InitStructure.EXTI_LineCmd ENABLE; //指定外部中断线使能EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; //指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling; //指定外部中断线为下降沿触发EXTI_Init(EXTI_InitStructure); //将结构体变量交给EXT 5.配置中断分组(NVIC)并且使能中断NVIC_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2//即抢占优先级范围0~3响应优先级范围0~3//此分组配置在整个工程中仅需调用一次//若有多个中断可以把此代码放在main函数内while循环之前//若调用多次配置分组的代码则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn; //选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; //指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; //指定NVIC线路的响应优先级为1NVIC_Init(NVIC_InitStructure); 6.编写中断服务函数():EXTIx_IRQHandler(); PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler(这些都不能写错) 7.清除中断标志位EXTI_ClearITPendingBit();
/*** 函 数EXTI15_10外部中断函数* 参 数无* 返 回 值无* 注意事项此函数为中断函数无需调用中断触发后自动执行* 函数名为预留的指定名称可以从启动文件复制* 请确保函数名正确不能有任何差异否则中断函数将不能进入*/
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) SET) //判断是否是外部中断14号线触发的中断{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) 0){CountSensor_Count ; //计数值自增一次}EXTI_ClearITPendingBit(EXTI_Line14); //清除外部中断14号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发导致主程序卡死}
}