【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

2023-05-16

NVIC(嵌套向量中断控制器)简介

        在讲如何配置中断优先级之前,我们需要先了解下 NVIC。NVIC 是嵌套向量中断控制器,控制着整个STM32芯片中断相关的功能,它跟Cortex-M3 内核紧密联系,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M3内核里面的 NVIC 进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M 3 的 NVIC 的一个子集。

NVIC 寄存器简介

/**
  中断	 NVIC 结构体定义
 */
typedef struct
{
  __IO uint32_t ISER[8];                 /*!<Offset: 0x000  中断使能寄存器          */
  uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                 /*!<Offset: 0x080  中断清除寄存器          */
  uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];            	 /*!<Offset: 0x100  中断使能悬起寄存器      */
  uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                 /*!<Offset: 0x180  中断清除悬起寄存器 	  */
  uint32_t RESERVED3[24];                                    
  __IO uint32_t IABR[8];            	 /*!<Offset:0x200   中断有效位寄存器       */
  uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                 /*!< Offset: 0x300  中断优先级寄存器 (8Bit wide) */
  uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                    /*!< Offset: 0xE00  软件触发中断寄存器     */
}  NVIC_Type;   

        在配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器,ISER 用来使能中断,ICER 用来清除中断,IP 用来设置中断优先级

NVIC 中断配置固件库

       固件库头文件 core_cm3.h 中,提供了 NVIC 的一些函数,这些函数遵循 CMSIS 规则,只要是 Cortex-M3 的处理器都可以使用,具体如下:

 

优先级的介绍

       优先级的分组由内核外设SCB 的应用程序中断及复位控制寄存器 AIRCR 的 PRIGROUP[10:8] 位决定,F103 分为了 5 组,具体如下:主优先级 = 抢占优先级。

        设置优先级分组可调用库函数 NVIC_PriorityGroupConfig() 实现,有关 NVIC 中断相关的库函数都在库文件 misc.c 和 misc.h 中。

/**
* 配置中断优先级分组:抢占优先级和子优先级
* 形参如下:
* @arg NVIC_PriorityGroup_0: 		0bit for 抢占优先级
* 									4 bits for 子优先级
* @arg NVIC_PriorityGroup_1:	 	1 bit for 抢占优先级
* 									3 bits for 子优先级
* @arg NVIC_PriorityGroup_2: 		2 bit for 抢占优先级
* 									2 bits for 子优先级
* @arg NVIC_PriorityGroup_3: 		3 bit for 抢占优先级
* 									1 bits for 子优先级
* @arg NVIC_PriorityGroup_4: 		4 bit for 抢占优先级
* 									0 bits for 子优先级
* @ 注意 如果优先级分组为 0,则抢占优先级就不存在,优先级就全部由子优先级控制
*/
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  	/* 检查参数*/
  	assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
    /* 设置优先级分组*/ 
    SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

 

        具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。

        在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。

NVIC中断编程步骤

        在配置每个中断的时候一般有 3 个编程步骤:

        1、使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。

        2、初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。NVIC_InitTypeDef 结构体在固件库头文件 misc.h 中定义。

typedef struct
{
  uint8_t NVIC_IRQChannel;                      /*!< 中断源 */

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

  uint8_t NVIC_IRQChannelSubPriority;         	/*!< 子优先级*/

  FunctionalState NVIC_IRQChannelCmd;           /*!< 中断使能或者失能 */   
} NVIC_InitTypeDef;

         a. NVIC_IROChannel:用来设置中断源,不同的中断中断源不一样,且不可写错,即使写错了程序 也不会报错,只会导致不响应中断。具体的成员配置可参考 stm32f10x.h 头文件里面的 IRQn_Type 结构体定义,这个结构体包含了所有的中断源。

