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