当前位置: 首页 > news >正文

STM32_外部中断

STM32_外部中断

image-20260211225201379

1、对射式红外传感器计次

main.c

#include "stm32f10x.h"                  // Device header
#include "CountSensor.h"
#include "OLED.h"int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化CountSensor_Init();/*显示静态字符串*/OLED_ShowString(1, 1, "Count:");	//1行1列显示字符串Count:while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);		//OLED不断刷新显示CountSensor_Get的返回值}
}

LightSensor.c

#include "stm32f10x.h"                  // Device headeruint16_t CountSensor_Count;							//全局变量,用于计数void CountSensor_Init(void)
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  				// 开启GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 	 				// 开启AFIO时钟,外部中断必须开启AFIO的时钟// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);    										// 将PB14引脚初始化为上拉输入// AFIO选择中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);  // 将外部中断的14号线映射到GPIOB, 即选择PB14为外部中断引脚// EXTI初始化EXTI_InitTypeDef EXTI_InitStructure;  									// 定义结构体变量EXTI_InitStructure.EXTI_Line = EXTI_Line14;    					// 选择配置外部中断的14号线   EXTI_InitStructure.EXTI_LineCmd = ENABLE;						  	// 指定外部中断线使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			// 指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	// 指定外部中断线为下降沿触发EXTI_Init(&EXTI_InitStructure);													// 将结构体变量交给EXTI_Init, 配置EXTI外设// NVIC中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         // 配置NVIC为分组2// 即抢占优先级范围:0~3,响应优先级范围:0~3// 此分组配置在整个工程中仅需调用一次// 若有多个中断,可以将此代码放在main函数内,while之前// 若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置// NVIC配置NVIC_InitTypeDef NVIC_InitStructure;										// 定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		// 选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					// 指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;// 指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			// 指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);													// 将结构体变量交给NVIC_Init, 配置NVIC外设
}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14) == SET)				// 判断是否是外部中断14号线触发的中断{// 如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;								// 计数器自增一次}EXTI_ClearITPendingBit(EXTI_Line14);	// 清楚外部中断14号线中断标志位// 中断标志位必须清除// 否则中断将连续不断地触发,导致主程序卡死}
}

LightSensor.h

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif

2、旋转编码器计次

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encode.h"int16_t Num;														//定义待被旋转编码器调节的变量int main(void)
{OLED_Init();													//OLED初始化Encoder_Init();												//旋转编码器初始化/*显示静态字符串*/OLED_ShowString(1, 1, "Num:");				//1行1列显示字符串Num:while (1){Num += Encoder_Get();								//获取自上此调用此函数后,旋转编码器的增量值,并将增量值加到Num上OLED_ShowSignedNum(1, 5, Num, 5);		//显示Num}
}

Encode.c

#include "stm32f10x.h"          // Device headerint16_t Encoder_Count;					// 全局变量,用于计数旋转编码器的增量值void Encoder_Init(void)
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     // 开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);			// 开启AFIO的时钟,外部中断必须开启AFIP的时钟// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);           						 // 将PB0和PB1引脚初始化为上拉输入// AFIO选择中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);  //将外部中断的0号线映射到GPIOB,即选择PB0为外部中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);  //将外部中断的1号线映射到GPIOB,即选择PB1为外部中断引脚// EXTI初始化EXTI_InitTypeDef EXTI_InitStructure;												 // 定义结构体变量EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;      // 选择配置外部中断的0号线和1号线EXTI_InitStructure.EXTI_LineCmd = ENABLE;										 // 指定外部中断线使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;					 // 指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;			 // 指定外部中断线为下降沿触发EXTI_Init(&EXTI_InitStructure);															 // 将结构体变量交给EXTI_Init,配置EXTI外设// NVIC中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);								// 配置NVIC为分组2// 即抢占优先级范围:0~3,响应优先级范围:0~3// 此分组配置在整个工程中仅需调用一次// 若有多个中断,可以把此代码放在main函数内,while循环之前// 若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置// NVIC配置NVIC_InitTypeDef NVIC_InitStructure;													// 定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;							// 选择配置NVIC的EXTI0线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								// 指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;			// 指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;						// 指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);																// 将结构体变量交给NVIC_Init,配置NVIC外设NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;							// 选择配置NVIC的EXTI1线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								// 指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;			// 指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;						// 指定NVIC线路的响应优先级为2NVIC_Init(&NVIC_InitStructure);																// 将结构体变量交给NVIC_Init,配置NVIC外设
}int16_t Encoder_Get(void)
{/*使用Temp变量作为中继,目的是返回Encoder_Count后将其清零*//*在这里,也可以直接返回Encoder_Count但这样就不是获取增量值的操作方法了也可以实现功能,只是思路不一样*/int16_t Temp;Temp = Encoder_Count;Encoder_Count = 0;return Temp;
}// EXTI0外部中断函数
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) == SET)    										// 判断是否是外部中断0号线触发的中断{// 如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)   {if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)			//PB1的下降沿触发中断,此时检测另一相PB1的电平,目的是判断旋转方向{Encoder_Count --;																		//此方向定义为反转,计数变量自减}}EXTI_ClearITPendingBit(EXTI_Line0);													//清除外部中断0号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}// EXTI1外部中断函数
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) == SET)    										// 判断是否是外部中断0号线触发的中断{// 如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)   {if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)			//PB0的下降沿触发中断,此时检测另一相PB1的电平,目的是判断旋转方向{Encoder_Count ++;																		//此方向定义为反转,计数变量自加}}EXTI_ClearITPendingBit(EXTI_Line1);													//清除外部中断1号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}

