一、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. 2018-2019-2 网络对抗技术 20165326 Exp3 免杀原理与实践

    免杀原理与实践 目录 知识点问答 实践内容 遇到的问题 心得体会 知识点 meterpreter免杀 基础问题回答 杀软是如何检测出恶意代码的? 特征码(基于签名):模式匹配,比对特征码库 启发式:通 ...

  2. 通过SSH去连接 github 和bitbucket

    github 和 bitbucket 都是项目托管服务器, 1 创建SSH private key and public key 首先需要安装git命令, 并且请检查是否有ssh 命令. 打开 Git ...

  3. php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值

    /* * 把每个数组值后面都加个SQL然后返回数组 * foreach循环时候,直接用引用(&)的方式就能改变之前的数组 */public function array_foreach(){ ...

  4. TSMBIOS

    TSMBIOS Object Pascal language (Delphi or Free Pascal). https://github.com/RRUZ/tsmbios

  5. FreeCAD_DWG文件格式支持

    FreeCAD 是一款开源的三维模型制作软件,体积小.功能强大,可结合软件包划分网格进行有限元分析,上手速度极快.但也存在问题,即软件自身不支持DWG文件格式.本文介绍 FreeCAD 支持 DWG格 ...

  6. github仓库主页介绍、用git管理本地仓库和github仓库、搭建网站

    github仓库主页介绍 名词解释: 工作区: 添加.编辑.修改文件等动作 暂存区: 暂存已经修改的文件,最后统一提交到git中 git(仓库): 最终确定的文件保存到仓库,成为一个新的版本,并且对他 ...

  7. hashlib模块(加密模块)

    hash = hashlib.md5(b"str") #md5对象,md5不能反解,可加参数 hash.update(b"str") #对字符串进行加密 has ...

  8. Ubuntu和Linux的区别

    大家听别人介绍自己的Ubuntu时,会听到“我的操作系统是Linux的”.其实,这样介绍是缺乏严谨性滴.我们只要知道两点,基本上就搞清楚Linux和Ubuntu的关系:    1. 严格来说,Linu ...

  9. 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet

    虚拟货币钱包 钱包顾名思义是存放$$$.但在虚拟货币世界有点不一样,我的帐户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是我的帐户对应的 key.有了这把 key 我就可以在虚拟货币世界证 ...

  10. Tecplot: 多截面云图显示

    [原创]禁止转载,需要转载请联系作者 想要使用Tecplot显示图1中这样一张云图,即删除掉接近0的一些正负的压力值,尝试了多种方法后成功实现: 图1 多截面云图显示 问题:如何去掉 -0.3< ...