1.中断概念

中断指的是在计算机工作期间,出现了需要立即停止正在运行的程序,转而去处理意外发生的情形。发生中断之后,CPU会去执行事先写好的处理中断的代码,处理完成后回到被打断的位置继续执行。

编写中断程序需要注意事项:

a.中断处理程序执行事件尽量短(不能睡眠以及延时),给其他程序让出CPU。

b.中断程序中访问的共享数据必须进行保护。

Stm32中断流程,Stm32中,中断源产生中断信号,提交给向量中断控制器(NVIC),中断控制器做进一步处理再提交给CPU,CPU执行中断处理中断处理程序

2.向量中断控制器(NVIC

(1)NVIC介绍

NVIC外部中断(中断信号来自于芯片外部),一共有23个外部中断源,包括16个GPIO中断和7个其他中断。

(2)中断优先级 (数字越小,优先级越高) 这点需要特别注意。

stm32的中断优先级分为2类:抢占优先级和响应优先级

抢占优先级:抢占优先级高的中断可以打断抢占优先级低的中断

响应优先级:响应优先级高的不能打断响应优先级低的中断,当两个抢占优先级相同的两个中断同时发生,CPU优先处理响应优先级比较高的中断。抢占优先级和响应优先级一起最多占8位或者4位字节,配置两个优先级所占的位数叫做中断优先级分组。

以上NVIC的配置,通过库函数NVIC_Init()来实现

优先级分组是通过NVIC_PriorityGroupConfig来配置,该函数只能在程序开头调用,并且只能调用一次

NVIC配置函数

void NVIC_Init  (NVIC_InitTypeDef* NVIC_InitStruct);

//传入NVIC初始化结构体

typedef struct

{

uint8_t NVIC_IRQChannel;                     /*!< 中断通道 @ref IRQn_Type */

uint8_t NVIC_IRQChannelPreemptionPriority;      /*!< 抢占优先级 */

uint8_t NVIC_IRQChannelSubPriority;            /*!< 响应优先级 */

FunctionalState NVIC_IRQChannelCmd;          /*!< 使能/禁止 ENABLE or DISABLE */

} NVIC_InitTypeDef;

优先级分组配置函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

参数:

*     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority

*                                                    4 bits for subpriority

*     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority

*                                                     3 bits for subpriority

*     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority

*                                                     2 bits for subpriority

*     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority

*                                                    1 bits for subpriority

*     @arg NVIC_PriorityGroup_4:4 bits for pre-emption priority

*                                                    0 bits for subpriority

3.外部中断源EXIT

(1)EXIT主要的特性(在编写程序时常用特性)

每个中断/事件线上都具有独立的触发和屏蔽

每个中断线具有专用的状态位

支持多达23个软件事件/中断请求

(2)EXIT处理框图

(3)外部中断源映射

在stm32中,一共有16个GPIO中断,stm32中的GPIO引脚,一共有16(A~I)组引脚,每一个GPIO都能配置成一个外部中断,通过不同的引脚序号将不同中断触发源分成不同的组,这也是stm32的一个强大之处。

PA0,PB0,PC0, ... ...PH0,PI0为一组中断源,以此类推,一共有16组中断源,每一组只能有一个中断触发源工作,那么,整个中断源做多工作的也就16个外部中断。STM32F103 的中断控制器⽀持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独⽴的触发和屏蔽设置。STM32F103 的19 个外部中断为:

中断线 0~15:对应外部 IO 的输入中断。

中断线 16:连接到 PVD 输出。

中断线 17:连接到 RTC 闹钟事件。

中断线 18:连接到 USB 唤醒事件

注意:GPIO设置为外部中断时需要将其配置为中断模式

——————————————————————————————————————————————————————————————————————————————————————

4.编程实现GPIO中断,主要步骤如下。

工程中添加中断库函数文件

(1)配置中断优先级分组,下面函数中,抢占优先级和响应优先级一共占4位

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

参数: //抢占优先级占0位,响应优先级占4位

* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority *

4 bits for subpriority

* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority *

3 bits for subpriority

* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority *

2 bits for subpriority

* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority *

1 bits for subpriority

* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority *

0 bits for subpriority

——————————————————————————————————————————-

(2)外部中断源初始化

(3)GPIO时钟和SYSCFG时钟初始化

RCC_AHB1...                                           //初始化GPIO时钟,此处省略

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  //初始化SYSCFG时钟

——————————————————————————————————————————

(4)GPIO配置为输入模式

GPIO_init();                                             //此处省略

  1. 设置GPIO和外部中断线的关系

Void SYSCFG_EXITLineConfig(uint8_t EXIT_PortSourceGPIOx,uint8_t EXIT_PinSourcex);

参数:EXIT_PortSourceGPIOx              哪一组引脚

EXIT_PinSourcex                             哪个脚

———————————————————————————————————————————

(5)初始化外部中断

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

参数:

typedef struct

{

uint32_t EXTI_Line;               /*!< 哪条外部中断线 @ref EXTI_Lines */

EXTIMode_TypeDef EXTI_Mode;     /*!< 模式选择 事件/中断 @ref EXTIMode_TypeDef */

EXTITrigger_TypeDef EXTI_Trigger; /*!< 触发边沿选择 @ref EXTITrigger_TypeDef */

FunctionalState EXTI_LineCmd;     /*!< 使能/禁止 ENABLE or DISABLE */

} EXTI_InitTypeDef;

——————————————————————————————————————————

NVIC向量中断控制器初始化

(6)初始化NVIC

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

//传入NVIC初始化结构体

typedef struct

{ uint8_t NVIC_IRQChannel; /*!< 中断通道 @ref IRQn_Type */

uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 抢占优先级 */

uint8_t NVIC_IRQChannelSubPriority; /*!< 响应优先级 */

FunctionalState NVIC_IRQChannelCmd; /*!< 使能/禁止 ENABLE or DISABLE */

} NVIC_InitTypeDef;

———————————————————————————————————————————

(7)实现中断处理函数

函数名在启动文件的异常向量表中去找,比如:EXTI0_IRQHandler

中断处理函数无参无返回值

中断处理函数中必须清除中断标志

———————————————————————————————————————————

(8)清除中断标志位

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

//传入初始化的外部中断线

第四篇,STM32中断控制编程相关推荐

  1. STM32中断控制LED灯亮灭

    目录 一.中断介绍 1.中断分类 硬件中断(Hardware Interrupt) 软件中断(Software Interrupt) 2.中断优先级 3.中断源种类 4.中断响应原则 二.新建项目 1 ...

  2. STM32中断控制LED灯

    文章目录 一.相关概念 1.中断概念 2.中断过程 3.中断作用 4.中断优先级 5.中断响应过程 二. CubeMX中断控制LED灯 1.创建项目 2.代码修改 3.运行结果 三.HAL库中断串口通 ...

  3. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  4. STM32中断控制LED灯闪烁

    文章目录 一.中断 1.中断全过程 2.中断优先级 3.HAL库外部中断处理流程 4.中断回调函数 二.实现LED灯 三.实现项目 四.实验结果 五.总结 一.中断 1.中断全过程 中断发生 当CPU ...

  5. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  6. Linux 中断学习之小试牛刀篇---Linux中断内核编程

    原址 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序: 我们还是来看一看成程序: 在看程序之前,要熟悉如何进行 ...

  7. python 控件类多个实例_Python笔记_第四篇_高阶编程_GUI编程之Tkinter_2.控件类

    1. Label控件: 说明:标签控件,可显示文本 图示1: 实例1: import tkinter # 创建主窗口__编程头部 win=tkinter.Tk() # 设置标题 win.title(& ...

  8. 【涵子来信python大全】——第二季——opencv第四篇-用手势控制屏幕鼠标

    各位亲爱的读者,博主: 大家好,我是涵子.今天我们需要使用cv2,mediapipe和pyautogui用手势控制屏幕鼠标. 目录 一.准备 二.代码 可以先去看看之前的文章哦. 一.准备 首先pip ...

  9. Python笔记_第四篇_高阶编程_正则表达式_3.正则表达式深入

    1. re.split 正则的字符串切割 str1 = "Thomas is a good man" print(re.split(r" +",str1)) # ...

最新文章

  1. Android笔记之ViewModel的使用示例
  2. 《征服C指针》作者语录
  3. linux 基本脚本编写
  4. 元组-元组和格式化字符串
  5. mssql on linux 安装指导
  6. 盘点丨2019十大边缘计算项目
  7. Could not resolve placeholder 'jdbc.url' in value ${jdbc.url}
  8. 毕业设计论文选题系统系统用例图_基于Web的毕业论文管理系统的设计与实现
  9. jquery学习之1.12-给节点添加样式
  10. 大神干货:冠军选手分享解题思路,助你轻松突围初赛
  11. mysql5.7 dmg安装
  12. 生成登录验证码,点击更换验证码图片
  13. 线性代数之矩阵逆的求法
  14. https://mp.weixin.qq.com/s?__biz=MzkxNTIzODIxNQ==tempkey=MTEwOV9qbGlub091aVlKb1NtOVZKV3lTcHgwd3U0NG
  15. r 选取从小到大的数据_R语言第二章数据处理⑥dplyr包(1)列选取
  16. Xilinx ZCU106开发详解(Xilinx Zynq UltraScale+ MPSoC)
  17. 【转】波利亚酒鬼回家定理的证明
  18. 【智能制造】周宏仁:通俗易懂讲清楚制造业“数字化起步,网络化崛起,智能化发展”;任泽平:解码“德国制造”的七大基因
  19. Discuz论坛升级攻略及踩坑处理
  20. 域名系统(DNS)说明

热门文章

  1. SLF4J-bridge
  2. FireMonkey 的菜单条的汉化,以及多语言
  3. 5个可以称之为宝藏的学习网站,不可错过
  4. 公告栏自动滚动例子代码
  5. 还不知道OFD是什么格式的文件?快来看看这篇文章吧
  6. java声明复数类_JAVA声明复数类
  7. 通过按钮添加、删除表格及表单元素
  8. 【MapGIS精品教程】013:如何制作三维电子沙盘?
  9. 德语c1语言证书,学习德语要考哪些证书?欧那给你扒一扒德语的有哪些考证
  10. C# AutoResetEvent / ManualResetEvent