本章学习目标:
1、必须理解掌握外部中断的机制
2、了解博客中提到的基本概念,如上升沿、下降沿、输入输出模式
前言:
小车的避障功能可以通过红外或者超声波模块来实现,这里先讲讲使用红外对管来实现,超声波的实现涉及到定时器的应用,我们放在后面讲解。
红外对管图片:
器件有三个引脚,VCC和GND就不说了,那个OUT就是输出信号用的,说是信号,其实就是高低电平两种状态(高电平为3.3V,低电平为0V;高电平读出来就是“1”,低电平读出来就是“0”)。
这个器件上电以后,OUT引脚默认输出高电平,当检测到障碍物时OUT引脚会输出低电平,因此会有一个高电平到低电平的变化,我们称之为“下降沿”。我们可以把stm32设置为“下降沿”触发外部中断这样一种机制,因此,当红外对管检测到障碍物时,stm32会被触发中断,从而去执行我们事先编写好的一段程序。
(中断的相关概念和知识,我会尽快整理出来,学弟学妹们现在只要能理解这套机制就行。)
一、原理小讲
红外模块和stm32的连线如下
只要三根线,VCC接开发板的3.3V,GND就接GND,红外对管的OUT找个普通IO引脚就可以,我接在了PB0引脚。
避障流程图
流程图中标蓝的两块地方是红外避障程序设计的重点。
“外部中断触发”我们在前面已经说明过了:红外对管检测到障碍物时OUT引脚会出现一个“下降沿”信号,当我们把与OUT相连的引脚设置为“下降沿”触发中断时,stm32就会检测到这个中断,从而去执行事先编写好的“中断处理程序”。
二、实践
那我们现在要做两件事:配置与OUT相连的stm32引脚为“下降沿”触发中断、编写中断处理函数。
1、配置“下降沿”触发中断
代码贴出如下:
RCC->APB2ENR |= 1<<3; //使能PORTB时钟
GPIOB->CRL &= 0xFFFFFFF0;
GPIOB->CRL |= 0x00000008;//PB0 输入模式
Ex_NVIC_Config(GPIO_B,0,FTIR); //配置为下降沿触发
MY_NVIC_Init(2,2,EXTI0_IRQn,2); //配置中断优先级为:抢占2,响应2,组2
前三行是将于OUT相连的引脚配置为输入模式,有关GPIO的内容大家如果有需要可以在公众号后台留言,需要的人多的话我会在公众号出一篇详细的图文。
后面两行就是配置“下降沿”的代码了,Ex_NVIC_Config(GPIO_B,0,FTIR); 就是把PB0引脚配置为“下降沿”触发中断的模式,FTIR是个宏定义,其实就是1。这个函数接口是原子哥封装好的,其实底层还是去操作GPIO相关的寄存器,就和我们上面三行的代码类似。
MY_NVIC_Init(2,2,EXTI0_IRQn,2); 这行代码是为中断设置优先级,因为中断之间是可以被抢占、打断的,这部分内容会专门开辟章节进行讲解,因为涉及到中断控制器、中断向量表等相关知识,对入门的同学来说可能有点吃力。
2、编写中断处理函数
你现在可以这样理解:当发生中断时,stm32硬件自己就会执行一个函数,而且这个函数的名称、返回值、入参都已经定死了,唯一没有定死的就是函数内需要执行的操作。
因此,我们要做的就是找到这个函数,然后在函数里填上我们要实现的功能,比如“让小车停下来”或者“让小车左转”等等。
这个函数的名称就是EXTI0_IRQHandler,至于为什么是这样,等后面学习了中断向量表的概念再展开。
目前,我们在EXTI0_IRQHandler中执行的操作就是打印语句,等电机驱动讲完后就会加上相关业务代码。
void EXTI0_IRQHandler(void)
{
printf("warning!warning!warning!\r\n");
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
就是说,当红外对管检测到障碍物时,我们就打印“warning!warning!warning!”。
EXTI->PR=1<<0;这句是清中断标志位,如果不清掉就会一直进中断处理函数。
这个打印出来的值要从串口助手上查看,有关串口的知识后续展开,先学会用就行。
学完这部分,你可以在中断处理函数中做一个“点亮led灯”的操作,一定要自己动手实践起来!绝知此事要躬行!
实验现象和相关讲解我录了个视频,放在了公众号“游侠嵌入式”,完整的工程代码也放在了公众号,回复关键字“外部中断”即可获取。代码级的讲解也会陆续放在公众号上。
下一篇:智能小车——PWM电机驱动
这里贴两张实验图片:
未检测到障碍物,不触发中断、左灯不亮
检测到障碍物,触发中断、左灯亮,并且串口助手打印信息:
三、小结
其实有关中断这部分的内容可学习的太多了,面试也是会常问的,比如一个最经典的问题“中断函数有没有返回值和入参?”,但也不要太心急了,所谓不积跬步无以至千里,慢慢来,你行的。