STM32F103外部中断编程

STM32F103外部中断编程

    中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活。

单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的程序。今天就来试试如何让单片机中断当前任务,执行其他任务。

先看看我的实验板上做外部中断要用的资源:


        如上图,板子的下面有三个独立按键,右下边有三个贴片的LED,其中这两部分的电路图如下图所示:

1、独立按键电路:


由上图可知,三个独立按键分别接在STM32的PB7、PB8、PB9引脚上。

2、LED电路:
由上图可知,三个LED分别接在STM32的PC1,、PC3、PC13引脚上,

我们规划是当按下按键K2的时候,就让灯D2闪烁一会儿。这时候K2就是外部中断,当按下后,触发中断服务函数,灯D2闪烁的程序就是中断服务函数。

现在打开Keil V5进行编程:

先在Manage Run-time Environment界面勾选以下选项:

勾选完成后,就开始进行编程:

1、中断初始化函数的编写:

void Exit_Configuration(void)

{

/*

*定义结构体

*/

EXTI_InitTypeDef  EXTI_InitStructure;

GPIO_InitTypeDef  GPIO_InitStructure;

NVIC_InitTypeDef  NVIC_InitStructure;

/*

*时钟配置(要打开AFIO时钟)

*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

/*

*外部中断使用的GPIO的配置使用PB口的9引脚

*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOB, &GPIO_InitStructure);

/*

*外部中断使用的GPIO引脚也就是PB口的9引脚连接到EXTILine9

*/

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);

/*

*配置外部中断

*/

EXTI_InitStructure.EXTI_Line    =EXTI_Line9;

EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