Encode.h

#ifndef __ENCODER_H
#define __ENCODER_Hvoid Encoder_Init(void);
int16_t Encoder_Get(void);#endif
http://www.jsqmd.com/news/375017/

相关文章:

  • 2026年广州艾美手表维修网点推荐评测:非官方维修中心服务榜单与避坑指南 - 十大品牌推荐
  • 2026年质量好的Y形铜塑复合三通DOT接头/宁波DOT接头用户好评厂家推荐 - 行业平台推荐
  • 2026年北京泰格豪雅手表维修推荐榜单:非官方维修点评测与售后网点服务分析 - 十大品牌推荐
  • 2026年广州艾米龙手表维修推荐评测:非官方维修网点服务与售后选择指南 - 十大品牌推荐
  • 2026年东莞苹果售后维修点评测推荐:设备故障时的专业服务选择指南 - 十大品牌推荐
  • 2026年福州笔记本电脑售后维修点评测推荐:当电脑突发故障,如何找到靠谱的维修服务 - 十大品牌推荐
  • KTV/剧场/文旅怎么做灯光?五大核心要素与Top5厂家精选 - 深度智识库
  • 2026年广州WEMPE手表维修网点推荐评测:非官方服务中心选择指南与排名分析 - 十大品牌推荐
  • 常用JPG转WebP在线工具对比:哪种方式更高效?
  • 2026年北京苹果售后维修点评测推荐:设备故障时的专业服务选择指南 - 十大品牌推荐
  • 2026年北京天梭手表维修推荐评测:非官方维修网点服务与售后中心选择指南 - 十大品牌推荐
  • 2026年北京手表维修推荐评测排名:非官方网点服务售后中心选择指南 - 十大品牌推荐
  • 舞台灯光稳定性与性价比兼顾?这5家源头厂家值得收藏 - 深度智识库
  • 2026年比较好的四川消防工程检测/四川消防工程用户口碑认可厂家 - 行业平台推荐
  • 2026年北京斯沃琪手表维修网点推荐评测:非官方维修中心服务榜单与避坑指南 - 十大品牌推荐
  • 2026年北京同城搬家公司评测推荐:告别搬家烦恼的实用选择榜单 - 十大品牌推荐
  • 2026年评价高的工具箱拉杆定制/行李箱拉杆优质供应商推荐参考 - 行业平台推荐
  • RBAC前端架构-07:自定义指令role、permission实现权限控制
  • 2026年北京欧米茄手表维修推荐榜单评测:非官方网点服务与售后中心选择指南 - 十大品牌推荐
  • 2026年正规的代理记账/温州注册公司代理记账用户认可推荐企业 - 行业平台推荐
  • 2026年北京时度表手表维修评测与排名:非官方维修网点服务与售后中心选择指南 - 十大品牌推荐
  • 2026年热门的北京伞齿轮丝杆升降机/进口丝杆升降机厂家怎么挑 - 行业平台推荐
  • 详细介绍:什么是流程监控?如何构建跨系统BPM的实时监控体系?
  • 2026年北京欧瑞玺手表维修推荐评测:非官方维修网点服务榜单与避坑指南 - 十大品牌推荐
  • 常州代理记账服务选型全攻略:基于数据与案例的TOP5品牌竞争力分析 - 速递信息
  • 淡化纹路用什么美容仪好?5款热门款实测 - 速递信息
  • 2026年靠谱的201不锈钢网片/河北不锈钢网片厂家热卖产品推荐(近期) - 行业平台推荐
  • 2026年北京帕玛强尼手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 十大品牌推荐
  • 中值法排序及LexoRank排序算法简述
  • 2026年北京手表保养推荐榜单:非官方维修点选择与售后网点服务评测 - 十大品牌推荐