第四篇,STM32中断控制编程

2023-05-16

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)外部中断源初始化

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

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

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

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

(4GPIO配置为输入模式

 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);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第四篇,STM32中断控制编程 的相关文章

  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • 深蓝学院《从零开始手写VIO》作业五

    深蓝学院 从零开始手写VIO 作业五 1 完成Bundle Adjustment求解器2 完成测试函数3 论文总结 1 完成Bundle Adjustment求解器 完成单目 Bundle Adjustment 求解器 problem cc
  • VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化

    VIO在走廊弱纹理环境下的优化 VINS Mono的点线紧耦合优化 VIO在走廊弱纹理环境下的优化0 前言1 思路概述1 1 Super Pixel SLAM1 2 Edge SLAM1 3 PL SLAM 2 算法实施2 1 Edge S
  • SLAM综述:激光雷达与视觉SLAM(2019.10.12)

    本文基于https arxiv org pdf 1909 05214v2 pdf 进行阐述 xff08 其实差不多就是精简版翻译 xff09 第一节概述 第二节讲述激光SLAM xff1a 激光传感器 xff0c 开源系统 xff0c 深度
  • HAL库串口收发

    1 通讯方式介绍 在微处理器和外部通信模块之间主要有并行通信和串行通信两种 并行通讯传输速率快 xff0c 但是占用引脚较多 xff0c 串行通信与之相反 串行通讯分别有单工 半双工 全双工三种模式 单工 xff1a 只能发送数据或者只能接
  • ros 启动

    绑定usb设备端口号 11条消息 Ubuntu下绑定串口的两种方式ID法和serial法 haley du的博客 CSDN博客 11条消息 Ubuntu usb设备端口号绑定 一抹烟霞的博客 CSDN博客 2 2执行 1 执行相关launc
  • c++中“::“表示含义

    1 表示 域操作符 例 xff1a 声明了一个类A xff0c 类A里声明了一个成员函数void f xff0c 但没有在类的声明里给出f的定义 xff0c 那么在类外定义f时 xff0c 就要写成void A f xff0c 表示这个f
  • ROS自学笔记整合-串口通信篇

    ROS自学笔记整合 串口通信篇 最近也是刚开始接触ROS xff0c 然后买了一本古月大神的 ROS机器人开发实践 自己在捣鼓 本人编程小白 xff0c 只能做代码的搬运工 书本上的仿真基本都看的差不多了 xff0c 也动手做了不少例子 x
  • docker宿主机ssh免密

    若要实现免密登陆 xff0c 意味着无论是宿主机 xff0c 还是容器都要彼此交互公钥 xff1a 容器A发送自身公钥给中心机器 xff0c 统一由中心机器 xff0c 回发全部需要ssh到容器A的公钥信息 xff0c 任何一个新加入的容器
  • redis指定配置文件启动失败

    redis指定配置文件启动失败 redis指定配置文件启动失败 redis server redis conf失败 但是直接执行redis server是可以成功的 之所以没有启动成功 xff0c 且没有报错的原因是 在自己的redis c
  • Ubuntu 查看磁盘空间及目录容量

    Ubuntu 查看磁盘空间及目录容量 http www zhcn org 548 Df命令是linux系统以磁盘分区为单位查看文件系统 xff0c 可以加上参数查看磁盘剩余空间 xff1a df hl 显示格式为 xff1a 文件系统 容量
  • VS(Visual Studio)与VC(Visual C++)版本对应关系

    VS全名是Microsoft Visual Studio xff0c 是很大的一个开发环境 xff0c 包含很多高级语言的开发环境 xff0c VC只是VS其中的一个开发环境 VC版本与VS版本对应关系如下所示 xff1a Visual S
  • docker 状态Removal In Progress,rm提示无法删除

    docker 无法删除场景 docker 进入Removal In Progress状态 xff0c 无法直接删除 1 docker rm f 容器 提示文件无权限操作 2 xxxx 表示上图的文件路径 需要登录到宿主机上 xff0c 执行
  • windows上安装启动pgsql,postgres

    windows上安装启动pgsql postgres 1 在官网下载pgsql2 进入pgsql的安装目录 bin 下面3 windows 启动 pgsql server cmd窗口退出 server关闭4 注册成服务 cmd窗口退出 se
  • django调试问题django.core.exceptions.ImproperlyConfigured

    django项目调试子应用app时提示缺少配置 1 项目的settings文件里面设置的有子app xff0c 依旧提示下面问题 django core exceptions ImproperlyConfigured Requested s
  • Python 数据描述符

    今天看到一篇文档介绍了Python描述符 xff0c 转发学习下 1 默认的属相访问是从对象的字典中 get set 或者 delete 属性 xff1b 例如a x的查找顺序是 a x gt a dict x gt type a dict
  • pycharm中terminal中使用git bash替换cmd(无弹窗)

    pycharm中terminal中使用git bash替换cmd 1 背景 系统 xff1a windows 想要在pycharm上的terminal中使用git bash而不是系统自带的cmd 可以调用基础的Linux命令 比如ls 等
  • linux安装 python3-pip没有安装候选项

    问题 环境 xff1a linux ubuntu span class token number 22 04 span 版本 LTS windows xff1a 使用vmware 执行以下命令报错 span class token func
  • django连接elasticsearch失败Failed to establish a new connection: [Errno 113] No route to host[Errno 111]

    做django商城项目时报错 错误信息 urllib3 exceptions NewConnectionError lt urllib3 connection HTTPConnection object at 0x7fa6b2537390
  • python爬虫数据采集使用的三种匹配方式:正则re,xpath,beautifulsoup4

    一般情况下三种方式都是可以匹配到结果的 xff0c 只是复杂程度不一致 xff0c 根据情况进行选择re xpath bs4 先进行简单的比较 xff1a 一 正则re的使用二 lxml三 bs4 的使用 先进行简单的比较 xff1a 抓取

随机推荐