Stm32学习笔记2-中断系统-对射式红外传感器计次

一.中断系统:

1.中断条件:当主程序运行时,出现了特点的中断条件,此时程序暂停运行当前直到处理完中断程序后再继续执行操作。

2.中断优先级:当有多个中断时,cpu会根据中断轻重优先选择加急的中断程序。

3.参考nvic基本结构:可以看出stm32中的许多外设像EXTI、TIM等都有中断通道。通过NVIC统一管理。经过NVIC裁决后可向中断CPU当前程序转而执行这些外设的中断程序。

Stm32学习笔记2-中断系统-对射式红外传感器计次_第1张图片

二.EXTI外设:

1.EXTI全名:外部中断/事件控制器,它可以检测指定的GPIO口电平信号,当该端口电平信号发生变化时就能向NVIC发送中断申请。

2.观察EXTI基本结构及框图:可以知道大致执行逻辑为:当20根输入线输入信号时,通过边沿检测电路选择判断是上升沿/下降沿信号变化 --> 将信号输入到或门中,通过软件中断事件寄存器判断去向 -->|分两个去向:一个是通过请求挂起寄存器控制中断的挂起/恢复 -->与中断屏蔽寄存器的信号共同进入一个与门,此时中断屏蔽寄存器展现为开关作用。同为真即可输入到NVIC中请求中断。-->|另一个路线则是触发事件中断。

Stm32学习笔记2-中断系统-对射式红外传感器计次_第2张图片

Stm32学习笔记2-中断系统-对射式红外传感器计次_第3张图片

三.代码编写:

1.首先使能GPIO、AFIO外设的时钟(由于EXIT、NVIC内核的外设时钟是一直打开的,因此不需要使能)

2.通过AFIO映射中断引脚

3.配置EXIT(中断线路、判断方法[边沿检测] )

4.配置NVIC外设(该线路的优先级)

代码如下:

#include "stm32f10x.h"                  // Device header

uint16_t num;  //定义全局变量,用来计数
void IntRED()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO外设
	
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO的结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//设定GPIO的引脚模式为上拉输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//设定GPIOA的端口为Pin9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设定最大输出速度
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO结构体
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource9);//将外部中断的9号线映射到PA9
															//即选择了PA9为中断线
	
	EXTI_InitTypeDef EXTI_InitStructure;	//定义EXTI结构体
	EXTI_InitStructure.EXTI_Line=EXTI_Line9;//选择配置外部中断的9号线
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中断线
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设定该线模式为中断模式
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//指定外部中断线为下降沿触发
	EXTI_Init(&EXTI_InitStructure);	//初始化EXT结构体
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//在NVIC中分组为2
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;		//选择配置NVIC的EXTI9_5线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);	
}

uint16_t GetNum(void)//设定一个函数返回要计算的数字
{
	return num;
}

void EXTI9_5_IRQHandler(void)//中断程序,当到达中断源时执行该函数
{
	if(EXTI_GetITStatus(EXTI_Line9)==SET)//判断外部中断线是否被触发
	{
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 0)//消除抖动
		{
			num ++;					
		}
		EXTI_ClearITPendingBit(EXTI_Line9);//清除外部引脚的中断标志位
	}
}
新学习的函数总结:

GPIO_EXTILineConfig(GPION,PINX);
//AFIO映射函数,可以将外部中断的PINX号线映射到GPION,即选择了PNX为外部中断线

EXTI_InitStructure.EXTI_Line=EXTI_LineX;
//当通过AFIO选择好外部中断线后选择配置该线

EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//使能中断线

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
//设定该线模式为中断模式

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
//设定该线的触发方式为下降沿触发

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
//当配置好EXTI后就开始配置NVIC,首先给NVIC分组

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	
//指定NVIC线路的抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//指定NVIC线路的响应优先级为1

EXTI9_5_IRQHandler();
//中断程序,当到达中断源后运行该程序		

你可能感兴趣的:(stm32,学习,笔记)