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

EXTI (2)

增强版实验简介
在这里插入图片描述
EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源
改变引脚 PA0和PA1改变为PA5 和PA6在这里插入图片描述
EXTI的重映射
在这里插入图片描述
之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上
EXTI进行初始化在这里插入图片描述
NVIC初始化
在这里插入图片描述
编写中断函数
在这里插入图片描述
因为EXTI5和6都可以触发同一个中断源 所以要判断到底是哪一个触发的 就要去查中断挂起寄存器的值 如果是第一个为1就是EXTI5触发的 如果是第二个为1那就是EXTI6触发的

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);PAL_Init();// 1. 初始化IO引脚// 将PA0和PA1分别设置为输入上拉模式// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// PA0, PA1GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin  = GPIO_Pin_5 | GPIO_Pin_6;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIOInitStruct);// 2. 配置EXTI的引脚映射// 开启AFIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// PA0 -> EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);// PA1 -> EXTI1GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);// 3. 初始化EXTI// 3.1. 初始化EXTI5EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line5;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);// 3.2. 初始化EXTI6EXTIInitStruct.EXTI_Line = EXTI_Line6;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);// 4. 初始化NVICNVIC_InitTypeDef NVICInitStruct;// 4.1. EXTI0 EXTI5,EXTI6共用一个中断源 写一个就可以了NVICInitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);// 5. 初始化PC13RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // Open-drainGPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIOInitStruct);while(1){}
}void EXTI9_5_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line5)==SET) // EXTI5触发的中断{//清除中断源EXTI_ClearITPendingBit(EXTI_Line5);//点灯GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}if(EXTI_GetITStatus(EXTI_Line6)==SET)  //EXTI6触发的中断{//清除中断源EXTI_ClearITPendingBit(EXTI_Line6);//灭灯GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}	
}

EXTI的PAL库编程

标准库编程的不足
在这里插入图片描述
初始化IO引脚就要使能GPIOA和C的时钟调用GPIO_Init函数初始化GPIOA GPIOC的引脚 输入还是输出模式 输出的速度(输入就不用设置) 然后IO引脚的重映射 使能AFIO的时钟调用函数GPIO_EXTILineConfig把PA5和PA6分别映射到EXTI5 EXTI6上去 然后再初始化EXTI 调用EXTI INIT函数 EXTI的通道 EXTI的模式(事件还是中断模式)等等 然后还要初始化NVIC 还要查明中断来自于那个通道 (因为PA5和PA6是共用中断源 要是是PA1和PA0就各自用中断源 无需判断中断来自于那个通道)
PAL库编程接口简介
在这里插入图片描述
EXTI PAL库 编程分为三个部分
在这里插入图片描述
在这里插入图片描述
填写初始化参数初始化了一切就是没有关闭中断屏蔽
使能EXTI的通道就是闭合中断屏蔽
编写中断响应函数
在这里插入图片描述
在标准库中我们是使用弱方法 覆盖掉函数名 在中断函数中我们查询了中断挂起位的值(分辨到底是那个PA5还是PA6引起的触发中断)还清除了中断 在PAL库中只需要调用一个函数接口就可以完成这两件事

http://www.lryc.cn/news/232407.html

相关文章:

  • Django实战项目-学习任务系统-任务完成率统计
  • 安卓调用手机邮箱应用发送邮件
  • Vue-Pinia
  • C语言,编写程序输出半径为1到15的圆的面积,若面积在30到100之间则予以输出,否则,不予输出
  • Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感
  • 对数据库密码使用MD5加密算法加密,并进行登录验证
  • 关于Chrome中F12调试Console输入多行
  • C# 集合用法介绍
  • linux三次握手、四次挥手
  • C# 泛型介绍
  • Windows如何正确设置PHP环境变量以在Git Bash中运行命令
  • [代码实战和详解]VGG16
  • x3daudio1_7.dll错误:解决方法和丢失原因及作用
  • pipeline + node +jenkins+kubernetes部署yarn前端项目
  • 计算机网络中的面向连接与无连接
  • EventEmitter3在vue中的使用
  • 双剑合璧:基于Elasticsearch的两路召回语义检索系统,实现关键字与语义的高效精准匹配
  • LeetCode34-34. 在排序数组中查找元素的第一个和最后一个位置
  • ddrnet 分割学习笔记
  • Outlook关闭过去事件的提醒
  • git 简单入门
  • 只有开源才能拯救AI
  • 在Spring Boot中使用进程内缓存和Cache注解
  • YOLOv5项目实战(3)— 如何批量命名数据集中的图片
  • React + hooks + Ts 实现将后端响应的文件流(如Pdf)输出到浏览器下载
  • 大数据基础设施搭建 - JDK
  • 从0到0.01入门React | 010.精选 React 面试题
  • Docker启动SRS流媒体服务器
  • php+MySQL防止sql注入
  • git 删除远程非主分支