EXTI—外部中断/事件控制器
外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线。每个中断/事件线都对
应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对
每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
EXTI功能框图
EXTI 的功能框图包含了 EXTI 最核心内容,掌握了功能框图,对 EXTI 就有一个整体
的把握,在编程时就思路就非常清晰。 EXTI 功能框图见图 17-1。
在图 17-1 可以看到很多在信号线上打一个斜杠并标注“ 23”字样,这个表示在控制器
内部类似的信号线路有 23 个,这与 EXTI 总共有 23 个中断/事件线是吻合的。所以我们只
要明白其中一个的原理,那其他 22 个线路原理也就知道了。
EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件
上就有所不同。
产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功
能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且
是电路级别的信号传输,属于硬件级的。
另外, EXTI 是在 APB2 总线上的,在编程时候需要注意到这点。
EXTI 有 23 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至
EXTI15,还有另外七根用于特定的外设事件,见表 17-1。
七根特定外设中断/事件线由外设触发,具体用法参考《 STM32F4xx 中文参考手册》
中对外设的具体说明。
EXTI0 可以通过 SYSCFG 外部中断配置寄存器
1(SYSCFG_EXTICR1)的 EXTI0[3:0]位选择配置为 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、
PG0、 PH0 或者 PI0,
EXTI初始化结构体详解
标准库函数对每个外设都建立了一个初始化结构体,比如 EXTI_InitTypeDef,结构体
成员用于设置外设工作参数,并由外设初始化配置函数,比如 EXTI_Init()调用,这些设定
参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个
成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 stm32f4xx_exti.h 文件中,
初始化库函数定义在 stm32f4xx_exti.c 文件中,编程时我们可以结合这两个文件内注释使用。
下面说一下编程框架:
使用 GPIO 之前必须开启 GPIO 端口的时钟;用到 EXTI 必须开启 SYSCFG 时钟。
作为中断/时间输入线把 GPIO 配置为输入模式,这里不使用上拉或下拉,由外部电路
完全决定引脚的状态。
SYSCFG_EXTILineConfig 函数用来指定中断/事件线的输入源,它实际是设定
SYSCFG 外部中断配置寄存器的值,该函数接收两个参数,第一个参数指定 GPIO 端口源,
第二个参数为选择对应 GPIO 引脚源编号。
- int main(void)
- {
- /* LED 端口初始化 */
- LED_GPIO_Config();
- /* 初始化EXTI中断,按下按键会触发中断,
- * 触发中断会进入stm32f4xx_it.c文件中的函数
- * KEY1_IRQHandler和KEY2_IRQHandler,处理中断,反转LED灯。
- */
- EXTI_Key_Config();
- /* 等待中断,由于使用中断方式,CPU不用轮询按键 */
- while()
- {
- }
- }
主函数结构,先初始化硬件LED,用于按键中断控制的效果展示。
然后是 EXTI_Key_Config(); 需要留意一点的函数或者配置加以红色标注:
- /**
- * @brief 配置嵌套向量中断控制器NVIC
- * @param 无
- * @retval 无
- */
- static void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* 配置NVIC为优先级组1 */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- /* 配置中断源:按键1 */
- NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
- /* 配置抢占优先级:1 */
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
- /* 配置子优先级:1 */
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
- /* 使能中断通道 */
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- /* 配置中断源:按键2,其他使用上面相关配置 */
- NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
- NVIC_Init(&NVIC_InitStructure);
- }
- /**
- * @brief 配置 PA0 为线中断口,并设置中断优先级
- * @param 无
- * @retval 无
- */
- void EXTI_Key_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- /*开启按键GPIO口的时钟*/
- RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);
- /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
- /* 配置 NVIC */
- NVIC_Configuration();
- /* 选择按键1的引脚 */
- GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
- /* 设置引脚为输入模式 */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- /* 设置引脚不上拉也不下拉 */
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- /* 使用上面的结构体初始化按键 */
- GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
- /* 连接 EXTI 中断源 到key1引脚 */
- SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);
- /* 选择 EXTI 中断源 */
- EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
- /* 中断模式 */
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- /* 下降沿触发 */
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- /* 使能中断/事件线 */
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- /* 选择按键2的引脚 */
- GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
- /* 其他配置与上面相同 */
- GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);
- /* 连接 EXTI 中断源 到key2 引脚 */
- SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);
- /* 选择 EXTI 中断源 */
- EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- /* 上升沿触发 */
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- }
在stm32f4xx_it.c中编写中断服务函数,其中中断服务函数名要对应启动文件的中断向量表,为了可读性可以用宏给中断向量表取一个适合中断目的的名字。
还有一个需要注意的:需要使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟。
上面是固件库的函数定义内部,这个是固件库编程的套路,都是这样定义某个功能的结构体,然后初始化这个结果体,最后调用一个init函数完成。
固件库这样的套路明白之后,编写应用程序会轻松愉快地多。至于固件库内部到底是如何实现的,在达到高手水平了再去,毕竟做项目是以速度和质量说话的,固件库肯定快于寄存器版的,但是想自己写出库函数,又不得不去学习寄存器编程,所以都是相辅相成的,先学好固件库,然后学寄存器版,然后达到自己可以编写库,就达到学习目的了。
EXTI—外部中断/事件控制器的更多相关文章
- 第17章 EXTI—外部中断/事件控制器
第17章 EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列
第17章 EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- STM32之EXTI——外部中断
互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...
- STM32本学习笔记EXTI(外部中断)
参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...
- STM32学习笔记之EXTI(外部中断)
參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...
- STM32 EXTI(外部中断)
一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...
- STM32基本GPIO操作:按键输入(扫描+外部中断)
(涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...
- STM32F103ZET6外部中断
1.EXTI功能 外部中断/事件控制器EXTI管理了STM32的20个中断/事件线. EXTI的功能框图如下: 在功能框图中,可以看到很多在信号线上打了一个斜杠并标注“20”的字样,这是表示在STM3 ...
- (stm32f103学习总结)—stm32外部中断
一.外部中断介绍 1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器.EXTI的每根输入线都可单独进行配置,以 ...
随机推荐
- uva 10994 - Simple Addition(规律)
题目链接:uva 10994 - Simple Addition 题目大意:给出l和r,求∑(l≤i≤r)F(i), F(i)函数题目中有. 解题思路:由两边向中间缩进,然后l和r之间的数可以按照1~ ...
- 刚子扯谈:网站运营在左 技术在右 真TM扯
朋友的书 鄙人的书 2013年8月5日,雨未下,天猴焖 开片语:今天的扯谈内容是我转载我Java学习交流群里面一个哥们,当然我推荐他加入了朋友的网络分析师这个群,我认为那样对他有更大帮助.现在他是XX ...
- docker基本元素和底层实现
docker是轻量级的操作系统虚拟化解决方案 优点 1.基于操作系统层面 2.启动速度快(秒级) 3.资源利用率高 4.性能高.易管理 docker有3大基本要素 分别是 1.镜像:只读模板,用来创建 ...
- 服务器主机上RAID Card的Write Caching Policy
在Cisco Server的DRAC中, 创建virtual drive时, 会看到下面的选项. 那么Write back, write through, write back bad BBU之间 ...
- ViewPager Fragment PagerAdapter MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【SSH 基础】SSH框架--struts深入具体解释(一)
学习了struts,可是对于它的由来,以及为什么使用action和struts.xml的方式而不採用曾经的servlet方式.有些疑问,究竟之前的方式有什么弊端,struts又给我们带来了什么便利? ...
- 成都PHP开发project师薪资信息
这是成都的PHPproject开发师招聘.如图所见,最低的月薪是4K,最高的是35W,PHP开发工程师正处于炙手可热的发展趋势,还愁拿不到高薪,找不到工作的你,还犹豫什么,机会就在眼前,成都传智播客P ...
- token 机制
- Linux中基于hadoop安装hive(CentOS7+hadoop2.8.0+hive2.1.1)
http://blog.csdn.net/pucao_cug/article/details/71773665
- HTTP请求头 If-Modified-Since
来自:http://www.jm47.com/g/91174.htm 一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签. 最近在分析Squid的access.log日 ...