03:【江科大stm32】:外部中断EXTI的使用

devtools/2024/9/23 14:25:46/

外部中断EXTI的使用

  • 1、按钮通过外部中断控制LED
  • 2、旋转编码器计次

1、按钮通过外部中断控制LED

/*外部中断按键控制LED,使用外部中断EXTI0进行按键控制LED的亮灭
*/
#include "stm32f10x.h" 
int main(void)
{//1.对PB0引脚进行配置,按键连接的引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOB,&GPIOInitStruct);//对PA0进行配置,LED连接的引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA,&GPIOInitStruct);//2.对AFIO进行配置,AFIO的功能:①复用功能重映射,②中断引脚选择RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//选择PB0通道进行外部中断//3.对EXTI进行配置EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line0;//选择EXTI0EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发中断EXTIInitStruct.EXTI_LineCmd = ENABLE;//使能中断屏蔽EXTI_Init(&EXTIInitStruct);//4.对NVIC进行配置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级的分组,0抢占,4子优先NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;//选择中断来源NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占为0NVICInitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级为0NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;//使能NVICNVIC_Init(&NVICInitStruct);while(1){}
}//中断函数
void EXTI0_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line0) == SET)//判断EXTI0中断挂起寄存器的值{EXTI_ClearITPendingBit(EXTI_Line0);//EXTI0的中断挂起寄存器置位if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0) == RESET)//如果是点亮的{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//熄灭}else{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//点亮}}
}

2、旋转编码器计次

/*通过外部中断使用旋转编码器计次
*/#include "stm32f10x.h"                 
#include "OLED.h"uint32_t count = 0;
int main(void)
{OLED_Init();OLED_Clear();//1.旋转编码器的B连接单片机的PB1,A连接单片机的PB0,对引脚的初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIOInitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;GPIO_Init(GPIOB,&GPIOInitStruct);//2.对AFIO进行配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//3.对EXTI进行配置EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line0 | EXTI_Line1;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);//4.对NVIC进行配置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);while(1){OLED_ShowSignedNum(1,1,count,5);}
}//中断函数
void EXTI0_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line0) == SET){EXTI_ClearITPendingBit(EXTI_Line0);//清除中断状态if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)count++;}
}void EXTI1_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line1) == SET){EXTI_ClearITPendingBit(EXTI_Line1);//清除中断状态if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)count--;}
}

http://www.ppmy.cn/devtools/103439.html

相关文章

UE5学习笔记16-游戏模式中的一些事件,如何改变网格体和摄像头的碰撞

一、OnPostLogIn:此事件在玩家成功登录游戏后被调用 二、HandleStartingNuwplayer:在OnPostLogIn事件后被调用,可以用来定义新进入的玩家会发生什么 三、Spawn Default PawnAtTransform:这个事件触发游戏中实际的Pawn生成 四、…

uni-app中分页器的实现

一、template change函数在每次点击上一页 或者写一页的时候会触发&#xff0c;其传递的参数是当前的current页数 <uni-section class"fixed-bottom" title"默认样式" type"line" padding><uni-pagination change"handleList&qu…

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…

RabbitMQ高级特性

目录 前言 数据持久化原理 1. 数据持久化概述 2. 消息持久化 3. 队列持久化 4. 磁盘与内存持久化 RabbitMQ高级特性 1. 惰性队列&#xff08;Lazy Queues&#xff09; 2. 优先级队列&#xff08;Priority Queues&#xff09; 3. 死信队列&#xff08;Dead Letter Exc…

LuaJit分析(一)LuaJit交叉编译

​​​​​​Android 使用ndk版本 r16b 在luajit2.1.0-beta3目录下创建一个脚本文件&#xff0c;armv7编译代码如下&#xff1a; make clean NDKE:/android-ndk-r16b #ndk路径 NDKABI21 NDKTRIPLEarm-linux-androideabi NDKVER$NDK/toolchains/$NDKTRIPLE-4.9 NDKP$NDKVER/…

黑马JavaWeb开发笔记06——Vue(概述、指令、生命周期)

文章目录 前言一、Vue概述1. MVVM前端开发思想2. 框架是什么3. Vue介绍4. Vue快速入门 二、Vue常用指令三、Vue生命周期总结 前言 本篇文章是2023年最新黑马JavaWeb开发笔记06&#xff1a;Vue&#xff08;概述、指令、生命周期&#xff09;的总结&#xff0c;帮助需要学习Web开…

【Go函数详解】二、参数传递、变长参数与多返回值

文章目录 一、传递参数1. 按值传参2. 引用传参2.1 特殊情况2.1.1 切片slice2.1.2 字典map 二、变长参数1. 基本定义和传值1.1 基本定义1.2 传值1.2.1 普通传值1.2.2 传递切片 2. 任意类型的变长参数&#xff08;泛型&#xff09; 三、多返回值1. 命名返回值 一、传递参数 1. 按…

ARCGIS 纸质小班XY坐标转电子要素面(2)

本章用于说明未知坐标系情况下如何正确将XY转要素面 背景说明 现有资料&#xff1a;清除大概位置&#xff0c;纸质小班图&#xff0c;图上有横纵坐标&#xff0c;并已知小班XY拐点坐标&#xff0c;但未知坐标系。需要上图 具体操作 大部分操作同这边文章ARCGIS 纸质小班XY…