完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、STM32F4的外部中断
1. STM32F4的外部中断个数 STM32F4的每个IO都可以作为外部中断输入 但并不是所有IO的中断可以同时打开。STM32F4的的中断控制器只可同时支持**23个(0 ~ 22)**外部中断/事件请求: ① EXTI线 0 ~ 15:对应外部IO的输入中断(也是我们常用的外部中断接口) ② EXTI线 16 :连接到 PVD 输出。 ③ EXTI线 17 :连接到RTC闹钟事件 ④ EXTI线 18 :连接到 USB OTG FS 唤醒事件 ⑤ EXTI线 19 :连接到以太网唤醒事件 ⑥ EXTI线 20 :连接到 USB OTG HS(在FS中配置) 唤醒事件 ⑦ EXTI线 21 :连接到 RTC 入侵和时间戳事件 ⑧ EXTI线 22 :连接到RTC唤醒事件 以上23个外部中断,每个外部中断都对应着一根外部中断线,且每个外部中断线可以独立得配置触发方式(上升沿、下降沿或者边沿触发)、触发/屏蔽、专用的状态位。 2. STM32F4中供IO口使用的外部中断 从上述列表中可以看出,STM32F4可供IO口使用的外部中断线就只有EXTI线 0 ~ 15,共16根。但是STM32F4的IO口多达上百个( (ABCDEFG) 7 x 16 (0~15) ),如何把16根中断线与上百个IO口对应呢? 答案是,并非所有的IO口都能在程序中引发中断! 能在程序中引发中断的,只有事先被配置好的16个IO口。而且,也不是任选的16个IO口,而是IO数字号(0 ~ 15)必须不同的16的IO口,也就是涵盖了Px 0 ~ 15 的共16个IO口,其中,x可以相同,但 0 ~ 15必须各不相同!如 PA0、PA1、PA2、PB3、PB4、PC5、PC6、PC7、PC8、PD9、PD10、PD11、PD12、PD13、PD14、PE15 。 那么,如何实现EXTI线 0 ~ 15与对应IO口的配置呢? 答案是通过SYSCFG_EXTICR寄存器。如下图 : 上图中分别有 EXTI0、EXTI1、…、EXTI15 共16根外部IO中断线,每根中断线对应着各自不同的、固定的9个IO口,而一根中断线每次只能与一个IO口相连。以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.0,GPIOI.0。而中断线每次只能连接到 1 个 IO口上(如GPIOC.0)。这个操作需要在软件配置中实现。 3. STM32F4的中断服务函数 上图中讲过,STM32中共有16根外部IO中断线,那么是不是也有16个中断服务函数呢? 答案为否。STM32有16根外部IO中断线,但只有7个中断服务函数(或者说7个中断向量)。如下图所示: 即: EXTI0、EXTI1、EXTI2、EXTI3、EXTI4这前5根外部IO中断线分别有自己独立的中断函数;但EXTI5 ~ EXTI9共用一个中断函数;EXTI10 ~ EXTI15 共用一个中断函数。 二、STM32F4外部中断程序的编写 1. 外部中断常用库函数 在外部中断的程序中,常用的库函数如下所示: 基本的配置步骤如下: ① 使能外部中断的时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); ② 初始化IO口为输入: GPIO_Init(); ③ 设置IO口与中断线的映射关系,即配置我们在**一、2.**那张图中讲的映射关系: SYSCFG+EXTILineConfig(); ④ 初始化线上中断,设置触发条件等: EXTI_Init(); ⑤ 配置中断分组(NVIC),并使能中断 NVIC_PriorityGroupConfig //配置中断分组 NVIC_Init(); //使能中断 ⑥ 编写中断服务函数: EXTIx_IRQHandler(); ⑦ 清除中断标志位:(注:寄存器中的中断标志位不会自动清楚,必须在每次中断服务函数执行的末尾用如下函数进行手动清除。) EXTI_ClearITPendingBit(); 2. 按键中断程序编写 3. 补:中断和事件的区别 简单点就是中断一定要有中断服务函数,但是事件却没有对应的函数。 但是事件可以触发其他关联操作,比如触发DMA,触发ADC采样等。 可以在不需要CPU干预的情况下,执行这些操作。 中断则必须要CPU介入。 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 按下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。 一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。 外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。 明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的。之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等; 简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。 总结: 可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法; |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1553 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1497 浏览 1 评论
925 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
660 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1551 浏览 2 评论
1846浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
603浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
503浏览 3评论
504浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
486浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 03:30 , Processed in 1.906909 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号