一、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和中断函数如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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文件中,示例代码如下:

1
2
3
4
5
6
7
8
9
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确保是否产生了EXTI Line中断
    {
        // LED1 取反     
        LED1_TOGGLE;
        EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
    
}

  

 

stm32之中断配置的更多相关文章

  1. (二)stm32之中断配置

    一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...

  2. STM32的外部中断配置及使用

    STM32的外部中断配置及使用 配置1:GPIO: 配置外部中断为输入模式: 配置2:EXTI: 配置外部中断线和触发模式: 配置3:NVIC: 配置外部中断源和中断优先级: 需要注意的是:RCC_A ...

  3. STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...

  4. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  5. stm32之中断系统

    概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...

  6. STM32的中断系统

    STM32的中断系统 STM32具有十分强大的中断系统,将中断分为了两个类型:内核异常和外部中断.并将所有中断通过一个表编排起来,下面是stm32中断向量表的部分内容: 上图-3到6这个区域被标黑了, ...

  7. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  8. stm32 外部中断学习

    今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...

  9. 001_FreeRTOS中断配置

    (一)优先级看:022_STM32中断优先级分组解析 (二)FreeRTOS的中断配置中没有处理亚优先级(响应优先级)的情况,所以只能配置成组4,16个都为抢占优先级 (三)此宏用来设置 MCU 使用 ...

随机推荐

  1. 东芝L10安装Centos5.5

    为什么安装5.5:因为高版本的需要PAE设定但是老电脑不支持,偶又不想重新编译内核,so... 1.  安装之前需要把电脑格式化(我是整机安装Linux),否则会报not enough space l ...

  2. Firefox下载附件乱码的解决办法

    通过在http的header里设置fileName下载附件时,中文文件名通过chrome浏览器下载时正常,通过firefox下载时为乱码: 原来的Java代码: response.addHeader( ...

  3. python(pygame)滑稽大战(类似飞机大战) 教程

    成品已录制视频投稿B站(本文目前实现了基础的游戏功能),点击观看项目稽忽悠不(github)地址:https://github.com/BigShuang/From-simple-to-Huaji 本 ...

  4. centos6.5卸载及安装git

    一.卸载原有的git 用whereis git命令来检查是否已经安装了git版本的 再使用命令:yum remove git卸载git 二.安装git (一)官网下载:https://mirrors. ...

  5. Docker 部署应用过程记录

    Kibana直接部署到centos中,老是没有任何征兆退出,今天将他移动到docker中部署,以下是部署的过程,做个记录防止忘记 1.安装Docker # yum install docker 2.启 ...

  6. Request对象和Response对象 JsonResponse对象 和 Django shortcut functions 和QueryDict对象

    request request属性 属性: django将请求报文中的请求行.头部信息.内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外,其他均为只读的. ''' 0.Http ...

  7. struts1和struts2和springMVC的区别和介绍

    MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...

  8. SVM问题汇总

    1.为什么要选择最大间隔分类器,请从数学角度上说明? 答:几何间隔与样本的误分次数间存在关系: 其中的分母就是样本到分类间隔距离,分子中的R是所有样本中的最长向量值 2.样本失衡会对SVM的结果产生影 ...

  9. 前端工程化基础-vue

    由浅入深支持更多功能 1.安装最新版本的node.js和NPM,并了解NPM基本用法. 2.创建一个目录demo.使用npm 初始化配置: npm init  ,执行后会有一系列选项,可按回车快速确认 ...

  10. QTP自动化测试

    原文链接:https://www.cnblogs.com/xiezhidong/p/6784684.html ♣Qtp是什么? ♣测试用例网站    ♦注册与登录    ♦测试脚本       ◊录制 ...