当前位置: 首页 > news >正文

STM32 CAN协议讲解以及代码

STM32 CAN

文章目录

  • STM32 CAN
  • 前言
  • 一、CAN外设
    • 1.主控制寄存器CAN_MCR
    • 2.位时序寄存器CAN_BTR
    • 3.CAN的发送邮箱
    • 4.CAN的接收FIFO
    • 5.验收筛选器
  • 二、代码配置
    • 1.初始化
    • 2.发送数据
    • 3.接收数据
    • 4.main.c


前言

前面学习了CAN的一些理论知识,他在我们的STM32里面是怎么用的呢
前面讲了一些can的知识,在STM32里是什么样的呢

一、CAN外设

1.主控制寄存器CAN_MCR

DBF调试冻结:处于程序调试模式才使用。可以设置CAN处于工作模式还是禁止收发状态,禁止收发时仍可以访问接受FIFO中的数据。
TTCM时间触发模式:设置CAN的时间触发通信模式。在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR,CAN_TDTxR寄存器中。可以利用它实现标准分时同步通信功能。
ABOM自动离线管理:当节点检测到他发送错误或者接受错误超过一定值时,会自动离线管理。离线状态下,不能接收或者发送。
AWUM自动唤醒:在使用软件进入睡眠后,如果使用自动唤醒,在检测到总线活动时,会自动唤醒。
NART自动重传:当报文发送失败会自动重传直到成功为止。
RFLM锁定模式:锁定接收FIFO。锁定之后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则会覆盖掉之前的报文。
TXFP报文发送优先级的判定方法:当邮箱中有多个报文需要发送时,控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

2.位时序寄存器CAN_BTR

SILM:为0,正常模式;为1,静默模式
LBKM:为1,允许回环模式;为0,禁止回环模式
CAN有四种工作模式。由位时序寄存器的SILM和LBKM组合控制。
在这里插入图片描述
• 正常模式
正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。
• 静默模式
静默模式下,它自己的输出端的逻辑 0 数据会直接传输到它自己的输入端,逻辑 1 可以被发送到总线,所以它不能向总线发送显性位 (逻辑 0),只能发送隐性位 (逻辑 1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。
• 回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。
• 回环静默模式
回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。

在STM32中的位时序:
SYNC_SEG,BS1,BS2三段,采样点位于BS1和BS2交界处。SYNC_SEG的固定长度是1Tq.BS1和BS2的长度SJW可以在位时序寄存器中配置。
波特率:
STM32的CAN1和CAN2挂载在APB1上。APB1总线的最大频率是36MHz。在使用CAN2时,必须打开CAN1的时钟。

波特率设置
在这里插入图片描述
举两个例子
500bps

CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN,波特率500Kbps    

这个是怎么计算的呢,根据前面提到4分频 4/36M *(1+8+9)=500Kbps
那么1M应该怎么配置呢

CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_5tq,CAN_BS1_3tq,4,CAN_Mode_LoopBack);//CAN 1Mbps

4/36*(1+5+3)=1M

3.CAN的发送邮箱

CAN外设有三个发送邮箱,即最多可以缓存3个待发送报文。 每个发送邮箱中包含有四个寄存器。

标识符寄存器CAN_TIxR(存储待发送报文的ID,扩展ID,IDE位及RTR位)
数据长度控制寄存器CAN_TDTxR(存储待发送报文的DLC段)
低位数据寄存器CAN_TDLxR(存储数据段的低四个字节内容)
高位数据寄存器CAN_TDHxR(存储高四字节的内容)
发送邮箱的工作过程:当需要发送报文时,把报文分解成各个段存储到不同的寄存器中,并对标识符寄存器的发送请求位置1,即可把数据发送出去。

4.CAN的接收FIFO

CAN外设有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收报文。当接收到报文时,FIFO报文计数器会自增,当报文被读取之后,计数器会自减。和发送邮箱类似,FIFO有四个寄存器。
标识符寄存器CAN_RIxR(存储接收报文的ID,扩展ID,IDE位及RTR位)
数据长度控制寄存器CAN_RDTxR(存储接收报文的DLC段)
低位数据寄存器CAN_RDLxR(存储数据段的低四个字节内容)
高位数据寄存器CAN_RDHxR(存储高四字节的内容)

5.验收筛选器

STM32F103的CAN外设有14个筛选器组,每组有两个寄存器。CAN1和CAN2共用筛选器。筛选器的作用下,节点只接受需要的报文到自己的FIFO中。筛选器可以调整筛选ID的长度和过滤模式

