STM32 外部中断的理解

以下代码是一个"对射式红外传感器计次",实现的功能是,通过隔档对射式红外传感器,产生中断,在中断中计数(显示在OLED上),本篇以此代码,大致了解下STM32中断代码编写的方式。

复制代码
#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count = 0;

void CountSensor_Init(void)
{

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitTypeDef InitTypeStruct;
	InitTypeStruct.GPIO_Mode = GPIO_Mode_IPU;
	InitTypeStruct.GPIO_Pin = GPIO_Pin_14;
	InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &InitTypeStruct);
	

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	

	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStruct);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
}

uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}

void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		CountSensor_Count ++;
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}

解析:

1. 打开外设 GPIOB/AFIO 时钟

复制代码
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

打开外设 GPIOB/AFIO 时钟

RCC : Reset and Clock Control 复位和时钟控制,用于配置处理器的时钟系统和复位功能。
AFIO: Alternate Function I/O 复用功能输入输出,因为这里是将 B14 既作为 GPIO 的输入,又作为中断的中断信号的输出,所以这里需要复用 B14 这个引脚。即,B14 既是有普通 GPIO 功能,又有中断功能。

2. 配置通用 GPIO

复制代码
	GPIO_InitTypeDef InitTypeStruct;
	InitTypeStruct.GPIO_Mode = GPIO_Mode_IPU;
	InitTypeStruct.GPIO_Pin = GPIO_Pin_14;
	InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &InitTypeStruct);

配置 GPIOB PIN14 (PB14) 为上拉输入
GPIO_Mode:管脚工作方式:

复制代码
typedef enum
{ GPIO_Mode_AIN = 0x0, //				//	模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,			//	浮空输入
  GPIO_Mode_IPD = 0x28,					//	下拉输入
  GPIO_Mode_IPU = 0x48,					//	上拉输入
  GPIO_Mode_Out_OD = 0x14,				//	开漏输出
  GPIO_Mode_Out_PP = 0x10,				//	推挽输出
  GPIO_Mode_AF_OD = 0x1C,				//	复用开漏输出
  GPIO_Mode_AF_PP = 0x18				//	复用推挽输出
}GPIOMode_TypeDef;

3. 配置外部中断线映射

复制代码
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);

将 PB14 引脚映射到外部中断线
GPIO_EXTILineConfig: 函数用于配置外部中断线的映射关系,将 GPIO 引脚与外部中断线相连。

4. 配置外部中断线

复制代码
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;					// 指定要配置的外部中断线,如果有多个可以使用 逻辑或(|) 
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;						// 使能
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;			// 工作模式  中断模式 事件模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;		// 触发方式 上升沿 下降沿 上升/下降沿
	EXTI_Init(&EXTI_InitStruct);								// 初始化

5. 配置 NVIC

复制代码
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				// 中断优先级分组
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;			// 指定要配置的中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				// 使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		// 指定中断通道的抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;				// 指定中断通道的子优先级
	NVIC_Init(&NVIC_InitStruct);

6. 中断处理

复制代码
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		CountSensor_Count ++;
		EXTI_ClearITPendingBit(EXTI_Line14);					// 清除中断标志位
	}
}

引用:

  1. https://blog.uwenya.cc/1316.html
相关推荐
TESmart碲视10 分钟前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
small_wh1te_coder1 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
花落已飘1 小时前
STM32中实现shell控制台(shell窗口输入实现)
stm32·单片机·嵌入式硬件
花落已飘2 小时前
STM32中实现shell控制台(命令解析实现)
stm32·shell
没有钱的钱仔2 小时前
STM32低功耗模式全面指南
css·stm32·css3
牵牛老人4 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
宇钶宇夕5 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨5 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao1006 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件
小眼睛FPGA7 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分/紫光同创 IP core 的使用及添加
科技·嵌入式硬件·ai·fpga开发·gpu算力