今天我来介绍一下外部中断。先打开数据手册我用的时f103这款。不过大体上都差不多。首先介绍什么是外部中断。所有的GPIO口都要外部中断功能。如果要使用,必须使用外部中断线(把GPIO口看做是中断线),而且必须配置为输入模式。EXIT控制器有如下特点:每个中断都有独立的触发和屏蔽;中断线都有对应得状态位;多达20个中断请求;检测的脉冲信号低于APB2时钟的脉冲宽度。主要分析流程图。 分析完流程图就知道编程思路,顺腾摸瓜,从引脚开始, 1)配置数输入,复用为中断线,既然是复用肯定要开AFIO时钟, 2)把IO复用为中断线 3)来到了边沿选择寄存器。按键选择上升沿,或者下降沿。 4)开启EXIT中断使能 5)开启NVIC中断 6)编写中断服务函数(3步曲:判断中断标志位,清中断标志位,完成需要的功能) void My_EXIT_Init() { //按键初始化 KEY_Init(); //开启时钟 RCC->APB2ENR |= (1<<0); //PA0映射到EXTI0 AFIO->EXTICR[0] &=~(0xf<<(4*0)); //PE2-4映射到EXIT2-4 AFIO->EXTICR[0] &=~(0xf<<(4*2)); AFIO->EXTICR[0] |=(0x4<<(4*2)); AFIO->EXTICR[0] &=~(0xf<<(4*3)); AFIO->EXTICR[0] |=(0x4<<(4*3)); AFIO->EXTICR[1] &=~(0xf<<(4*0)); AFIO->EXTICR[1] |=(0x4<<(4*0)); //边沿选择寄存器,根据你需要的配置 EXTI->RTSR |= (1<<0); EXTI->FTSR |= (1<<2)|(1<<3)|(1<<4); /开启EXIT中断 EXTI->IMR |= ((1<<0)|(1<<2)|(1<<3)|(1<<4)); //开启中断 My_NVIC_Init(EXTI0_IRQn,7-3,6,1); My_NVIC_Init(EXTI2_IRQn,7-3,5,1); My_NVIC_Init(EXTI3_IRQn,7-3,4,1); My_NVIC_Init(EXTI4_IRQn,7-3,3,1); } //中断服务函数,注意要在.S文件找该函数名,不然可能写错 void EXTI0_IRQHandler() { if(EXTI->PR & (1<<0)) //判断标志位 { if( K_UP) delay_ms(100); LED1_ON; EXTI->PR |= (1<<0); //清标志位 } } 定时器中断,软件中断和这个套路差不多。都是一个套路。 |
原文链接:http://www.51hei.com/bbs/dpj-177517-1.html
本文章采集网络,如有侵犯请谅解!可以联系本站删除。。谢谢!