博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[stm32] STM32 Interrupts and events 系统了解(EXTI)及槽型光电开关tp850电路研究
阅读量:5923 次
发布时间:2019-06-19

本文共 5519 字,大约阅读时间需要 18 分钟。

 

中断和事件


1 嵌套向量中断控制器

  特性:

● 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);

● 16个可编程的优先等级(使用了4位中断优先级);
● 低延迟的异常和中断处理;
● 电源管理控制;
● 系统控制寄存器的实现;

嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。

[正版请搜索:beautifulzzzz(看楼主博客园官方博客,享高质量生活)嘻嘻!!!]

 

1.1 系统嘀嗒(SysTick)校准值寄存器

  系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。

 

2 外部中断/事件控制器(EXTI)

  对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。


2.1 主要特性

  EXTI控制器的主要特性如下:

● 每个中断/事件都有独立的触发和屏蔽

● 每个中断线都有专用的状态位
● 支持多达20个软件的中断/事件请求
● 检测脉冲宽度低于APB2时钟宽度的外部信号。

2.2 框图

                  图1 外部中断/事件控制器框图

 

2.3 唤醒事件管理

  STM32F10xxx可以处理外部或内部事件来唤醒内核(WFE)。唤醒事件可以通过下述配置产生:

● 在外设的控制寄存器使能一个中断,但不在NVIC中使能,同时在Cortex-M3的系统控制寄存器中使能SEVONPEND位。当CPU从WFE恢复后,需要清除相应外设的中断挂起位和外设NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)。

● 配置一个外部或内部EXTI线为事件模式,当CPU从WFE恢复后,因为对应事件线的挂起位没有被置位,不必清除相应外设的中断挂起位或NVIC中断通道挂起位。

在互联型产品中,以太网唤醒事件同样具有WFE唤醒功能。

 

2.4 功能说明

  要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

  如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
  通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。

 

2.4.1 硬件中断选择(外部中断配置)

  通过下面的过程来配置20个线路做为中断源:

● 配置20个中断线的屏蔽位(EXTI_IMR)

● 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
● 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

 

2.4.2 硬件事件选择

  通过下面的过程,可以配置20个线路为事件源:

● 配置20个事件线的屏蔽位(EXTI_EMR)

● 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)

 

2.4.3 软件中断/事件的选择

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

● 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)

● 设置软件中断寄存器的请求位(EXTI_SWIER)

 

2.5 外部中断/事件线路映像

通用I/O端口以下图的方式连接到16个外部中断/事件线上:

          图2 外部中断通用I/O映像

通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。

另外四个EXTI线的连接方式如下:
● EXTI线16连接到PVD输出
● EXTI线17连接到RTC闹钟事件
● EXTI线18连接到USB唤醒事件
● EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

 

3 EXTI 寄存器描述及固件库

中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)
上升沿触发选择寄存器(EXTI_RTSR)
下降沿触发选择寄存器(EXTI_FTSR)
软件中断事件寄存器(EXTI_SWIER)
挂起寄存器(EXTI_PR)

                    图3 EXIT固件库函数

4 外部中断例子

>_<" 主函数为:

1 /******************************************************************************* 2 * Function Name  : main 3 * Description     : 主函数 4 *******************************************************************************/ 5 int main(void) 6 { 7     RCC_Configuration(); 8     NVIC_Configuration(); 9     GPIO_Configuration();10     EXTI13_Configuration();11 12     while(1)13     {}14 }

>_<" RCC函数:(配置系统时钟并且使能PA和AFIO)

1 /****************************************************************************2 * 名    称:void RCC_Configuration(void)3 * 功    能:系统时钟配置为72MHZ4 ****************************************************************************/ 5 void RCC_Configuration(void)6 {   7     SystemInit();8     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);9 }

>_<" GPIO配置函数:(这里的A13作为终端的外部引脚)

1 /******************************************************************************* 2 * Function Name  : GPIO_Configuration 3 * Description    : GPIO配置. 4 *******************************************************************************/ 5 void GPIO_Configuration(void) 6 { 7     GPIO_InitTypeDef GPIO_InitStructure; 8  9     /*外部中断线PA13*/10     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  11     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  12     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;13     GPIO_Init(GPIOA, &GPIO_InitStructure);  14 }

