一、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_10IRQnNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     //响应式优先级0NVIC_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

(二)stm32之中断配置相关推荐

  1. stm32定时器中断配置及使用

    stm32定时器中断配置及使用 定时器中断就是:可以周期性的执行某些功能,而不受main函数的影响. 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入, ...

  2. stm32之中断配置

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

  3. STM32定时器中断配置

    1.使能时钟 定时器时钟 2.配置定时器结构体.使能 3.开启定时器中断,配置中断结构体 配置例子 #include "tim.h" #include "stm32f10 ...

  4. STM32单片机外部中断配置讲解

    2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平.低电平).边沿变化(上升沿. ...

  5. stm32之中断模式

    stm32之中断模式 一.中断简介 二.外部中断配置 (一)外部中断简介 (二)配置外部中断 1.配置外部中断 2.配置中断优先级 3.生成并查看代码 (三)编写中断函数 (四) 实例演示 三.使用串 ...

  6. 【CubeMX配置stm32定时器中断】

    CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...

  7. 【STM32】FreeRTOS中断配置

    00. 目录 文章目录 00. 目录 01. 概述 02. 中断管理 03. 优先级分组 04. 优先级设置 05. 特殊寄存器 06. FreeRTOS中断配置宏 07. FreeRTOS开关中断 ...

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

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

  9. stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...

最新文章

  1. 匿名内部类,就是内部类的简写格式。
  2. BZOJ2730 HNOI2012 矿井搭建 连通性
  3. 容器created状态_docker容器状态的转换实现
  4. WebMagic写的网络爬虫优秀文章
  5. mysql远程授权格式_MySQL远程访问授权
  6. angular 自定义组件_如何创建Angular 6自定义元素和Web组件
  7. 101个免费的VMware工具
  8. AFNetWork 学习资源....
  9. java中html在哪里找_java – 如何找出在我的servlet中推送哪个HTML按钮?
  10. Ubuntu18.04系统中python3.7安装MultiNEAT库
  11. linux安装steam
  12. 网络攻防第七周作业之20189304李小涛
  13. 浅谈JavaScript函数重载
  14. 轻松学会Python列表解析式
  15. 能量收集技术能为利用环境能源的应用带来巨大优势
  16. Harbor: 企业级Registry的构建利器
  17. WebBrowser 显示Html内容3点细节技巧
  18. linux 测试cpu工具,给centos安装cpu监测工具
  19. 【03】从零开始跟我一起制作一个鸿蒙的应用-★规划搭建鸿蒙应用版的蜻蜓短视频系页面★---优雅草科技伊凡
  20. 【OCR技术系列之一】字符识别技术总览

热门文章

  1. Weighted Slope One 算法
  2. 基于IBM Cognos的高级报表制作技巧
  3. Android5.0设置主题样式
  4. java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
  5. 八、spring生命周期之BeanPostProcessor
  6. VC++动态链接库编程(转载)
  7. LeetCode | Single Number II
  8. jQuery原理第一天
  9. 几种简单的社交网站的标志按钮
  10. React脚手架案例