STM32外部中断
来源:互联网 发布:大数据分析预测 知乎 编辑:程序博客网 时间:2024/06/05 20:07
1. 中断的原理 cpu正在运行,此时外部设备发出请求,引发中断,cpu暂停正在执行的进程,进行上下文切换,导入引发终端的外部请求信号,并执行需要该中断的进程,执行完后,再切换其他进程继续运行。2. 添加外部中断文件 a. exti.h 查看外部中断与各管脚之间的对应关系 b. exti.c i. 编写管脚初始化函数 GPIO_InitTypeDef GPIO_InitStructure; //结构体定义GPIO_InitTypeDef //时钟设置 SystemInit(); //打开系统时钟,才能使STM32正常工作 GPIO_InitStructure.GPIO_Pin = k_left; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_IPU; GPIO_Init(GPIOE,&GPIO_InitStructure); ii. 编写外部中断初始化配置 EXTI_InitTypeDef EXTI_InitStructure;//外部中断初始化 初始化外设EXTI寄存器 /* 设置外部中断的模式 */ EXTI_InitStructure.EXTI_Line=EXTI_Line2; //设置使能或失能线路 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置模式 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //设置边沿触发中断请求 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //定义选中线路的新状态 EXTI_Init(&EXTI_InitStructure); iii. 注意 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开管脚复用功能 才能使用该管脚的外部中断功能 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择GPIO管脚用作外部中断线路 iv. 设置优先级 1) 分组,不同的组抢占和响应占位不同 2) 打开外部中断的全局中断 3) 设置抢占优先级 4) 设置响应优先级 NVIC_InitTypeDef NVIC_InitStructure; /* 设置NVIC参数 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXTI2的全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); c. 配置过程 i. 先打开系统时钟 1) 按键接在PE2管脚所以先打开PE管脚的时钟 ii. 因为用外部中断,还要打开管脚的复用功能 iii. 按键管脚初始化,上拉模式 iv. 再对外部中断配置,定义外部中断结构体 1) 配置好中断线路,按键接的线路,中断触发模式,边沿触发方式,使能 2) 将PE2管脚映射到中断线路上 v. 中断优先级配置 1) 先分组 2) 打开中断通道 3) 配置抢占和响应优先级3. 编写外部中断函数在 stm32f10x_it.c文件中 void EXTI2_IRQHandler() //外部中断2入口函数 { if(EXTI_GetITStatus(EXTI_Line2)==SET)//判断是否进入中断 { EXTI_ClearITPendingBit(EXTI_Line2);//清除EXTI线路挂起位 以便下次进入中断 delay_ms(10); //消抖 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) // 读取输入状态 { delay_ms(10); //消抖 if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET)//读取led管脚状态 { GPIO_SetBits(GPIOC,GPIO_Pin_All);//置1,熄灭 } else { GPIO_ResetBits(GPIOC,GPIO_Pin_All); } } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) ;//判断是否松开 等待按键松开 } }
0 0
- STM32外部中断测试
- STM32外部中断测试
- STM32外部中断总结
- STM32外部中断
- STM32外部中断设置
- STM32外部中断
- STM32外部中断
- STM32外部中断详解
- STM32外部中断详解
- STM32外部中断
- STM32外部中断详解
- STM32 外部中断
- 关于STM32外部中断
- STM32外部中断
- STM32 外部中断
- STM32 外部中断
- stm32外部中断
- stm32 外部中断学习
- 什么是css hack?
- Easy 1 Two Sum(1)
- 欢迎使用CSDN-markdown编辑器
- POJ 1228 (稳定凸包问题)
- 动态规划之最长公共子序列(LCS)
- STM32外部中断
- 实验吧——WriteUp&&涨姿势(1)
- js小案类
- 随机数
- Dubbo学习(一)入门
- springMVC利用WebArgumentResolver为controller注入当前用户对象参数
- JSP脚本标识
- 七大顶级桌面比较!Linux平台
- 多线程中线程同步问题