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

STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)

 配置EXIT外部中断其实就是把GPIO刀NVIC的各个外设配置好

第一步:配置RCC,把我们涉及到的外设的时钟都打开

(此处EXTI是默认打开的,而NVIC是内核外设无需配置)

第二步:配置GPIO,选择端口为输入模式

第三步:配置AFIO,一共有16个引脚可以选择,每个引脚只能配一个GPIO端口

第四步:配置EXTI,选择边沿触发方式,比如上升沿,下降沿,双边沿,

选择触发响应方式(中断响应,事件响应)

中断响应:CPU处理

事件响应:对应某个外设处理,CPU正常工作

第五步:配置NVIC,给中断设置响应优先级和抢占优先级

响应优先级:当中断队列中有多个请求时,响应优先级高的(数字越小越高)将会优先执行

抢占优先级:当已有中断在运行时,此时再来一中断请求若其抢占优先级比正在运行的中断事件的抢占优先级高的话会在原中断事件上再嵌套一个中断事件

原理图:

 模板代码:

uint16_t Key_Count = 0;//中断计数位
void KeyIt_Init(void)//按键中断初始化函数
{GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化传参结构体EXTI_InitTypeDef EXTI_InitStructure;//定义EXTI初始化传参结构体NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC初始化传参结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//设置为上拉输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//选择1号引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置IO口速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO,传入结构体参数GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//在AFIO里将1号引脚的中断线路分配给GPIOA端口EXTI_InitStructure.EXTI_Line = EXTI_Line1;//选择外部中断线路为1号线路(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,传入结构体参数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将优先级设置为分组2的配置,即抢占优先级为2位(0~3),响应优先级为2位(0~3),数字越小优                        先级越高NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//选择为EXTI1通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能对应通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//设置响应优先级为1NVIC_Init(&NVIC_InitStructure);//初始化NVIC,传入结构体参数
}
uint16_t Key_Count_Get(void)//返回中断计数位函数
{return Key_Count;//返回中断计数位
}
void EXTI1_IRQHandler(void)//每个中断的中断处理函数都是固定的,在启动文件里找
{if (EXTI_GetITStatus(EXTI_Line1) == SET//如果该中断线路状态寄存器值为SET){Key_Count++;//中断计数位自增EXTI_ClearITPendingBit(EXTI_Line1);//清除中断标志位}
}


http://www.mrgr.cn/news/76416.html

相关文章:

  • 嵌入式交叉编译:glib(未成功)
  • Flutter:android studio无法运行到模拟机的问题
  • 传奇996_19——龙岭总结
  • 自动化运维(k8s):一键获取指定命名空间镜像包脚本
  • LeetCode题练习与总结:整数替换--397
  • 使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值
  • 邻接多重表、十字链表、边集数组
  • Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler
  • 神经网络与Transformer详解
  • 项目配置文件选择(Json,xml,Yaml, INI)
  • 【数据结构与算法】查找
  • Java集合(Collection+Map)
  • LoFTR: Detector-Free Local Feature Matching with Transformers—特征点匹配算法系列
  • STM32 标准库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别
  • 【笔记】关于git和GitHub和git bash
  • 嵌入式交叉编译:harfbuzz
  • 计算机网络——路由选择算法
  • HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)
  • Golang超详细入门教程
  • Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)
  • 针对git、giteeVSCode连接的使用 || Live Share插件使用
  • Python接口自动化测试
  • 036集——查询CAD图元属性字段信息:窗体显示(CAD—C#二次开发入门)
  • 蓝桥杯c++算法学习【3】之思维与贪心(重复字符串、翻硬币、乘积最大、皮亚诺曲线距离【难】:::非常典型的必刷例题!!!)
  • 两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤
  • SpringMVC跨线程获取requests请求对象(子线程共享servletRequestAttributes)和跨线程获取token信息