typedef enum IRQn
{
/******		Cortex-M3 处理器异常编号 		***********/
  NonMaskableInt_IRQn      = -14,    /*!< 2 不可屏蔽中断*/
  MemoryManagement_IRQn    = -12,    /*!< 4 Cortex-M3 内存管理中断*/
  BusFault_IRQn            = -11,    /*!< 5 Cortex-M3 总线故障中断*/
  UsageFault_IRQn          = -10,    /*!< 6 Cortex-M3 使用故障中断*/
  SVCall_IRQn              = -5,     /*!< 11 Cortex-M3 SV 呼叫中断*/
  DebugMonitor_IRQn        = -4,     /*!< 12 Cortex-M3 调试监视器中断*/
  PendSV_IRQn              = -2,     /*!< 14 Cortex-M3挂起 SV 中断*/
  SysTick_IRQn             = -1,     /*!< 15 Cortex-M3 系统滴答中断*/

/******  STM32 特定中断号码*******/
  WWDG_IRQn                = 0,      /*!< 窗口看门狗中断*/
  PVD_IRQn                 = 1,      /*!< PVD 通过 EXTI 线路检测中断*/
  TAMPER_IRQn              = 2,      /*!< 篡改中断*/
  RTC_IRQn                 = 3,      /*!< RTC 全局中断*/
  FLASH_IRQn               = 4,      /*!< 闪存全局中断*/
  RCC_IRQn                 = 5,      /*!< RCC 全局中断*/
  EXTI0_IRQn               = 6,      /*!< EXTI Line0 中断*/
  EXTI1_IRQn               = 7,      /*!< EXTI Line1 中断*/
  EXTI2_IRQn               = 8,      /*!< EXTI Line2 中断*/
  EXTI3_IRQn               = 9,      /*!< EXTI Line3 中断*/
  EXTI4_IRQn               = 10,     /*!< EXTI Line4 中断*/
  DMA1_Channel1_IRQn       = 11,     /*!< DMA1 Channel 1 全局中断*/
  DMA1_Channel2_IRQn       = 12,     /*!< DMA1 Channel 2 全局中断*/
  DMA1_Channel3_IRQn       = 13,     /*!< DMA1 Channel 3 全局中断*/
  DMA1_Channel4_IRQn       = 14,     /*!< DMA1 Channel 4 全局中断*/
  DMA1_Channel5_IRQn       = 15,     /*!< DMA1 Channel 5 全局中断*/
  DMA1_Channel6_IRQn       = 16,     /*!< DMA1 Channel 6 全局中断*/
  DMA1_Channel7_IRQn       = 17,     /*!< DMA1 Channel 7 全局中断*/
  ADC1_2_IRQn              = 18,     /*!< ADC1 and ADC2 全局中断*/
  USB_HP_CAN1_TX_IRQn      = 19,     /*!< USB 设备高优先级或 CAN1 TX 中断*/
  USB_LP_CAN1_RX0_IRQn     = 20,     /*!< USB 设备低优先级或 CAN1 RX0 中断*/
  CAN1_RX1_IRQn            = 21,     /*!< CAN1 RX1 中断*/
  CAN1_SCE_IRQn            = 22,     /*!< CAN1 单片机中断*/
  EXTI9_5_IRQn             = 23,     /*!< External Line[9:5] 中断*/
  TIM1_BRK_IRQn            = 24,     /*!< TIM1 打破 中断*/
  TIM1_UP_IRQn             = 25,     /*!< TIM1 更新 中断*/
  TIM1_TRG_COM_IRQn        = 26,     /*!< TIM1 触发和换向中断*/
  TIM1_CC_IRQn             = 27,     /*!< TIM1 捕获比较中断*/
  TIM2_IRQn                = 28,     /*!< TIM2 全局中断*/
  TIM3_IRQn                = 29,     /*!< TIM3 全局中断*/
  TIM4_IRQn                = 30,     /*!< TIM4 全局中断*/
  I2C1_EV_IRQn             = 31,     /*!< I2C1 事件中断*/
  I2C1_ER_IRQn             = 32,     /*!< I2C1 错误中断*/
  I2C2_EV_IRQn             = 33,     /*!< I2C2 事件中断*/
  I2C2_ER_IRQn             = 34,     /*!< I2C2 错误中断*/
  SPI1_IRQn                = 35,     /*!< SPI1 全局中断*/
  SPI2_IRQn                = 36,     /*!< SPI2 全局中断*/
  USART1_IRQn              = 37,     /*!< USART1 全局中断*/
  USART2_IRQn              = 38,     /*!< USART2 全局中断*/
  USART3_IRQn              = 39,     /*!< USART3 全局中断*/
  EXTI15_10_IRQn           = 40,     /*!< External Line[15:10] 中断*/
  RTCAlarm_IRQn            = 41,     /*!< 通过 EXTI 线路中断发出 RTC 报警*/
  USBWakeUp_IRQn           = 42,     /*!< USB 设备通过 EXTI 线路中断从挂起状态唤醒*/
  TIM8_BRK_IRQn            = 43,     /*!< TIM8 打破中断*/
  TIM8_UP_IRQn             = 44,     /*!< TIM8 更新中断*/
  TIM8_TRG_COM_IRQn        = 45,     /*!< TIM8 触发和换向中断*/
  TIM8_CC_IRQn             = 46,     /*!< TIM8 捕获比较中断*/
  ADC3_IRQn                = 47,     /*!< ADC3 全局中断*/
  FSMC_IRQn                = 48,     /*!< FSMC 全局中断*/
  SDIO_IRQn                = 49,     /*!< SDIO 全局中断*/
  TIM5_IRQn                = 50,     /*!< TIM5 全局中断*/
  SPI3_IRQn                = 51,     /*!< SPI3 全局中断*/
  UART4_IRQn               = 52,     /*!< UART4 全局中断*/
  UART5_IRQn               = 53,     /*!< UART5 全局中断*/
  TIM6_IRQn                = 54,     /*!< TIM6 全局中断*/
  TIM7_IRQn                = 55,     /*!< TIM7 全局中断*/
  DMA2_Channel1_IRQn       = 56,     /*!< DMA2 Channel 1 全局中断*/
  DMA2_Channel2_IRQn       = 57,     /*!< DMA2 Channel 2 全局中断*/
  DMA2_Channel3_IRQn       = 58,     /*!< DMA2 Channel 3 全局中断*/
  DMA2_Channel4_5_IRQn     = 59      /*!< DMA2 Channel 4 and Channel 5 全局中断*/
} IRQn_Type;

        b. NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,具体参考下图。

        c. NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具体参考下图。

         d. NVIC_IRQChannelCmd:中断使能(ENABLE)或者失能(DISABLE)。操作的是 NVIC_ISER 和 NVIC_ICER 这两个寄存器。

