原理:
遮挡,输出高电平,灯灭。
无遮挡,输出低电平,灯亮。
一、外部中断配置
过程简介
![](https://i-blog.csdnimg.cn/blog_migrate/100c4cf2f7130ca9ba7e91b30f82187a.png)
RCC:
AFIO、GPIO都挂在APB2上
EXTI、NVIC不需要再开启RCC时钟,因为NVIC住在“皇宫”,RCC管不着
--->在很多微处理器中,外部中断线(EXTI)是通过NVIC中断控制器来实现的。因为NVIC中断控制器有专门的时钟来驱动它的工作,因此不需要额外再开启一个时钟来驱动EXTI。
补:函数学习
二、核心代码
Countsensor.c
注意:EXTI GPIO输入模式 IPU、 IPD 、IN_FLOATING三者都可
注意:NVIC优先级原则:
1.先判断抢占优先级,高抢占优先级可以打断低抢占优先级的中断
2.如果抢占优先级相同,再判断响应优先级,高响应优先级不能打断低响应优先级
3.抢占优先级相同的中断,当中断同时发生时,响应级高的先执行
4.抢占和响应优先级都一样则哪个中断先发生,则执行哪个
CountSensor.h
中断函数不用声明,因为它无需调用,会自动执行
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
void CountSensor_Init(void);
uint16_t CountSensor_Get(void);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"
int main(void)
{
OLED_Init();
CountSensor_Init();
OLED_ShowString(1,1,"Count:");
while(1)
{
OLED_ShowNum(1,7,CountSensor_Get(),5);
}
}
三、现象及解释
遮挡时不计数,移开时加一
原因:
若遮挡传感器,输出高电平,灯灭;移开的一瞬间,电平 高-->低
而中断触发方式是下降沿触发,只有在移开时,才触发中断,+1