(1)根据筛选ID长度分类:

32位:STDID[10:0],EXTID[17:0],IDE,RTR
16位:STDID[10:0],EXTID[17:15],IDE,RTR
(2)根据过滤方式分为:

标识符列表模式:要求报文与列表中的ID的每一个标识符相同才接收。
掩码模式:只要报文ID中规定的某些位相同,就会被接收。
筛选尺度寄存器CAN_FS1R的FSCx位可以设置工作在32位还是16位;筛选模式寄存器CAN_FM1R的FBMx位可以设置工作在标识符列表模式还是掩码模式。每组筛选器有2个32位寄存器,分别为CAN_FxR1,CAN_FxR2,用来存储要筛选的ID或者掩码。
在这里插入图片描述

二、代码配置

1.初始化

备注比正点的例程或者野火的都要详细

/**
* @brief CAN 初始化
* @param tsjw : 重新同步跳跃时间单元.范围: 1~3;
* @param tbs2 : 时间段 2 的时间单元.范围: 1~8;
* @param tbs1 : 时间段 1 的时间单元.范围: 1~16;
* @param brp : 波特率分频器.范围: 1~1024;
* @note 以上 4 个参数, 在函数内部会减 1, 所以, 任何一个参数都不能等于 0
* CAN 挂在 APB1 上面, 其输入时钟频率为 Fpclk1 = PCLK1 = 36Mhz
* tq = brp * tpclk1;
* 波特率 = Fpclk1 / ((tbs1 + tbs2 + 1) * brp);
* 我们设置 can_init(1, 8, 9, 4, 1), 则 CAN 波特率为:
* 36M / ((8 + 9 + 1) * 4) = 500Kbps
* @param mode : CAN_MODE_NORMAL, 普通模式;CAN_MODE_LOOPBACK,回环模式;
* @retval 0, 初始化成功; 其他, 初始化失败;
* */
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE NVIC_InitTypeDef  NVIC_InitStructure;
#endifRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟	                   											 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽GPIO_Init(GPIOA, &GPIO_InitStructure);		//初始化IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE;//非时间触发通信模式  //CAN_InitStructure.CAN_ABOM=DISABLE;//软件自动离线管理	 //CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//CAN_InitStructure.CAN_NART=ENABLE;//禁止报文自动传送 //CAN_InitStructure.CAN_RFLM=DISABLE;	//报文不锁定,新的覆盖旧的 // CAN_InitStructure.CAN_TXFP=DISABLE;	//优先级由报文标识符决定 //CAN_InitStructure.CAN_Mode= mode;//模式设置: mode:0,普通模式;1,回环模式; ////设置波特率CAN_InitStructure.CAN_SJW=tsjw;	//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~	CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;  //分频系数CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1 CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;设置过滤器的标识符高位32位IDCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//设置过滤器的标识符低位CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//设置过滤器的掩码高位32位MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//设置过滤器的掩码低位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0表示匹配的数据帧将进入FIFO0缓冲区。CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
#if CAN_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.		    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endifreturn 0;
}   

CAN_FilterMode_IdMask宏指定过滤模式为标识符/掩码模式。在这种模式下,过滤器将使用标识符和掩码来匹配数据帧。标识符是数据帧的标识符,而掩码用于指定哪些位需要匹配。如果标识符和掩码的匹配条件满足,数据帧就会被允许通过过滤器。

CAN_FilterMode_IdList宏指定过滤模式为标识符列表模式。在这种模式下,过滤器将使用一个预定义的标识符列表来匹配数据帧。如果数据帧的标识符与列表中的任何一个匹配,数据帧就会被允许通过过滤器。

2.发送数据

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)	
//len:数据长度(最大为8)				     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//		 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{	u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;					 // 标准标识符 TxMessage.ExtId=0x12;				   // 设置扩展标示符 TxMessage.IDE=CAN_Id_Standard; // 标准帧TxMessage.RTR=CAN_RTR_Data;		 // 数据帧TxMessage.DLC=len;						// 要发送的数据长度for(i=0;i<len;i++)TxMessage.Data[i]=msg[i];			          mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;	//等待发送结束if(i>=0XFFF)return 1;return 0;		}

