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的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...
随机推荐
- Recon-Erlang线上系统诊断工具
Erlang系统素以稳定可靠闻名,但是它也是c实现的,也是要管理比如内存,锁等等复杂的事情,也会出现Crash,而且crash的时候大部分原因是因为内存问题.为此erlang运行期提供了强大的自省机制 ...
- HDU 1054 Strategic Game(最小点覆盖+树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...
- SQL localdb 连接字符串
http://blog.csdn.net/greystar/article/details/47699797 原来SQL 2012 下连接LOCALDB,字符串为: Data Source=(Loca ...
- html标签(一)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
这里不在详细介绍威佐夫博弈论 简单提一下 要先提出一个名词“奇异局势”,如果你面对奇异局势则必输 奇异局势前几项(0,0).(1,2).(3,5).(4,7).(6,10).(8,13).(9,15) ...
- Linux2.6内核实现的是NPTL
NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M ...
- WebService中方法的相关注意事项
2014-11-14 在WebService中定义方法,有一些注意的地方: (1) 方法上面需要增加 [WebMethod] 属性,标志该方法是一个WebService方法: (2)方法的返回值可以为 ...
- apache-ab并发负载压力测试(转)
ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力. ab命令对发出负载的计算机要求很低,既不会占用很 ...
- DataTable中如何去除重复的项
DataView dv =dataTable.DefaultView; DataTable dt = dv.ToTable(true, "Name");
- Socket网络编程(1)
TCP/IP 简单介绍 应用层 (Application):应用层是个很广泛的概念,有一些基本相同的系统级 TCP/IP 应用以及应用协议,也有许多的企业商业应用和互联网应用. 传输层 (Transp ...