这一节我们以外部中断为例子,讲讲中断的优先级和中断向量表的知识。

1)cubemx生成代码

首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)。

然后设置GPIO引脚,选择PC13作为输出(用于LED指示),如下图选择PA0设置为外部中断输入引脚:

然后设置中断使能和优先级,如下图:

这里的几处选项解释一下:

最上面的Priority group是选择优先级分组,STM32(更确切地说是contex-M3内核的单片机)使用4个bit位来分组,这里可以设置用几个bit来区分抢占优先级和响应优先级;

比如图中选择的是3bit用来区分抢占优先级、1bit用来区分响应优先级,则抢占优先级可以选择为0~7(图中选的是6),响应优先级可以选择为0~1(图中选的是1);数值越小则优先级越高;

抢占优先级高的可以中断低优先级的中断,中断嵌套的形式实现;

抢占优先级相同时,有多个中断同时发生,则先运行响应优先级高的中断。

由于咱们这个例子只有一个中断,选哪个都不影响,但是要勾上使能。

到GPIO页面下,将PA0的状态改为上拉、中断下降沿触发:

之后,在时钟选项卡设置主时钟为72M;在project Manager选项卡设置工程名和路径,生成工程代码。

2)HAL库函数的使用

生成的工程中,已经有比较完善的初始化代码。我们直接看中断服务程序,在stm32f1xx_it.c中:

其中的HAL_GPIO_EXTI_IRQHandler函数实现如下:

我们重写它的回调函数,实现翻转一次PC13(LED翻转):

编译下载到板子上后,将PA0引脚接触一下GND,可以看到LED有翻转。

由于这里没有去抖,将PA0接触GND时可能会产生多次中断,有可能LED的状态来回变化多次,可以在调试模式下,在中断中设置断点来观察,是否每次接触都会进入中断。

3)中断向量表的概念

在中断发生时,为什么会跳到如下这个函数来执行呢?

首先,我们在初始化时,开启了外部中断0(这是配置完cubemx自动生成的):

在MCU中,每个中断源会对应一个地址,当某个中断产生时,程序就会保存现场,自动跳转到这个地址去执行,执行完后再恢复现场,回到原来的程序执行。这些中断源对应的地址就是中断向量表。

如下图,stm32的工程代码中,启动文件中设置的中断向量表,都是跳转到某个函数执行:

这个启动文件里的中断向量表是从程序存储的地址起始开始往下排列的,每行占用4个字节(32bit),也就是说,EXTI0_IRQHandler在第23行,对应地址22*4=0x00000058;我们查看stm32f103的数据手册,发现这个地址就是外部中断0的中断向量地址:

所以,产生外部中断0时,会自动跳到其对应的中断向量表0x00000058处去执行,也就是调用EXTI0_IRQHandler函数。

4)中断向量表的重映射

在某些应用中,需要将中断向量表移到别处。比如说含有IAP功能的程序,一般bootlooder程序是从MCU默认启动的位置(地址0)执行,其中断向量表也在从0起始的位置;而app程序一般存储在bootlooder之后的一段地址中,这样app程序中定义的中断向量表就会偏离0地址。

为了正确访问中断向量表的地址,需要在app程序的起始,进行中断向量表的映射,可以用以下函数实现:

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{ /* Check the parameters */assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));assert_param(IS_NVIC_OFFSET(Offset));     SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

如下使用,可以将中断向量表起始地址设置为0x08003000:

NVIC_SetVectorTable(0x08000000, 0x3000);

这里说明一下, stm32芯片的rom地址是从0x08000000开始的,如keil中的默认设置:

stm32芯片在内部自动进行了映射,把0x08000000和地址0进行了映射,所以app程序烧写到0x08000000地址,不用进行其他设置,也是可以访问到中断向量表的。

但是,如果app程序被烧写到了别的地址,如0x08003000,则需要程序中重新映射一下,使用这个函数:NVIC_SetVectorTable(0x08000000, 0x3000),这个用法以后讲到IAP的时候会用到。

好了,这一节的内容基本讲完了。

欢迎关注我的公众号,可留言“资料”获取相关程序和软件:

【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表相关推荐

  1. hal库开启中断关中断_(2)STM32使用HAL库操作外部中断——理论讲解

    1.中断触发过程 对主程序压栈--把中断服务函数的地址写入到程序计数器(PC)--执行中断服务函数 2.中断向量表 中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分): 如上表所示, ...

  2. STM32系列之HAL库开发

    STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...

  3. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  4. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  5. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  6. STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

    modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...

  7. 清泉HAL库开发STM32之基础概念

    文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...

  8. 【STM32】基于HAL库的中断详细学习

    目录 1.中断概述 1.1中断相关概念 1.2 STM32中断系统 2 .HAL库的中断处理 2.1 HAL 库的中断封装 2.2 外部中断处理流程 3.外部中断的HAL库定义 3.1. 外部中断的数 ...

  9. 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

    目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...

最新文章

  1. [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向
  2. Golang之不可重入函数实现
  3. python全栈构图_Python全栈-magedu-2018-笔记5
  4. matlab求解数学题,MATLABR2013a求解数学问题
  5. Pattern 模式器: Matcher 匹配器
  6. sum of digits
  7. 随机森林算法的扩展-深度森林(deep forest)
  8. 微波雷达存在感应模组,智能微波感应开关,多普勒雷达原理应用
  9. 比特率,比特,字节的计算
  10. java find symbol,cannot find symbol
  11. Qt 使用一张图片实现转圈的动画效果
  12. T1076 正常血压(信息学一本通C++)
  13. 笔记本电脑wlan+开启移动热点+手机转圈圈【已解决】
  14. VMware 12虚拟机win7中添加摄像头
  15. USB学习笔记(3)HID应用分析
  16. 详解什么是BFC和BFC能解决什么问题
  17. Kotlin 主构造函数与次构造函数的理解
  18. 青龙面板—-美团买菜
  19. beacon帧字段——HT字段总结
  20. ALS3-P系列限位开关

热门文章

  1. win7在同一窗口打开文件夹设置失效
  2. 思维导图:Hadoop01
  3. 银行面试准备起来无方向?(下)
  4. 学习笔记 | 基于FPGA的伪随机数发生器(附代码)
  5. random.uniform()总结
  6. python分析保险销售数据_利用python进行保险数据分析及可视化
  7. Cloudcompare错误:an error occurred while loading‘ ’:the third party libary in charge of,las
  8. “GAN之父”Goodfellow与网友互动:关于GAN的11个问题(附视频)
  9. 关于springboot /tmp目录
  10. 平均绝对误差的MATLAB怎么写,标准差、均方误差、均方根误差、平均绝对误差