STM32 外部中断使用方法总结

发布者:SparklingStar22最新更新时间:2018-06-15 来源: eefocus关键字:STM32  外部中断  使用方法 手机看文章 扫描二维码
随时随地手机看文章

STM32 中断分为外部中断,定时器中断、串口中断。虽然名字不同,但是原理都是相同的,这一节我们将主要介绍一下外部中断以及中断函数的编写。


按照如下步骤去编写函数和配置函数即可完成对外部中断函数的配置。


第一步:配置GPIO,设置为中断模式。


第二部:配置中断函数


            1、使能IO口复用功能,选择带有中断的引脚。


            2、设置外部中断结构体成员。


            3、设置中断优先级。


            4、配置中断服务函数。


例子:按键触发的中断函数



//GPIO 初始化  

void Init_LED(void)  

{  

GPIO_InitTypeDef GPIO_InitStructure;    //定义一个GPIO结构体变量  

  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE);  

//使能各个端口时钟,  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_13;  //板上LED编号 D2、D5  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

[html] view plain copy

GPIO_Init(GPIOG, &GPIO_InitStructure);  

[html] view plain copy

GPIO_Init(GPIOD, &GPIO_InitStructure);  

}  



中断函数编写  


void Init_EXTIX_TI(void)  

{  

  

EXTI_InitTypeDef EXTI_InitStructure;    //定义一个EXTI结构体变量  

NVIC_InitTypeDef NVIC_InitStructure;  

  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!!  

  

/* 引脚选择 */  

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引脚为中断源    重要!! 板上标号INT2  

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引脚为中断源 重要!! 板上标号INT1  

  

  

/* 设置外部中断结构体的成员*/  

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式  

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发  

EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;   //使能中断线  

EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2  

  

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;    //设定中断源为PC13  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //中断占优先级为2  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //副优先级为0  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断  

NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器  

  

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;    //设定中断源为PE0  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   //中断占优先级为1  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //副优先级为0  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断  

NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器  

  

}  

最后为配置中断服务函数(入口函数、中断处理函数)


最后一步了,也是很重要的一步,配置中断服务函数,也有叫什么入口函数的。说白了,就是你想让你的这个中断做什么。



/*************************************************************

注意,中断服务程序虽然简单,但是在写入口函数的时候,注意函数名的写法,只有如下3种命名方式。

(1)EXTI0_IRQHandler;EXTI Line 0

EXTI1_IRQHandler;EXTI Line 1

EXTI2_IRQHandler;EXTI Line 2

EXTI3_IRQHandler;EXTI Line 3

EXTI4_IRQHandler;EXTI Line 4

(2)

EXTI9_5_IRQHandler;EXTI Line 5-9

(3)

EXTI15_10_IRQHandler;EXTI Line 10-15


只要是中断线5后的就不能像前四个那样命名,他们有自己的方式。

************************************************************/


void EXTI15_10_IRQHandler(void) //pc13中断服务程序,也是中断子函数  

{  

//检测按键之前一般有个消抖延时,直接调用下面的延时函数即可  

  

if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判断是否发生中断,发生则中断标志置1  

{  

//  LED1=0;  

  

//  LED2=1;  

  

GPIO_ResetBits(GPIOG, GPIO_Pin_14); //GPIOG设置为低电平,  

GPIO_SetBits(GPIOD, GPIO_Pin_13); //GPIOD设置为高电平,其实这一部分也是可以写在主函数中的,在while那个死循环中。  

  

}  

  

EXTI_ClearITPendingBit(EXTI_Line13);    //利用库函数清除中断标志位,进入中断服务程序之后。首先就是清除标志位,      

} //否则他会不响应中断,不进入中断函数  

这就是整个完整的外部中断处理函数,直接照葫芦画瓢就行。


关键字:STM32  外部中断  使用方法 引用地址:STM32 外部中断使用方法总结

上一篇:STM32按键中断学习记录
下一篇:STM32外部中断映射

推荐阅读最新更新时间:2024-03-16 16:05

AD8361—0.1~2.5GHz真功率有效值响应器件及其使用方法
    摘要: AD8361是ADI公司最表推出的一种射频(RF)真功率检测集成电路,综是一个在单片IC上实现用有效值度量RF功率的器件。介绍了它的检测原理及使用方法。     关键词: 有效值 射频 CDMA 正交幅度调制 凡是检测一个信号的真功率有效值(RMS)都要雪结到检测该信号的电压有效值上来。而检测电压有效值的传统方法是通过二极管平方律检波电路或热电耦合热装置来完成的。这两种方法各自都有较多的缺点,很难做到精确测量,而且线性和温度稳定性都不高,尤其在检测小功率射频信号时更是如如。二极管平方律特性范围很窄,信号过小或过大时检测性能都很差,造成较大测量误差;热电耦发热装置工艺复杂,器件脆弱,信号过大极易
