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

基于标准库的STM32的外部中断EXTI

        毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI):

外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(EXTI/NVIC不需要开启时钟)

1.RCC开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.配置GPIO

方式如我之前写的《STM32标准库编译流程》http://t.csdnimg.cn/0UkGa所示,代码如下:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//查阅手册可知外部中断为上拉模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
3.配置AFIO

进入GPIO库函数,找到void GPIO_AFIODeInit(void)函数,该函数负责将AFIO复位;

GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
GPIO_EventOutputCmd(FunctionalState NewState);用以配置AFIO事件输出功能。

GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);用以配置AFIO的数据选择器,用来选择想要的中断引脚。

那么配置中断的方法如下:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);

大概的目的就是选择一个引脚GPIOE1用来接收中断信号,这样GPIOE1上的电平中断信号就可以通过AFIO传入EXTI中了,接下来配置EXTI:

4.配置EXTI

进入EXTI库函数,EXTI相关的库函数如下:

158行的作用是复位,159是根据参数配置外设(这就是所需的函数),160将参数中的结构体变为默认值,161软件触发外部中断,164的作用是判断中断类型,165作用是清除中断标志位。

则初始化代码如下:

EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
void EXTI_Init(& EXTI_InitStruct);
5.配置NVIC

其为内部外设,所以他的库函数在misc文件中,找到196行,具体函数如下:

196的作用是指定中断的分组,197的作用是初始化,其他的暂不作了解

则配置方式如下:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(& NVIC_InitStruct);

值得注意的是,NVIC_InitStruct.NVIC_IRQChannel这个参数若引脚为10-15才为上述参数,若不是,则选择EXTIX_IRQn(X为引脚编号)

6.中断响应后执行的函数

该函数名为固定的,查找方法如下:

1.找到中断通道,本文中的是EXTI15_10_IRQn。

2.找到启动文件,即start中的startup_stm32f10x_md.s

3.找到中断向量表(大概在119行),在找到对应的函数名即可。

void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)//判断是否是自己想要的中断,使用前文提到的函数
{//写函数的功能
EXTI_ClearITPendingBit(EXTI_Line14)//清除中断标志位,否则退出后又会返回到该函数
}
}

编写完成后,若E14引脚出现电平下降,则会中断其他函数,来执行EXTI15_10_IRQHandler函数

注:主函数中只需初始化外部中断即可,因为EXTI15_10_IRQHandler函数是库中自带的只需要声明即可。

初始化函数整体如下:

int EXIT_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//查阅手册可知外部中断为上拉模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
EXTI_Init(&EXTI_InitStruct);NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

相关文章:

  • MyBatis延迟加载缓存分页逆向工程
  • 【计算机毕业设计】345大学生心理健康测评管理系统小程序
  • Flink实现实时异常登陆监控(两秒内多次登陆失败进行异常行为标记)
  • 网络原理-TCP/IP --传输层(UDP)
  • 艾体宝洞察 | Redis Enterprise对比ElastiCache
  • springboot实现文件上传功能,整合云服务
  • 前端经典手写面试题---节流防抖
  • (含笔试题)深度解析数据在内存中的存储
  • JS-09-es6常用知识1
  • NVIDIA Technologies
  • Spring Boot(七十四):集成Guava 库实现布隆过滤器(Bloom Filter)
  • java学习路径
  • MATLAB基础应用精讲-【数模应用】联合分析
  • 【LINUX】LINUX基础(目录结构、基本权限、基本命令)
  • SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
  • 「译」Node.js Streams 基础
  • gcc介绍及安装
  • golang 发送GET和POST示例
  • HTTP中的ETag在移动客户端的应用
  • JavaScript 基础知识 - 入门篇(一)
  • Java读取Properties文件的六种方法
  • Java教程_软件开发基础
  • js写一个简单的选项卡
  • Laravel 菜鸟晋级之路
  • Vue小说阅读器(仿追书神器)
  • 规范化安全开发 KOA 手脚架
  • 欢迎参加第二届中国游戏开发者大会
  • 基于游标的分页接口实现
  • 计算机常识 - 收藏集 - 掘金
  • 经典排序算法及其 Java 实现
  • 离散点最小(凸)包围边界查找
  • 双管齐下,VMware的容器新战略
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​flutter 代码混淆
  • ​Java基础复习笔记 第16章:网络编程
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (39)STM32——FLASH闪存
  • (第61天)多租户架构(CDB/PDB)
  • (推荐)叮当——中文语音对话机器人
  • (一)Neo4j下载安装以及初次使用
  • (转载)Linux 多线程条件变量同步
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ./configure,make,make install的作用
  • .gitignore文件—git忽略文件
  • .Net CF下精确的计时器
  • .net 调用海康SDK以及常见的坑解释
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET轻量级ORM组件Dapper葵花宝典
  • .sh 的运行
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网