stm32学习笔记——外部中断的使用
stm32学习笔记——外部中断的使用
基本概念
stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能再使用了。在此情况下,我们只能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0-EXTI4这5个外部中断有着自己单独的中断响应函数,EXIT5-EXIT9共用一个中断响应函数,EXIT10-EXIT15共用一个中断响应函数。
对于中断的控制,stm32有一个专用的管理机构:NVIC。对于NVIC的详细解释,可以参考《ARM Cortex-M3权威指南》,Joseph Yiu著,宋岩译,北京航空航天大学出版社出版,第8章NVIC与中断控制。中断的使能,挂起,优先级,活动等等都是NVIC在管理。
基本步骤
使用外部中断的基本步骤如下:
1、设置好相应的时钟;
2、IO口初始化
3、中断NVIC配置
4、将GPIO管脚与外部中断线连接
5、在选择的中断通道的响应函数中写中断服务程序
这里举个简单的例子,使用按键来触发中断,中断发生时,点亮一个led灯。
按键连接的GPIO为PA11,led连接的GPIO为PB5;
1、设置好相应的时钟
首先需要打开GPIOA和GPIOB的时钟,因为要使用中断,还需要打开AFIO时钟。详细代码如下:
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//GPIOA,GPIOBʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使用AFIO时钟 }
2、IO口初始化
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//配置PA11为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置PB5为输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOB5 }
3、中断NVIC配置
设置相应的中断实际上就是设置NVIC,在stm32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//选择中断通道11
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=;//响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
NVIC_Init(&NVIC_InitStructure);//完成初始化
}
4、将GPIO管脚与外部中断线连接
由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来,具体代码如下:
void EXIT_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
//清空中断标志
EXTI_ClearITPendingBit(EXTI_Line11);
//连接中断管脚PA11
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11); EXTI_InitStructure.EXTI_Line = EXTI_Line11;//选择中断线路11
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置中断触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
5、在选择的中断通道的响应函数中写中断服务程序
stm32不像C51单片机那样,可以通过interrupt关键字来定义中断响应函数,stm32的中断响应函数接口存在于中断向量表中,是由启动代码给出的。默认的中断响应函数在stm32f10x_it.c中。但也可以在自己建立的c文件中书写对应的中断响应函数,但要保证,其名称要和stm32f10x_it.c中的一致。我们使用的中断服务函数名称为:
void EXTI15_10_IRQHandler(void);我们的目标是将led灯点亮,所以函数体很简单:
void EXTI15_10_IRQHandler(void)
{
//点亮led灯,低电平有效
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//清空中断标志位,防止持续进入中断
EXTI_ClearITPendingBit(EXTI_Line11);
}
最后写主函数:
#include "stm32f10x_lib.h"
int main(void)
{
RCC_Config();
GPIO_Config();
NVIC_Config();
EXIT_Config();
while();
}
stm32学习笔记——外部中断的使用的更多相关文章
- STM32学习笔记-NVIC中断知识点
STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...
- STM32 学习笔记之中断应用概览--以f103为例
异常类型 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断.其中系统异常有8 个(如果把Reset 和HardFault 也算上的话就是10 个),外部中断有60个.除 ...
- STM32学习笔记——定时器中断(向原子哥学习)
定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32 EXTI(外部中断)
一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...
- STM32学习笔记——OLED屏
STM32学习笔记--OLED屏 OLED屏的特点: 1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2. 显示尺寸为0.96寸 3. 分辨率为128*64 4. ...
- STM32学习笔记——点亮LED
STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- STM32学习笔记(九) 外部中断,待机模式和事件唤醒
学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...
随机推荐
- 与Java Web Service相关的若干概念(JAX-WS,JAX-RS)
WS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP l JWS: 是指与webservice相关的J2EE(其实现在应该叫做Java EE吧)技术叫做 JWS(全称就是 jav ...
- Linux cscope命令
一.简介 Cscope 是一款开源免费的 C/C++浏览工具,自带一个基于文本的用户界面,通过cscope可以很方便地找到某个函数或变量的定义位置.被调用的位置等信息.Cscope对 C /C++支持 ...
- Matplotlib中文设置
1.中文设置方法,代码前加入语句 from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] 2.例子 # -*- codin ...
- URLDecoder与URLEncoder
网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a"-"z", ...
- Memcached在windows下的安装于使用
原文链接:http://blog.csdn.net/jjmaiz/article/details/7935672 有一点要注意的是,上文作者没有提及: 将php_memcached.dll放在ext文 ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
- Ioc注解
注解: 添加注解时,需要添加context的相关 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- ASP.NET MVC4 log4net
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection
客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证 1.SSL单向验证时 代码如下: import java.io.IOException; import java.util.Has ...
- linux挂载硬盘失败,报错!
剛把我的一顆硬碟 ( NTFS ) 接到 Ubuntu 桌機上. 然後要 mount 的時候,出現了下面的訊息: DBus error org.gtk.Private.RemoteVolumeMon ...