博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(二)stm32之中断配置
阅读量:4650 次
发布时间:2019-06-09

本文共 2861 字,大约阅读时间需要 9 分钟。

一、stm32的中断和异常

  Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表。而stm32对这个表重新进行了编排,把编号从-3~6定义为系统异常,编号为负的内核异常不能设置优先级,从编号为7为外部中断,这些中断的优先级可自行进行设置。我们一般在starup_stm32f10x_hd.s中查找中断向量,而且在编写中断函数时也要在这个文件里查找中断服务函数的函数名。如下图所示:

二、NVIC中断控制器

1、stm32提供了强大的中断控制器NVIC,NVIC属于Cortex内核器件,不可屏蔽中断(NMI)和外部中断都由它来管理,而SYSTICK不由它管理。

    在misc.h文件中我们对NVIC进行了结构体定义,我们找到NVIC_InitTypeDef结构体就可进行定义,结构体中包含四个成员,分别是:

  NVIC_IRQChannel :需要配置的中断向量,比如EXTI0_IRQn,不同的中断向量我们在stm32f10x.h这个文件中可以找到。

  NVIC_IRQChannelPreemptionPriority :配置相应中断向量抢占优先级。

  NVIC_IRQChannelSubPriority :配置相应中断响应优先级。

  NVIC_IRQChannelCmd :使能或关闭响应中断向量中断。

2、对于中端配置主要的内容是配置中断优先级,stm32有两种中断优先级,我们该怎么配置呢?

  中断向量有两个属性,抢占式优先级和响应式优先级,编号越小,优先级越高。当两个中断抢占式优先级相同,则响应式中断优先级高的先执行。

3、NVIC中断优先级组

  NVIC只可以配置16种中断优先级,也就是说抢占式优先级和响应式优先级由四位数字来决定,总共可以有5种配置方式,在misc.h文件中我们可以看:

  

  stm32的所有GPIO口都可以配置为EXTI外部中断模式,来捕捉信号,可以上升沿检测,下降沿,上升沿下降沿检测。PA0~PG0连接到EXTI0,PA1~PG1连接到EXTI1,PA2~PG2连接到EXTI2等

三、中断程序编写

  我们需要自己建一个.c和.h文件来写中断配置这一块的代码。配置NVIC和中断函数如下所示:

static void NVIC_Configuration(void){  NVIC_InitTypeDef NVIC_InitStructure;            //NVIC_InitTypeDef这个结构体我们在misc.h文件中可以找到  /* Configure one bit for preemption priority */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        //配置为第2种中端配置方式,即1bits配置抢占式,3bits配置响应式,这个函数在misc.c文件中,组别在misc.h文件中  /* 配置中断源 */  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //外部中断0用这种表示方法,中断0~4表示方法都类似,中断5~9表示方式统一为EXTI9_5IRQn,中断10~15统一为EXTI15_10IRQn  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式优先级0  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     //响应式优先级0  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能中断  NVIC_Init(&NVIC_InitStructure);}
void EXTI_PA0_Config(void){	GPIO_InitTypeDef GPIO_InitStructure; 	EXTI_InitTypeDef EXTI_InitStructure;          //这个结构体在stm32f10x_exti.h中有定义	/* config the extiline clock and AFIO clock */	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);										/* config the NVIC */	NVIC_Configuration();	/* EXTI line gpio config*/	      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	         // 上拉输入      GPIO_Init(GPIOA, &GPIO_InitStructure);	/* EXTI line mode config */      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);       EXTI_InitStructure.EXTI_Line = EXTI_Line0;          //外部中断0,其他的以此类推      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //配置为中断模式      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断      EXTI_InitStructure.EXTI_LineCmd = ENABLE;      EXTI_Init(&EXTI_InitStructure);}  

中断配置完了以后就要真正写代码了,我们的中断处理函数都写在stm32f10x_it.c文件中,示例代码如下:

void EXTI0_IRQHandler(void){	if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确保是否产生了EXTI Line中断	{		// LED1 取反				LED1_TOGGLE;		EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位	}  }

  

转载于:https://www.cnblogs.com/zhangshenghui/p/5333034.html

你可能感兴趣的文章
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>