>_<" 配置EXTI(特别注意第9行是将将GPIO管脚与外部中断线连接,下面是设置触发方式等)

1 /******************************************************************************* 2 * Function Name  : EXTI13_Configuration 3 * Description    : 配置外部中断 4 *******************************************************************************/ 5 void EXTI13_Configuration(void) 6 { 7     EXTI_InitTypeDef EXTI_InitStructure;  8      9     GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);  10     EXTI_InitStructure.EXTI_Line = EXTI_Line13;11     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;12     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//下降沿和上升沿13     EXTI_InitStructure.EXTI_LineCmd = ENABLE;14     EXTI_Init(&EXTI_InitStructure);15     16     EXTI_ClearITPendingBit(EXTI_Line13);17 }

>_<" 配置NVIC

1 /******************************************************************************* 2 * Function Name  : NVIC_Configuration 3 * Description    : 配置 Vector Table base location. 4 *******************************************************************************/ 5 void NVIC_Configuration(void) 6 {  7     NVIC_InitTypeDef NVIC_InitStructure; 8      9     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//PPP外部中断线10     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;11     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;12     NVIC_Init(&NVIC_InitStructure);13 }

>_<" 这样每次外部事件触发中断时就会响应其对应的中断服务子程序

1 /*******************************************************************************2 * Function Name  : EXTI15_10_IRQHandler3 * Description    : This function handles External lines 15 to 10 interrupt request.4 *******************************************************************************/5 void EXTI15_10_IRQHandler(void)6 {7     EXTI_ClearFlag(EXTI_Line13);8 }

PS: 发现一个类似的例子

5 PLUS槽型光电开关研究(tp850)

  之所以研究EXXTI是因为要做一个槽型光电开关来对步进电机进行精确限位。但是该元件的说明书并不能找到,所以忙活了一上午找相关的电路和使用方式......

  

  可是找了很多,发现都比较类似:(从下面右图可以看出该模块的CE之间是一个感光的三极管,可以分别采用从发射机和集电极引出OUT来设计)

       

   于是照着上面的电路从C引出的方式设计,左边的电阻采用200欧姆,右边的电阻采用10千欧,可是将OUT连到单片机上并不能产生中断事件。我又直接将中断引脚在VCC上短暂的碰触可以检测到中断,于是断定OUT输出电压太小不能引起中断。

  最终在神奇的某宝上终于找到了答案:(此链接非广告,而是便于大家直接找到类似的东西~:槽型光电模块)原来在OUT后还有个LM393!!!它是双电压比较器集成电路。

  

 

 

链接

EXTI的工程链接:

stm32资料:

 

转载地址:http://gkivx.baihongyu.com/

你可能感兴趣的文章
Linux netstat命令详解
查看>>
quartz + spring 配置示例
查看>>
C++基础之全局变量
查看>>
父子组件间的通信
查看>>
JMX超详细解读<转>
查看>>
iOS CoreData 介绍和使用(以及一些注意事项)
查看>>
ASP.NET Web API之消息[拦截]处理(转)
查看>>
Ubuntu系统下为IDEA创建启动图标
查看>>
矩表 - 现代数据分析中必不可少的报表工具
查看>>
gradle的安装,配置,构建,研究,初体验......(入职一周研究的第一个大知识点)...
查看>>
Android 开发常用版本控制命令
查看>>
spark rdd median 中位数求解
查看>>
(2)Java数据结构--二叉树 -和排序算法实现
查看>>
ubuntu里面设置颜色
查看>>
Debug目录、Release目录,bin目录、obj目录,vshost.exe.config文件、.exe.config文件分析【C#】...
查看>>
定时器0方式2 方式3
查看>>
使用正則表達式对URL进行解析
查看>>
mycat 连续分片 -&gt; 按日期(天)分片
查看>>
opencv批处理提取图像的特征
查看>>
iOS项目开发实战——使用同步请求获取网页源码
查看>>