STM32中断详解

STM32中断详解

  • NVIC 中断系统
    • 中断向量表
    • 相关寄存器
    • 中断优先级
    • 中断配置
  • 外部中断实验
    • EXTI框图
    • 外部中断/事件线映射
    • 中断步骤初始化
      • 代码实现
  • 定时器中断
    • 通用定时器
    • 相关功能
      • 标号1:时钟源
      • 标号 2:控制器
      • 标号 3:时基单元
    • 代码实现

NVIC 中断系统

STM32F10x 芯片有 84 个中断通道,包括 16 个内核中断和 68 个可屏蔽中断, 对于STM32F103系列芯片只有60个可屏蔽中断,在 STM32F107 系列才有 68 个。

中断向量表

分为系统中断和用户中断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关寄存器

typedef struct
{__IO uint32_t ISER[8]; //中断使能寄存器uint32_t RESERVED0[24];__IO uint32_t ICER[8]; //中断清除寄存器uint32_t RSERVED1[24];__IO uint32_t ISPR[8]; //中断使能悬起寄存器uint32_t RESERVED2[24];__IO uint32_t ICPR[8]; //中断清除悬起寄存器uint32_t RESERVED3[24];__IO uint32_t IABR[8]; //中断有效位寄存器uint32_t RESERVED4[56];__IO uint8_t IP[240]; //中断优先级寄存器uint32_t RESERVED5[644];__O uint32_t STIR; //软件触发中断寄存器
} NVIC_Type;

在配置中断时,我们通常使用的只有 ISER、 ICER 和 IP 这三个寄存器:ISER 是中断使能寄存器,ICER 是中断清除寄存器,IP 是中断优先级寄存器。

中断优先级

但是 STM32F103 中只使用 4 位,高 4 位有效), 用于表达优先级的高 4 位又被分组成抢占式优先级和响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
高抢占式优先级的中断事件会打断当前的主程序或者中断程序运行,俗称中断嵌套。
在这里插入图片描述

第 0 组:所有 4 位用于指定响应优先级
第 1 组:最高 1 位用于指定抢占式优先级,最低 3 位用于指定响应优先级
第 2 组:最高 2 位用于指定抢占式优先级,最低 2 位用于指定响应优先级
第 3 组:最高 3 位用于指定抢占式优先级,最低 1 位用于指定响应优先级
第 4 组:所有 4 位用于指定抢占式优先级 设置优先级分组可调用库函数

NVIC_SetPriorityGrouping()实现,有关 NVIC 中断相关的库函数都在库文件misc.c misc.h 中,所以当使用到中断时,一定要记得把 misc.c 和 misc.h 添加到工程组中。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
/* Check the parameters */assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

NVIC_PriorityGroupConfig 函数带一个形参用于中断优先级分组,该值范围 可以是 NVIC_PriorityGroup_0-NVIC_PriorityGroup_4,
在这里插入图片描述

中断配置

(1)使能外设中断,这个具体是由外设相关中断使能位来控制,比如定时器有溢出中断,这个可由定时器的控制寄存器中相应中断使能位来控制。
(2)设置中断优先级分组,初始化 NVIC_InitTypeDef 结构体,设置抢占优先级和响应优先级,使能中断请求。 NVIC_InitTypeDef

typedef struct
{uint8_t NVIC_IRQChannel; //中断源uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级uint8_t NVIC_IRQChannelSubPriority; //响应优先级FunctionalState NVIC_IRQChannelCmd; //中断使能或失能
} NVIC_InitTypeDef;
  • 中断源放在 stm32f10x.h 文件的 IRQn_Type 结构体内,自己去查看

  • NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。

  • NVIC_IRQChannelSubPriority:响应优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。

  • NVIC_IRQChannelCmd:中断使能/失能设置,使能配置为 ENABLE,失能配置为 DISABLE。

外部中断实验

EXTI框图

在这里插入图片描述

外部中断/事件线映射

在这里插入图片描述

