介绍:本章节主要讲解了如何在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!!