代码举例:

        在配置中断优先级的函数中需要这样写:

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC

        在main.c中需要调用此函数:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
//抢占优先级可选0~3,响应优先级可选0~3;

        3、编写中断服务函数。

在启动文件 startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中。

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

【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解 的相关文章

  • 对IMU数据进行卡尔曼滤波

    我们要使用IMU数据 xff0c 必须对数据进行预处理 xff0c 卡尔曼滤波就是很好的方式 1 卡尔曼滤波 卡尔曼滤波 xff08 Kalman filtering xff09 是一种利用线性系统状态方程 xff0c 通过系统输入输出观测
  • PHPExcel导出导入问题”continue” targeting switch is equivalent to “break”.Did you mean to use “continue 2”?

    在 php 7 3 的 switch 中使用 continue 会出现警告 1 2 3 最好的方式是把 PHPExcel Shared OLE php 文件中的 continue 改为 continue 2 或 break 亲测 xff0c
  • 强化学习highway_env代码解读

    写在前面 作为强化学习的新手 xff0c 写这个系列的博客主要是为了记录学习过程 xff0c 同时也与大家分享自己的所见所想 前段时间发布了人生第一篇博客 xff0c 是关于highway env的自定义环境 但博客主要是关于如何创建一个自
  • Highway_env(Intersection)修改离散动作空间

    前言 在十字路口环境中 xff0c 主车默认的动作空间是以5m s变化的加减速以及保持原速三个动作 有时候为了学习更优化的策略 xff0c 同时与自己设置的奖励函数吻合 xff0c 需要修改环境的动作空间 这里我们主要添加两个较小加速度的纵
  • 离散动作的修改(基于highway_env的Intersection环境)

    之前写的一篇博客将离散和连续的动作空间都修改了 xff0c 这里做一下更正 基于十字路口的环境 xff0c 为了添加舒适性评判指标 xff0c 需要增加动作空间 xff0c 主要添加两个不同加速度值的离散动作 需要修改以下几个地方 xff1
  • VM 导入.ova/.ovf,未通过 OVF 规范一致性或虚拟硬件合规性检查.

    今天在用虚拟机VM导入ubuntu riscv ova文件新建Ubuntu时报错 xff1a 未通过OVF规范一致性或虚拟硬件合规性检查 网上查了一下 xff0c 了解到这是因为VM内置的Ofvtool工具的版本较低导致的 xff0c 解决
  • 借助FileZilla实现Ubuntu和 Windows之间文件互传

    借助FileZilla实现Windows和 Ubuntu间文件互传 xff0c 需要使用 FTP服务 xff0c 设置方法如下 xff1a 1 Windows下安装FTP客户端 FileZilla xff08 该软件免费 xff0c 可以直
  • 使用Ubuntu系统中的gparted工具对Ubuntu磁盘扩充

    最近在使用Ubuntu时 xff0c 发现经常提示内存空间不足 就总结了扩充Ubuntu内存的主要流程 xff0c 操作步骤如下 xff1a 第一步 xff1a 在虚拟机操作界面 xff08 关闭要进行磁盘扩充的Ubuntu xff09 进
  • 通过挂载的方式,解决由于权限无法将rootfs直接拷贝到SD卡的EXT4分区的问题

    最近在使用SD卡制作Linux启动文件时 xff0c 要将自己制作的根文件系统 xff08 rootfs xff09 拷到SD卡的EXT4分区时 xff0c 发现由于权限问题无法直接拷贝 xff0c 现通过挂载的方式解决该问题 xff0c
  • RISC-V架构下,Busybox工具的安装

    今天在RISC V架构下安装Busybox工具箱时 xff0c 找了很多的资料 xff0c 但都是ARM架构下的安装教程 xff0c 尽管内核不同但有一定的参考价值 xff0c 安装完成后对RISC V下Busybox工具箱的安装过程做出了
  • 串行通信协议小结(Serial Protocols)(1)

    通信关键点 同步通信 xff08 例如SPI xff09 双方之间的数据传输使用公共时钟信号进行同步 xff0c 数据以稳定的流传输 不需要额外的比特来标记传输的每个数据块的开始 结束 xff0c 因此速度更快 异步通信 xff08 例如U
  • MATLAB课程笔记(二)——MATLAB基础知识

    MATLAB系统环境 MATLAB操作界面的组成 采用与office 2010相同风格的操作界面 gt gt 命令提示符表示MATLAB处于准备状态 xff1a 续行符 MATLAB的搜索路径 gt gt clear 清除工作区的全部变量
  • SVN的日常使用

    1 已经加入ignore的文件夹 xff0c 解除方法 xff1a 直接到被ignore的位置 xff0c 执行 xff1a svn add lt 你被ignore的文件名 gt no ignore no ignore是取消忽略 如果是ad
  • RM遥控器接收程序的分析

    由遥控器接收分析串口与DMA RM的遥控器在使用的过程中在大体上可以分成两个部分 xff1a 信息的接收 与 信息的解析 xff0c 在信息的接收中主要用到了串口的空闲中断和DMA双缓冲区接收在本篇的信息接收部分主要根据RM官方给出的代码来
  • robomaster麦轮运动解算

    1 资源与代码 1 1 参考文章 本文主要参考的三篇文章如下 xff1a 麦轮运动特性分析 xff1a https mp weixin qq com s biz 61 MzI3MTIyMjQwNQ 61 61 amp mid 61 2247
  • FreeRTOS内核——任务与任务切换

    2 任务 相关函数 1 xTaskCreateStatic 2 prvInitialiseNewTask 3 prvInitialiseTaskLists 4 vTaskStartScheduler 5 xPortStartSchedule
  • FreeRTOS应用——任务

    12 任务 12 1 相关函数 12 1 1 任务创建函数与启动调度 12 1 1 1 xTaskCreateStatic 静态创建任务 if configSUPPORT STATIC ALLOCATION 61 61 1 TaskHand
  • FreeRTOS应用——消息队列

    13 消息队列 消息队列是一种常用于任务键通信的数据结构 xff0c 队列可以在任务与任务间 中断与任务间传递信息 xff0c 实现了任务接收来自其他任务或者中断的不定长数据 任务能从队列中读取信息 xff0c 当队列中的消息为空时 xff
  • RoboMaster电机驱动

    1 硬件 1 1 电机 RM有很多不同型号的电机 xff0c 不同型号的电机有它不同的用途 xff0c 但是以用途分类的话主要是分成两种电机 xff1a 用来精准控制位置的电机 xff0c 在RM中的主要是云台电机 RM官网上的云台电机只有
  • 数据结构——校园导游系统

    校园导游系统 1 要求 大二下学期修了数据结构这门课 xff0c 课设的要求是做一个校园导航系统 详细的要求如下 问题描述 xff1a 当我们参观校园时 xff0c 会遇到如下问题 xff1a 从当前所处位置去校园另外一个位置 xff0c