首先定义了一个CanTxMsg类型的变量TxMessage,用于存储要发送的数据帧的相关信息,包括标识符、帧类型、数据长度和数据内容等。
然后根据输入参数msg和len,将要发送的数据存储到TxMessage.Data数组中。
调用CAN_Transmit函数发送数据帧,并返回发送邮箱(mbox)的编号。
等待发送结束,直到CAN_TransmitStatus返回CAN_TxStatus_Failed或者经过一定的时间限制,才退出等待循环。
如果发送成功,则返回0,否则返回1。
在这里插入图片描述

3.接收数据

//can口接收数据查询
//buf:数据缓存区;	 
//返回值:0,无数据被收到;
//		 其他,接收的数据长度;
u8 Can_Receive_Msg(u8 *buf)
{		   		   u32 i;CanRxMsg RxMessage;if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;		//没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据	for(i=0;i<8;i++)buf[i]=RxMessage.Data[i];  return RxMessage.DLC;	
}

首先定义了一个CanRxMsg类型的变量RxMessage,用于存储接收到的数据帧的相关信息,包括标识符、帧类型、数据长度和数据内容等。
使用CAN_MessagePending函数检查CAN1的FIFO0中是否有待接收的数据帧。如果没有数据帧待接收,则直接退出函数并返回0。
调用CAN_Receive函数从CAN1的FIFO0中读取接收到的数据帧,并将其存储到RxMessage变量中。
将接收到的数据存储到输入参数buf指向的缓冲区中。
返回接收到的数据帧的数据长度RxMessage.DLC。
在这里插入图片描述

4.main.c

  CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN初始化环回模式,波特率500Kbps    while(1){key=KEY_Scan(0);if(key==KEY0_PRES)//KEY0按下,发送一次数据{for(i=0;i<8;i++){canbuf[i]=i;//填充发送缓冲区printf("发送%d\r\n",canbuf[i]);}res=Can_Send_Msg(canbuf,8);//发送8个字节 if(res)printf("发送失败\r\n");		//提示发送失败else printf("发送\r\n");		 		//提示发送成功								   }else if(key==WKUP_PRES)//WK_UP按下,改变CAN的工作模式{	   mode=!mode;CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN普通模式初始化, 波特率500Kbps if(mode==0)//普通模式,需要2个开发板{printf("正常模式\r\n");}else //回环模式,一个开发板就可以测试了.{printf("回环模式\r\n");}}		 key=Can_Receive_Msg(canbuf);if(key)//接收到有数据{			for(i=0;i<key;i++){									    printf("接收到%d\r\n",canbuf[i]);}}t++; delay_ms(10);if(t==20){LED0=!LED0;//提示系统正在运行	t=0;}		   }
}

初始化CAN模式为回环模式,波特率为500Kbps。
进入循环,不断检测按键状态。
如果KEY0按键按下,将canbuf数组填充为0-7的连续数值,并调用Can_Send_Msg函数发送8个字节的数据帧。如果发送失败,打印"发送失败";如果发送成功,打印"发送"。
如果WK_UP按键按下,切换CAN的工作模式。如果当前为普通模式,将其切换为回环模式,并打印"回环模式";如果当前为回环模式,将其切换为普通模式,并打印"正常模式"。
调用Can_Receive_Msg函数接收数据帧,并将接收到的数据打印出来。
按下KEY0之后
在这里插入图片描述

相关文章:

STM32 CAN协议讲解以及代码

STM32 CAN 文章目录 STM32 CAN前言一、CAN外设1.主控制寄存器CAN_MCR2.位时序寄存器CAN_BTR3.CAN的发送邮箱4.CAN的接收FIFO5.验收筛选器 二、代码配置1.初始化2.发送数据3.接收数据4.main.c 前言 前面学习了CAN的一些理论知识&#xff0c;他在我们的STM32里面是怎么用的呢 前…...

京东数据分析(京东大数据):2023年10月京东手机行业品牌销售排行榜

鲸参谋监测的京东平台10月份手机市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年10月份&#xff0c;京东平台手机行业的销量约340万&#xff0c;环比增长约11%&#xff0c;同比则下滑约2%&#xff1b;销售额为108亿&#xff0c;环比增长约17%&#x…...

计算机毕业设计 基于Hadoop的物品租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

pop链反序列化 [MRCTF2020]Ezpop1

打开题目 网站源码为 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected …...

yolov5从英伟达平台移植到华为昇腾开发板上的思路

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近需要将yolov5代码从英伟达平台移植到华为昇腾开发板上。搜了一些代码和资料&#xff0c;大致明白了二者的差别。 1.二者使用的模型文件不一样 yolov…...

