Bootstrap

八、STM32的外部中断(二)

介绍:本章节主要讲解了如何在STM32中配置和实现外部中断功能。通过具体应用场景,如对射式红外传感器、旋转编码器及OLED模块,详细阐述了如何利用这些硬件设备来触发和响应外部中断事件。在这个过程中,我们不仅介绍了外部中断的基础配置,还深入探讨了如何通过合理的程序设计和调度,使得系统能够高效、准确地响应外部信号,从而实现对物理世界的实时监控与控制。通过这一系列实例,我们展现了STM32在处理外部中断时的灵活性与强大功能。

 

目录

一、相关函数的解读 

二、对射式红外传感器程序实现 

三、对射式红外传感器的程序现象 


 

 

一、相关函数的解读 

1.1 

GPIO_AFIODeInit:

用来复位AFIO外设。

 1.2

GPIO_PinLockConfig:

锁定GPIO的配置防止意外更改。

 1.3

 GPIO_PinRemapConfig:

引脚重映射。

1.4

GPIO_EXTILineConfig:

配置AFIO的数据选择器,选择中断引脚 。

1.5

EXTI_DeInit :

把EXTI配置清除并且恢复成默认状态。

1.6 

 EXTI_Init:

初始化。

1.7

EXTI_GenerateSWInterrupt:

软件触发中断。 

1.8

EXTI_GenerateSWInterrupt:

获取指定的标志位是否被置一,推荐在非中断函数中使用该函数。 

1.9 

EXTI_ClearFlag:

对标志位清除,推荐在非中断函数中使用。

1.10

EXTI_GetITStatus:

获取指定的标志位是否被置一,推荐在中断函数中使用该函数。

1.11

EXTI_ClearITPendingBit :

对标志位清除,推荐在中断函数中使用。

1.12

 NVIC_PriorityGroupConfig:

设置中断分组,整个芯片只能用一种分组方式!!!

1.13

NVIC_Init:

初始化。 

1.14

NVIC_SetVectorTable:

设置中断向量表。 

 

二、对射式红外传感器程序实现 

 2.1接线方式:

2.2程序实现.c:

根据上一章节所讲述的EXTI的基本结构,来一步一步配置GPIO->AFIO->EXTI->NVIC。 

#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count;

void CountSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
}

uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}

void EXTI15_10_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
		{
			CountSensor_Count ++;
		}
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}

2.3程序解读:

2.3.1 RCC_APB2PeriphClockCmd   开启AFIO的时钟,外部中断必须开启AFIO的时钟。

 2.3.2GPIO_EXTILineConfig  将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚。

2.3.3EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt  指定外部中断线为中断模式。 

2.3.4EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling  设置触发方式为下降沿触发。

2.3.5NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)  设置中断分组为2,即抢占优先级范围:0~3,响应优先级范围:0~3。 

2.3.6NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn  选择配置NVIC的EXTI15_10线。

2.3.7void EXTI15_10_IRQHandler(void)   每一个中断通道都有对应的中断函数(不需要自己定义,可以在启动文件中找到),每次在中断执行后必须要清除清除EXTI_ClearITPendingBit(EXTI_Line14)。

 2.4程序的实现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);
	}
}

2.5程序的解读:  

2.5.1  OLED_Init();CountSensor_Init();初始化。

2.5.2  CountSensor_Get()  获取CountSensor_Count值。

2.5.3  OLED_ShowNum(1, 7, CountSensor_Get(), 5)  显示CountSensor_Count值。

 

三、对射式红外传感器的程序现象 

 当对射式红外传感器被物体遮挡,随后物体移开,会发现OLED显示屏幕上的值加一。

 

 

到此本篇文章结束。

At the end of this article, applaud yourself again!!

;