随机推荐

  • 平衡小车实现

    平衡小车 1 前期准备 1 1 I2C通讯协议 在与MPU6050进行数据的读取时需要用到I2C通讯协议来进行通信 物理层 IIC一共有只有两个总线 xff1a 一条是双向的串行数据线SDA xff0c 一条是串行时钟线SCL SDA Se
  • 关于STM32CubeMX生成不了Keil代码的解决办法

    关于STM32CubeMX生成Keil代码时弹出but MDK ARM project generation have a problem的问题 有两种可能 xff1a 1 输出路径或文件名包含中文 2 Java环境版本不匹配 下载 xff
  • 2020电赛D题绕组飞行器

    在准备电赛的过程中 xff0c 做了一下去年的题 xff0c 本文将介绍我的方案及部分代码 xff0c 希望可以帮助到大家 一 我的装备 由于初学飞控所以主控用的是匿名的拓空者 xff0c 还有匿名的光流传感器 xff0c 北醒的激光雷达
  • nuxtjs常见问题

    1 在服务器端部署 xff0c 需要再服务器端安装node modules 2 本地忽略 nuxt文件夹 xff0c 这个需要在服务器端上执行npm run build生成 xff0c 然后执行 pm2 start npm name 34
  • Ubuntu学习笔记:sudo:vim:command not found

    Ubuntu学习笔记 xff1a sudo xff1a vim xff1a command not found 完成 xff01
  • Ubuntu学习笔记:查看所有用户

    Ubuntu学习笔记 xff1a 查看所有用户 输入 cat etc passwd cut f 1 d 注意 xff01 结尾有一个 xff1a 效果如下 xff1a
  • Ubuntu学习笔记:cd命令

    Ubuntu学习笔记 xff1a cd命令 命令顺序 xff1a 创建一个名为aaa的文件夹 进入指定文件夹 返回上一级文件夹 进入指定文件夹 返回上一级文件夹 退回上一次操作的文件夹 显示上一次操作的文件夹所在的路径 退回多级文件夹 退回
  • Ubuntu学习笔记:swapon 失败:设备或资源忙

    swapon 失败 xff1a 设备或资源忙 用命令swapoff xff0f 交换分区 将交换分区停止 然后再用swapon命令重新加载即可
  • Ubuntu学习笔记:使用命令查看当前登录系统的用户信息

    Ubuntu学习笔记 xff1a 使用命令查看当前登录系统的用户信息 1 查看当前登录的用户名 2 查看当前登录的用户名 终端类型 时间 IP地址 3 服务器连接的所有用户及正在使用的进程 4 显示系统中有哪些使用者正在上面 xff0c 显
  • Ubuntu学习笔记:使用命令查看系统资源,内存使用情况

    Ubuntu学习笔记 xff1a 使用命令查看系统资源 xff0c 内存使用情况 方法1 打开资源管理器 资源 gnome system monitor 方法2 top命令 方法3 下载htop apt get install htop h
  • Ubuntu学习笔记:使用命令修改 root 用户的密码

    Ubuntu学习笔记 xff1a 使用命令修改 root 用户的密码 Ubuntu 每次开机都有一个随机的新的 root 密码 在不知道密码的情况下 xff0c 要重新修改root密码 方法 xff1a sudo passwd 输入用户登录
  • C语言的特点

    1 语言简洁 紧凑 xff0c 使用方便 灵活 xff1b 2 运算符丰富 xff1b 3 数据类型丰富 xff1b 4 具有结构化的控制语句 xff08 例如if else语句 while语句 do while语句 switch语句和fo
  • Win11 更新绕过TPM2.0 方法 最新最简单 亲测有效 Win11系统更新 DEV方式

    最新的win11内测把不符合硬件规定的人都排除出去了 xff0c 虽然有注册表导入可以挤到DEV通道 xff0c 不过在更新到8 会弹出显示设备不支持提示 xff0c 关闭窗口后升级被取消 因此特在实践后教大家如何绕过TPM2 0 更新的方
  • iview常见问题

    1 radio组 label如果为字符串可以默认选中 xff0c 如果为数字 xff0c 却没有反应 答 xff1a label为数字时 xff0c 需要在label前加 xff1a 来绑定 xff0c 这样就可以实现默认选中了
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • 【通信协议】单总线协议详解——以DHT11为例

    单总线概述 1 单总线的介绍 xff08 1 xff09 单总线也称为1 Wire bus xff0c 它是由美国DALLAS xff08 达尔斯 xff09 公司推出的外围串行扩展总线 单总线系统中配置的各种器件 xff0c 由DALLA
  • 【STM32学习笔记】(4)—— STM32工程文件详解

    STM32工程文件构成 从下图可以看出我们的工程目录是由CORE OBJ STM32F10x FWLib USER SYSTEM以及HARDWARE文件夹组成的 此外还有一个文本文档README TXT 以及一个Windows 批处理文件
  • 【STM32学习笔记】(6)—— 跑马灯实验详解

    跑马灯实验 在前面五篇STM32学习笔记中 xff0c 我们已经初步认识了STM32芯片 xff0c 并且了解STM32的常用寄存器 xff0c 介绍了STM32的GPIO模式 xff0c STM32工程文件 xff0c 以及最终讲解了如何
  • 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1 1 xff08 精英板 库函数版本 xff09 xff0c 文章中大部分知识都是从两本书中提取出来 xff0c 串口通信协议的知识主要参考野火的书籍 xff
  • 【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

    NVIC xff08 嵌套向量中断控制器 xff09 简介 在讲如何配置中断优先级之前 xff0c 我们需要先了解下 NVIC NVIC 是嵌套向量中断控制器 xff0c 控制着整个STM32芯片中断相关的功能 xff0c 它跟Cortex