/*

*配置NVIC

*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

2、中断初始化函数写好了之后,就要编写中断服务函数了:

void EXTI9_5_IRQHandler(void)

{

u16 aa=10;

if(EXTI_GetITStatus(EXTI_Line9)!=RESET){

//初始化灯所在的GPIO

GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//通过循环让灯闪烁

while (aa){

GPIO_SetBits(GPIOC,GPIO_Pin_3);

delay_us(100000);

GPIO_ResetBits(GPIOC,GPIO_Pin_3);

delay_us(100000);

aa--;

}

//清除中断标志

EXTI_ClearITPendingBit(EXTI_Line9);

//使灯的状态为灭

GPIO_SetBits(GPIOC,GPIO_Pin_3);

}

}

3、当然延时函数的实现使用的是系统滴答定时器,函数实现如下:

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

* 函 数 名         : delay_us

* 函数功能 : 延时函数,延时us

* 输    入         : i

* 输    出         : 无

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

void delay_us(u32 i)

{

u32 temp;

SysTick->LOAD=9*i; //设置重装数值, 72MHZ时

SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源

SysTick->VAL=0;   //清零计数器

do

{

temp=SysTick->CTRL;   //读取当前倒计数值

}

while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达

SysTick->CTRL=0; //关闭计数器

SysTick->VAL=0; //清空计数器

}

4、以上都完成后我们就可以编写main函数了,main函数非常简单,只要初始化外部中断,然后就可以空循环等待中断。当然在正常项目中主程序一般不会空循环。main函数如下;

int main(){

Exit_Configuration();

while(1)

{

;

}

}

当程序编写完成之后我们下载到板子上进行试验,按下按键Key2,发现灯并没有像我们想象的那样闪烁,为什么呢?回头查看程序:

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;这句的意思在官方库函数文档中的解释是:


也就是说可以设置中断为上升沿中断还是下降沿中断还是上升沿和下降沿都产生中断。回头看看我们的硬件电路:


PB9通过一个按键接地,也就是当按键按下去之后,PB9的输入电平为低电平,而原本我们程序中初始化GPIO的语句如下:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO的模式配置是浮空输入,这时候没有信号输入的时候相当于是低电平,而我们再按下按键的时候,仍然是低电平,所以并没有产生上升沿或者下降沿,这样的话我们就需要对电路进行修改,怎么修改呢,在PB9上连接一个大的电阻连接到VCC,这样当按键没有按下去的时候,PB9输入高电平,当按键按下去之后,PB9输入低电平,相当于触发了外部中断。这个我们添加的电阻,就是上拉电阻,在我之前的电子元器件的使用之电阻的使用中有讲解。

通过以上的操作就可以看到,当你按下按键之后,灯如你所愿的闪烁起来了。这就是STM32的外部中断使用过程。

总结:

要使用STM32的外部中断,需要以下几个步骤:

1、使用RCC_APB2PeriphClockCmd()函数配置时钟

2、使用GPIO_EXTILineConfig()函数连接中断产生的引脚

3、使用EXTI_Init(  )函数配置外部中断

4、使用NVIC_Init()配置中断优先级等

5、编写中断服务函数EXTI9_5_IRQHandler()

其中大家可能会疑惑,中断服务函数的名字中的9_5是什么意思呢?

PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,其中[9...5]共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、[15...10]共用EXTI15_10_IRQn和EXTI15_10_IRQHandler,这样的话不管我们用PA9还是PB9,都是用EXTI9_5_IRQHandler这个函数。


从上面这张图可以看出上面讲的是什么意思了

而EXTI9_5_IRQn用在什么地方呢?大家返回去看配置NVIC的程序:

        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

 如果觉得有用,请关注微信公众号:


 

 

时间: 2024-12-29 07:15:33

STM32F103外部中断编程的相关文章

stm32中断优先级管理与外部中断编程

stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 原文地址:https://www.cnblogs.com/-wenli/p/10633445.html

嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)

这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下面原则: 从需求的角度去理解嵌入式各种软件和硬件模块的作用和组成.并从芯片系统设计的角度去阐述怎样进行控制编程. 前者对于理解复杂的系统(如linux的各个子系统)是非常有效的:后者所讲的是代表一个芯片设计project师的视觉,芯片模块由他负责设计,他对于该模块的控制编程自然是最有发言权的. 笔者

STM32外部中断

0.STM32F103上测试 #include <stm32f10x.h> void GPIO_Config(void); void NVIC_Config(void); void EXTI_Config(void); int main(void) { GPIO_Config(); NVIC_Config(); EXTI_Config(); while(1): } void GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体,本类型在stm32f1

STM32F4——NVIC中断优先级及外部中断

NVIC中断优先级 一.简介: CM4内核可以支持256个中断,包括16个内核中断和240个外部中断,256级的可编程中断设置.对于STM32F4没有用到CM4内核的所有东西,只是用到了一部分,对于STM32F40和41系列共有92个中断,其中有10个内核中断和82个可屏蔽中断,常用的为82个可屏蔽中断. 二.相关寄存器: ISER[8]-中断使能寄存器组,用来使能中断,每一位控制一个中断,由于上面已经说明了控制82个可屏蔽的中断,因此利用ISER[0~2]这三个32位寄存器就够了.一下的几个寄

6.6410和210的按键中断编程

6.6410和210的按键中断编程 首先是打开6410底板原理图: 可以看到OK6410有六个按键: 可以看到OK6410的六个按键对应的引脚是KEYINT1.KEYINT2.KEYINT3.KEYINT4.KEYINT5和KEYINT6.接着在核心板的原理图里搜索这个词: 可以看到按键中断与GPN系列寄存器的引脚是互用的,接着就是在芯片手册里查看有关GPN系列寄存器的信息,重点是关注GPN控制寄存器:GPNCON: 这里我们使用到的按键对应的中断,需要配置成中断的方式,对应的GPN位设置为10

STM32F104VG (一)中断与外部中断

一.基础知识 1.ARM的中断优先级分硬件优先级和软件优先级两种 其中软件优先级又由抢占优先级和响应优先级组成 2.中断的优先级采用编号小优先的原则. 3.一般情况: 1).如果设定了软件优先级,先看软件优先级: 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断. 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之

单片微机原理P2:80C51外部中断与定时器系统

0. 外部中断 书上的废话当然是很多的了,对于中断我想大家应该早就有一个很直观的认识,就是"设置断点,执行外部外码,然后返回断点"这样的三个过程.中断给系统提供了一个良好的响应模式.当然了,响应中断的时候记得保护现场,这是写汇编的良好习惯. 80C51一共是5个中断源,这五个中断源分别是外部中断0,1定时器中断0,1,串口中断. 1. 我们现在先来看外部中断: 一般开外部中断分为4个步骤(不用查询的方式的话): 1. 设置触发方式(IT0/IT1) 2. 开启外部中断(EX0/EX1)

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件:中断系统使得内核具备了应对突发事件的能力. 在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行. 这种程序在执行过程中由于外界的原因而被中间打断的

外部中断实验

实验4 外部中断实验 一.实验目的 理解中断的基本概念. 掌握STM32的中断源及中断优先级. 掌握STM32外部中断技术的基本使用方法. 掌握STM32中断处理程序的编程方法. 二.实验内容 硬件设计原理图如下图1所示:LED的连接在上一节已经介绍过了,在STM32开发板上的按键KEY0是接在PE4上,KEY1是接在PE3上的,KEY2是连在PE2上,WK_UP接在PA0上. 三.实验预备知识 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部