网络运维与网络安全 学习笔记2023.11.25

网络运维与网络安全 学习笔记 第二十六天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全&#xff0c;要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…...

Trustzone/TEE/安全 面试100问

关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资…...

【数据结构】D : 图的顶点可达闭包

D : 图的顶点可达闭包 Description 给定有向图的邻接矩阵A&#xff0c;其元素定义为&#xff1a;若存在顶点i到顶点j的有向边则A[i,j]1&#xff0c;若没有有向边则A[i,j] 0。试求A的可达闭包矩阵A*&#xff0c;其元素定义为&#xff1a;若存在顶点i到顶点j的有向路径则A*[i,j…...

链表?细!详细知识点总结!

链表 定义&#xff1a;链表是一种递归的数据结构&#xff0c;它或者为空&#xff08;null)&#xff0c;或者是指向一个结点&#xff08;node&#xff09;的引用&#xff0c;该结点含有一个泛型的元素和一个指向另一条链表的引用。 ​ 其实链表就是有序的列表&#xff0c;它在内…...

【数据结构实验】排序(三)快速排序算法的改进(三者取中法)

文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法&#xff0c;其核心思想是通过选择一个基准元…...

【数据结构/C++】栈和队列_顺序栈

#include<iostream> using namespace std; #define MaxSize 10 // 1. 顺序栈 typedef int ElemType; struct Stack {ElemType data[MaxSize];int top; } SqStack; // 初始化栈 void init(Stack &s) {// 初始化栈顶指针s.top -1; } // 入栈 bool push(Stack &s, …...

【数据结构实验】图(一)Warshall算法(求解有向图的可达矩阵)

文章目录 1. 引言2. Warshall算法原理2.0 图的基础知识a. 类型b. 表示 2.1 初始化可及矩阵2.2 迭代更新可及矩阵 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 Warshall算法是一种用于求解…...

java协同过滤算法 springboot+vue游戏推荐系统

随着人们生活质量的不断提高以及个人电脑和网络的普及&#xff0c;人们的业余生活质量要求也在不断提高&#xff0c;选择一款好玩&#xff0c;精美&#xff0c;画面和音质&#xff0c;品质优良的休闲游戏已经成为一种流行的休闲方式。可以说在人们的日常生活中&#xff0c;除了…...

Android设计模式--适配器模式

至诚之道&#xff0c;可以前知 一&#xff0c;定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式在我们的开发中使用率极高&#xff0c;ListView&#xff0c;GridView&am…...

jQuery_06 基本过滤器的使用

什么是过滤器&#xff1f; 过滤器就是用来筛选dom对象的&#xff0c;过滤器是和选择器一起使用的。在选择了dom对象后在进行过滤筛选。 jQuery对象中存储的dom对象顺序与页面标签声明有关系。 声明顺序就是dom中存放的顺序 1.基本过滤器 使用dom对象在数组中的位置来作为过滤条…...

Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...

AI绘画“湿地公园的美女”

1、AI绘画&#xff1a;湿地公园的美女 通过输入描述&#xff1a;你需要什么场景的什么创作内容&#xff0c;AI根据内容创造出适合的主题 如图所示&#xff1a;请帮我创作一个湿地公园的像高圆圆的美女图片。 输出的结果如下&#xff1a;总体来说感觉还是非常快&#xff0c;基…...

延时任务定时发布,基于 Redis 与 DB 实现

目录 1、什么是延时任务&#xff0c;分别可以使用哪些技术实现&#xff1f; 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、取消任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据&#xff0c;同步到 Redis 中 1、什么是延时任务&#xff…...

Nacos安装使用

Nacos安装使用 官方下载地址: https://github.com/alibaba/nacos/releases 官方文档地址: https://nacos.io/zh-cn/docs/quick-start.html Nacos介绍 Nacos是阿里巴巴开源的一款支持服务注册与发现&#xff0c;配置管理以及微服务管理的组件。用来取代以前常用的注册中心&a…...

了解抽象思维的应用与实践

目录 一、快速了解抽象思维 &#xff08;一&#xff09;抽象思维的本质理解 &#xff08;二&#xff09;系统架构中的重要性 &#xff08;三&#xff09;软件开发中抽象的基本过程思考 意识和手段 抽象的方式 抽象层次的权衡 二、业务中的应用实践 &#xff08;一&…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...