中断步骤初始化

  • 使能 IO 口时钟,配置 IO 口模式为输入
    由于本章使用开发板上 4 个按键 IO 口作为外部中断输入线,因此需要使能对应的 IO 口时钟及配置 IO 口模式。

  • 开启 AFIO 时钟,设置 IO 口与中断线的映射关系
    接下来我们需要将 GPIO 映射到对应的中断线上,只要使用到外部中断,就 必须先使能 AFIO 时钟,前面已经说了它是挂接在 APB2 总线上的,所以使能 AFIO 时钟库函数为:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    然后,我们就可以把 GPIO 映射到对应的中断线上,配置 GPIO 与中断线映射 的库函数如下:
    void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
    比如我们将中断线 15 映射到 GPIOA 端口,那么就需要如下配置:
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);

  • 配置中断分组(NVIC),使能中断
    NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//EXTI15 中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器

  • 初始化 EXTI,选择触发方式 配置好 NVIC 后,我们还需要对中断线上的中断初始化,EXTI 初始化库函数 如下:
    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
    函数形参是有一个结构体 EXTI_InitTypeDef 类型的指针变量, EXTI_InitTypeDef 结构体成员变量如下

typedef struct 
{ 
uint32_t EXTI_Line; //中断/事件线 
EXTIMode_TypeDef EXTI_Mode; //EXTI 模式 
EXTITrigger_TypeDef EXTI_Trigger; //EXTI 触发方式 
FunctionalState EXTI_LineCmd; //中断线使能或失能 
}EXTI_InitTypeDef; 
  • – EXTI_Line:EXTI 中断/事件线选择,可配置参数为 EXTI0-EXTI20,可参考上表。
  • – EXTI_Mode:EXTI 模式选择,可以配置为中断模式 EXTI_Mode_Interrupt 和 事件模式 EXTI_Mode_Event。
  • – EXTI_Trigger:触发方式选择,可以配置为上升沿触发 EXTI_Trigger_Rising、下降沿触发 EXTI_Trigger_Falling、上升沿和下降沿触 发 EXTI_Trigger_Rising_Falling。
  • – EXTI_LineCmd:中断线使能或者失能,配置 ENABLE 为使能,DISABLE 为失 能,我们这里要使用外部中断,所以需使能。
  • 编写 EXTI 中断服务函数
  • 所有中断函数都在 STM32F1 启动文件中,不知道中断函数名的可以打开启动 文件查找。这里我们使用到的是外部中断,其函数名如下:
  • EXTI0_IRQHandler
    EXTI1_IRQHandler
    EXTI2_IRQHandler
    EXTI3_IRQHandler
    EXTI4_IRQHandler
    EXTI9_5_IRQHandler
    EXTI15_10_IRQHandler

获取中断标志EXTI_ClearITPendingBit(EXTI_Line12);
最后需要清除标志位EXTI_ClearITPendingBit(EXTI_Line12);

代码实现

功能:独立通过外部中断方式实现KEY1改变LED1的状态,key2改变led2…

myEXTI.h

#ifndef __MYEXTI_H__
#define __MYEXTI_H__#include "public.h"void My_EXTI_Init(void);#endif

myEXTI.c

#include "myEXTI.h"void My_EXTI_Init(void)
{// 开启外部中断时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 将GPIOA上的12到15映射到外部中断线上GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource14);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);// EXTI模块初始化EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15; // 外部中断线EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;									  // 中断还是事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;								  // 触发方式上升还是下降沿 这里是下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;											  // 使能外部中断线EXTI_Init(&EXTI_InitStructure);														  // 根据指定的参数初始化 EXTI 寄存器// NVIC模块初始化NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;	  // EXTI 中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级 2个NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		  // 响应优先级 3个NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  // IRQ 通道使能NVIC_Init(&NVIC_InitStructure);							  // 根据指定的参数初始化 VIC 寄存器
}

main.c

// 功能:独立按键用外部中断方式实现KEY1改变LED1的状态,K2,K3,K4类似#include "myEXTI.h"
#include "key.h"
#include "led.h"int main()
{SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 分 2 组LED_Init();Key_Init();My_EXTI_Init();while (1) // 保持应用程序不退出{}
}void EXTI15_10_IRQHandler(void) //中断事件函数
{if (EXTI_GetITStatus(EXTI_Line12) == SET) // K4 引脚对应的中断函数状态 RESET代表0  SET代表1  代表是这个中断函数触发了{LED4 = !LED4;}if (EXTI_GetITStatus(EXTI_Line13) == SET) // K3{LED3 = !LED3;}if (EXTI_GetITStatus(EXTI_Line14) == SET) // K2{LED2 = !LED2;}if (EXTI_GetITStatus(EXTI_Line15) == SET) // K1{LED1 = !LED1;}EXTI_ClearITPendingBit(EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15); // 清除外部中断线上的中断标志
}

定时器中断

STM32F1 的通用定时器包含一个 16 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F1 的通用定时器可用于多种用途,包括测 量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出比较和 PWM)等。
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

基本定时器的功能最为简单,类似于 51 单片机内定时器。
通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。
高级定时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面。

通用定时器

  • (1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
  • (2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的 分频系数为 1~65535 之间的任意数值。
  • (3)4 个独立通道(TIMx_CH1-4),这些通道可以用来作为:

A.输入捕获
B.输出比较
C. PWM 生成(边缘或中间对齐模式)
D.单脉冲模式输出

  • (4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连 (可以用 1 个定时器控制另外一个定时器)的同步电路。
  • (5)发生如下事件时产生中断/DMA 请求:

A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/ 外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较

  • (6)支持针对定位的增量(正交)编码器和霍尔传感器电路
  • (7)触发输入作为外部时钟或者按周期的电流管理
    在这里插入图片描述
    在这里插入图片描述

相关功能

标号1:时钟源

①内部时钟(CK_INT)
②外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)
③外部时钟模式 2:外部触发输入 ETR
④内部触发输入(ITRx(x=0,1,2,3))

通常我们都是将内部时钟(CK_INT)作为通用定时器的时钟来源,而且通用 定时器的时钟是 APB1 时钟的 2 倍,即 APB1 的时钟分频数不为 1。所以通用定时器的时钟频率是 72MHz

标号 2:控制器

通用定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触 发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。
从模式控制器可以控制计数器复位、启动、递增/递减、计数。 编码器接口专门针对编码器计数而设计。

标号 3:时基单元

通用定时器时基单元包括 3 个寄存器,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。

通用定时器这三个寄存器都是 16 位有效。而高级定时器的 TIMx_RCR 寄存器是 8 位有效。 在这个时基单元中,有个预分频器寄存器(TIMx_PSC),用于对计数器时钟频 率进行分频,通过寄存器内的相应位设置,分频系数值可在 1 到 65536 之间

通用定时器计数方式有向上 计数、向下计数、向上向下计数(中心对齐计数)

代码实现

功能:使用通用定时器产生500ms的中断来对LED1进行闪烁

MYTIME.h

#ifndef __MYTIME_H
#define __MYTIME_H#include "public.h"// TIMx只能是TIM2,TIM3,TIM4, u16psc 表示时基分频系数,u16per表示时基周期
void MY_TIME_Init(TIM_TypeDef *TIMx, u16 u16psc, u16 u16per);#endif /* __MYTIME_H */

MYTIME.C

#include "myTIME.h"
// TIMx只能是TIM2,TIM3,TIM4, u16psc 表示时基分频系数,u16per表示时基周期void MY_TIME_Init(TIM_TypeDef *TIMx, u16 u16psc, u16 u16per)
{NVIC_InitTypeDef NVIC_InitStructure;// 时钟使能if (TIMx == TIM2){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  // 时钟使能NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 选择中断向量}if (TIMx == TIM3){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  // 时钟使能NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 选择中断向量}if (TIMx == TIM4){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  // 时钟使能NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; // 选择中断向量}TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;              // 定义定时器结构体TIM_TimeBaseStructure.TIM_Prescaler = u16psc;               // 时基分频系数TIM_TimeBaseStructure.TIM_Period = u16per;                  // 时基周期TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     // 时钟分频系数TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);             // 初始化定时器TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); // 使能更新中断// NVIC模块初始化NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIMx, ENABLE); // 使能定时器
}

main.c

// 功能:使用通用定时器产生500ms的中断来对LED1进行闪烁#include "myTIME.h"
#include "led.h"int main()
{SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 分 2 组LED_Init();MY_TIME_Init(TIM2, 36000 - 1, 1000); // 500mswhile (1) // 保持应用程序不退出{}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){LED2 = !LED2;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){LED3 = !LED3;TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}void TIM4_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){LED4 = !LED4;TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】200、岛屿数量

【LeetCode】200、岛屿数量 文章目录 一、并查集1.1 并查集1.2 多语言解法 二、洪水填充 DFS2.1 洪水填充 DFS 一、并查集 1.1 并查集 // go var sets int var father [90000]intfunc numIslands(grid [][]byte) int {n, m : len(grid), len(grid[0])build(grid, n, m)for i …

SOME/IP 协议详解——序列化

文章目录 0. 概述1.基本数据序列化2.字符串序列化2.1 字符串通用规则2.2 固定长度字符串规则2.3 动态长度字符串规则 3.结构体序列化4. 带有标识符和可选成员的结构化数据类型5. 数组5.1 固定长度数组5.2 动态长度数组5.3 Enumeration(枚举)5.4 Bitfield…

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更,Google 引入了更严格的 PendingIntent 安全管理,强制要求开发者明确指定 PendingIntent 的可变性(Mutable)或不可变性(Immutable)。 但是&#xf…

C之(14)gcov覆盖率

C之(14)gcov覆盖率 Author: Once Day Date: 2024年12月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: C语言_Once-Day的博客-CSDN博客 前些天…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…

Paperlib(论文管理工具)

Paperlib 是一个简单好用的论文管理工具。软件接入各学科数据库用于匹配论文元数据,逐步为每一个学科(例如计算机科学,物理学等)定制化数据库组合提高检索精度。尤其是精准的会议论文元数据检索能力。还可以管理你的论文&#xff…

c# 2024/12/27 周五

6《详解类型、变量与对象》36 详解类型、变量与对象 _1_哔哩哔哩_bilibili

Formality:匹配(match)是如何进行的?

相关阅读Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 匹配点、对比点和逻辑锥 匹配指的是Formality工具尝试将参考设计中的每个匹配点与实现设计中的相应匹配点进行配对,这里的匹配点包括对比点(Compare Point…

分布式算法(五):初识ZAB协议

文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示: 驱动包 JDBC 的操作流程: 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…

tensorboard的界面参数与图像数据分析讲解

目录 1.基础概念: (a)精确率与召回率: (b)mAP: (c)边界框损失: (d)目标损失: (e)分类损失: (f):学习率: 2.设置部分(最右边部分): GENERAL(常规设置…

《计算机网络A》单选题-复习题库解析-2

目录 51、下列关于以太网网卡地址特点的说法中,不正确的是( )。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时,那么在服务返回的响应包中,所使用的源端口是( &#xff0…

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…

高等数学学习笔记 ☞ 无穷小与无穷大

1. 无穷小 1. 定义:若函数当或时的极限为零,那么称函数是当或时的无穷小。 备注: ①:无穷小描述的是自变量的变化过程中,函数值的变化趋势,绝不能认为无穷小是一个很小很小的数。 ②:说无穷小时…

KMP 2024 年总结,Kotlin 崛起的一年

2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…

【SpringBoot教程】搭建SpringBoot项目之编写pom.xml

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 👏今天毛毛张分享的内容主要是Maven 中 pom 文件🆕,涵盖基本概念、标签属性、配置等内容 文章目录 1.前言🥭2.项目基本…

【Java 学习】详讲代码块:控制流语句代码块、方法代码块、实例代码块(构造代码块)、静态代码块、同步代码块

💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持&#x…

【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践

一、前言 随着企业业务的快速发展和数据量的不断增长,高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库,以其高扩展性、高可用性和高性能的特点,逐渐受到企业的广泛关注。然而,在复杂的分布式…

【工具】—— SpringBoot3.x整合swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。Swagger简单说就是可以帮助生成接口说明文档,操作比较简单添加注解说明,可以自动生成格式化的文档。 项目环境 jdk17SpringBoot 3.4.0Sp…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…