码迷,mamicode.com
首页 > 其他好文 > 详细

对stm32中断的理解

时间:2020-07-23 22:21:49      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:外部   delay   ast   方式   struct   中断   img   lan   conf   

? 最开始在串口通信那里第一次看到关于中断的描述,但是一直以来都没搞清楚中断是怎么触发的,中断标志位也不太理解。今天学外部中断的时候好像弄明白了一点点,记录一下。

技术图片

技术图片

? 上图是正点原子家的按键部分的电路图,这个外部中断实验的内容是通过按键产生输入中断控制LED灯。 可以看到KEY2连接引脚PE2,于是将中断线EXTI2连接到PE2,下面是部分初始化代码:

	KEY_Init();	 //	按键端口初始化
	......
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
	EXTI_InitStructure.EXTI_Line=EXTI_Line2;	//KEY2
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	 
	//按键初始化KEY_Init()部分代码
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

? 从电路图知道,KEY2按下时使引脚接地电位为0,于是初始化时按键将PE2上拉,在KEY2未按下时,PE2置高电位,按下时置低电位。同时,在配置中断时,将触发方式设置为沿下降沿触发,于是一旦按下KEY2则会引起中断,进入EXTI2_IRQHandler():

void EXTI2_IRQHandler(void)
{
	delay_ms(10);//消抖
	if(KEY2==0)	  //按键KEY2
	{
		LED0=!LED0;
	}		 
	EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中断标志位  
}

? 中断函数里KEY2是宏定义的引脚PE2的电位检测,进入中断后,检测电位为低电位则说明按下了KEY2,LED变化,然后清除标志位,否则会一直中断。

? 而在串口中断里面,一旦接收到数据就会发生中断,同时收到数据就会清除标识位(好像是这样,我忘记那个问答是哪个平台看到的了),所以没有清除标志位串口也正常工作。通用定时器中断则是在计数器向上\向下溢出时,计数器初始化的时候产生中断,但是这个就需要手动清除标志位了。

? 最后我想电位下降了不是又要回到高电位吗,所以我也尝试把沿下降沿设置为沿上升沿触发,发现按键有的时候有用,大多数时候没用,后来意识到,沿着上升沿触发之后引脚电位应该判断是不是高电位,所以中断函数里面需要判断的是KEY2==1,这样就正常了。

对stm32中断的理解

标签:外部   delay   ast   方式   struct   中断   img   lan   conf   

原文地址:https://www.cnblogs.com/Huang-weimin/p/13367672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!