[测试测量]
STM32 MDK 工程创建 图解步骤 自我学习总结
好久没有使用MDK编写STM32的程序了,现在上手才发现自己都不太记得创建步骤了,于是再次翻阅书籍,一步一步记录一下-----参考了野火的例子! ---第一步---创建一个文件夹---在文件夹下建立如下文件夹--- ---1-1---其中CMSIS是用来存放库文件为我们自带的启动文件和一些CMSIS层文件。 ----1-1-1-----上面说的启动文件在startup文件夹中,其中包含了各种STM32芯片的启动文件,主要是按照flash大小来分的,后面工程设置再介绍。 ---1-2---其中FWlib是用来存放STM32库中inc与src两个文件夹---这两个文件夹不需要修改----inc中是所有驱动文件的头文件---
[单片机]
<font color='red'>STM32</font> MDK 工程创建 图解步骤 自我学习总结
STM32普通定时器(TIM2-7)的时钟源疑问
【问题】 STM32F103的APB1最大总线时钟是AHB总线时钟的1/2,最大为36MHz,在用ST的库函数(v2.0)的时候,TIM2(普通定时器)的时钟频率为72MHz,不知道原因何在? 【问题分析】 STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这
[单片机]
<font color='red'>STM32</font>普通定时器(TIM2-7)的时钟源疑问
关于STM32串口通信使用printf发送数据的配置方法
开发环境: Keil RVMDK 在 STM32 串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含 stdio.h (标准输入输出头文件)。 2、在main文件中重定义 fputc 函数。如下: // 发送数据 int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char)
[单片机]
关于<font color='red'>STM32</font>串口通信使用printf发送数据的配置方法
利用RTSI总线实现运动控制和数据采集之间的同步
   摘要: 为了提高测量精度,许多测试系统要求在连续运动中实时同步进行数据采集。根据同步工作原理,利用RTSI总线技术和LabWindows/CVl编程实现了运动控制和数据采集之间的同步,实验结果表明该方法在提高测试精度方面是有效的。    关键词: 同步;RTSI总线;运动控制;数据采集    1 引言   许多测试系统要求在连续运动的同时能实时进行数据采集。如果测试过程不连续,或者测试位置在前而采集在后,二者之间不能同步,将不可避免地产生误差。为了提高测量精度,运动控制和数据采集必须实现同步。目前,美国NI公司提供的PCI总线E系列数据采集卡和运动控制卡都嵌入了RTSI(Real-Time System Integra
[应用]
从滴答时钟了解STM32库操作
STM32的库函数操作给设计开发人员带来了诸多的便利,开发人员不必十分了解STM32的内部寄存器及硬件机制,只要有C语言基础,即可完成单片机的开发,缩短了开发周期,降低了开发难度,因而备受工程师喜爱。 基于库函数的开发模式,与基于API(Application Programming Interface)的软件开发有着异曲同工之处,程序员通过调用 API 函数对应用程序进行开发,而又无需访问源码,或理解内部工作机制的细节,可以减轻编程任务。STM32的基于函数库的开发模式也是一样的道理,因此对于有单片机开发经验的工程师来说,学习STM32,很容易就可以上手。 虽然可以不考虑库函数内部的细节,不考虑如何实现硬件寄存器的配置,但是
[单片机]
基于嵌入式STM32的智能手表设计实现
一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目,使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换,搭配DHT11,RTC,LED,KEY等器件实现高度智能化一体化操作。 后期自己打板设计结构,可以衍生为智能手表等小玩意。目前,项目属于裸机状态(CPU占用率100%),后期可能会加上RTOS系统。 二、硬件实物图 温度计: 游戏机: 三、硬件引脚图 OLED模块: VCC -- 3.3V GND -- GND SCL -- PB10
[单片机]
基于嵌入式<font color='red'>STM32</font>的智能手表设计实现
stm32 ssD1306 OLED驱动架构
#include oled.h #include stdlib.h #include oledfont.h #include delay.h //OLED的显存 //存放格式如下. // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 // 0 1 2 3 ... 127 u8 OLED_GRAM ; //更新显存到LCD void OLED_Re
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved