STM32H7双路CAN踩坑记录

STM32H7双路CAN踩坑记录

目录

  • STM32H7双路CAN踩坑记录
    • 1 问题描述
    • 2 原因分析
    • 3 解决办法
    • 4 CAN配置参考代码

1 问题描述

STM32的CAN1和CAN2无法同时使用。
注:MCU使用的是STM32H743,其他型号不确定是否一样,本文只以STM32H743举例说明。

2 原因分析

经过测试分析,双路CAN无法同时使用与CAN的消息RAM配置有关。

在这里插入图片描述

在这里插入图片描述

其中问题就出现在上图的RAM配置,STM32H7系列的两路CAN是共用同一块RAM的,并且把这块内存空间的分配交给了用户,也没有检查内存分配是否合理的操作,这点其实挺坑的,稍不注意就掉进去了。
我之前用过STM32其他的系列,它们芯片内部就定义好了哪部分RAM给哪个CAN,是使用不允许用户自由分配的,因此就吃了这个亏。我原本两路CAN的配置基本都是一致的,其中也包括消息RAM这一点,因此,在初始化之后,先初始化的那路CAN就会被覆盖导致不能使用。

3 解决办法

CAN1的消息RAM从地址偏移0开始,而CAN2则从CAN1消息RAN结束的位置开始,这样就先保证了CAN1有足够的RAM空间使用,也保证了CAN2的RAM不会跟CAN1冲突。具体代码配置参考如下:

FDCAN2_Handler.Init.MessageRAMOffset = FDCAN1_Handler.msgRam.EndAddress - SRAMCAN_BASE;  // CAN1消息RAM的结束地址 - 消息RAM的起始地址 = CAN1实际使用的内存大小,把这个作为CAN2的内存偏移地址

注:当然,你也可以先计算一下或用串口打印一下CAN1具体使用了多少内存空间,然后在这个基础上做偏移,只要保证两路CAN有足够的内存并且内存不重叠就可以了。

4 CAN配置参考代码

/*** @brief       FDCAN初始化* @param       presc   : 分频值,取值范围1~512;* @param       tsjw    : 重新同步跳跃时间单元.范围:1~128;* @param       ntsg1   : 时间段1的时间单元.取值范围2~256;* @param       ntsg2   : 时间段2的时间单元.取值范围2~128;* @param       mode    : FDCAN_MODE_NORMAL,普通模式; FDCAN_MODE_INTERNAL_LOOPBACK,内部回环模式;FDCAN_MODE_EXTERNAL_LOOPBACK,外部回环模式;FDCAN_MODE_RESTRICTED_OPERATION,限制操作模式FDCAN_MODE_BUS_MONITORING,总线监控模式* @note        以上5个参数, 除了模式选择其余的参数在函数内部会减1, 所以, 任何一个参数都不能等于0*              FDCAN其输入时钟频率为 Fpclk1 = 20Mhz*              波特率 = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc);*              我们设置 fdcan_init(10, 8, 31, 8, 1), 则CAN波特率为:*              20M / ((31 + 8 + 1) * 10) = 500Kbps* @retval      0,  初始化成功; 其他, 初始化失败;*/
u8 FDCAN1_Mode_Init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode) 
{FDCAN_FilterTypeDef fdcan_filterconfig;HAL_FDCAN_DeInit(&FDCAN1_Handler);                              /* 先清除以前的设置 */FDCAN1_Handler.Instance = FDCAN1; FDCAN1_Handler.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* 位速率变换FDCAN模式 */FDCAN1_Handler.Init.Mode = mode;                                /* 模式设置  */FDCAN1_Handler.Init.AutoRetransmission = ENABLE;                /* 使能自动重传!传统模式下一定要关闭!!! */FDCAN1_Handler.Init.TransmitPause = ENABLE;                     /* 使能传输暂停 */FDCAN1_Handler.Init.ProtocolException = DISABLE;                /* 关闭协议异常处理 *//* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s *//* 数据段通信速率(仅FDCAN模式需配置) = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */FDCAN1_Handler.Init.DataPrescaler = 10;                         /* 数据段分频系数范围:1~32  */FDCAN1_Handler.Init.DataSyncJumpWidth = 16;                     /* 数据段重新同步跳跃宽度1~16 */FDCAN1_Handler.Init.DataTimeSeg1 = 2;                           /* 数据段dsg1范围:1~32  5 */FDCAN1_Handler.Init.DataTimeSeg2 = 1;                           /* 数据段dsg2范围:1~16  1 *//* 仲裁段通信速率(FDCAN与传统CAN均需配置) = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */FDCAN1_Handler.Init.NominalPrescaler = presc;                   /* 分频系数 */FDCAN1_Handler.Init.NominalSyncJumpWidth = tsjw;                /* 重新同步跳跃宽度 */FDCAN1_Handler.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1范围:2~256 */FDCAN1_Handler.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2范围:2~128 */FDCAN1_Handler.Init.MessageRAMOffset = 0;                       /* 信息RAM偏移(使用2路CAN时非常重要) */FDCAN1_Handler.Init.StdFiltersNbr = 28;                         /* 标准信息ID滤波器编号 */FDCAN1_Handler.Init.ExtFiltersNbr = 8;                          /* 扩展信息ID滤波器编号 */FDCAN1_Handler.Init.RxFifo0ElmtsNbr = 1;                        /* 接收FIFO0元素编号 */FDCAN1_Handler.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;       /* 接收FIFO0元素大小:最大64字节 */FDCAN1_Handler.Init.RxBuffersNbr = 0;                           /* 接收FIFO0元素编号 */FDCAN1_Handler.Init.TxEventsNbr = 0;                            /* 发送事件编号 */FDCAN1_Handler.Init.TxBuffersNbr = 0;                           /* 发送缓冲编号 */FDCAN1_Handler.Init.TxFifoQueueElmtsNbr = 1;                    /* 发送FIFO序列元素编号 */FDCAN1_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* 发送FIFO序列模式 */FDCAN1_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_64;            /* 发送大小:最大64字节 */if (HAL_FDCAN_Init(&FDCAN1_Handler) != HAL_OK) {return 1;   /* 初始化 */}/* 配置CAN过滤器 */fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* 标准ID */fdcan_filterconfig.FilterIndex = 0;                              /* 滤波器索引 */fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* 滤波器类型 */fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;       /* 过滤器0关联到FIFO0 */fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32位ID */fdcan_filterconfig.FilterID2 = 0x0000;                           /* 如果FDCAN配置为传统模式的话,这里是32位掩码 *//* 过滤器配置 */if (HAL_FDCAN_ConfigFilter(&FDCAN1_Handler, &fdcan_filterconfig) != HAL_OK) {return 2;                                                    /* 滤波器初始化 */}/* 配置全局过滤器,拒收所有不匹配的标准帧或扩展帧 */if (HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK){return 3;}/* 启动CAN外围设备 */if (HAL_FDCAN_Start(&FDCAN1_Handler) != HAL_OK){return 4;}HAL_FDCAN_ActivateNotification(&FDCAN1_Handler, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);return 0;
}/*** @brief       FDCAN初始化* @param       presc   : 分频值,取值范围1~512;* @param       tsjw    : 重新同步跳跃时间单元.范围:1~128;* @param       ntsg1   : 时间段1的时间单元.取值范围2~256;* @param       ntsg2   : 时间段2的时间单元.取值范围2~128;* @param       mode    : FDCAN_MODE_NORMAL,普通模式; FDCAN_MODE_INTERNAL_LOOPBACK,内部回环模式;FDCAN_MODE_EXTERNAL_LOOPBACK,外部回环模式;FDCAN_MODE_RESTRICTED_OPERATION,限制操作模式FDCAN_MODE_BUS_MONITORING,总线监控模式* @note        以上5个参数, 除了模式选择其余的参数在函数内部会减1, 所以, 任何一个参数都不能等于0*              FDCAN其输入时钟频率为 Fpclk1 = 20Mhz*              波特率 = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc);*              我们设置 fdcan_init(10, 8, 31, 8, 1), 则CAN波特率为:*              20M / ((31 + 8 + 1) * 10) = 500Kbps* @retval      0,  初始化成功; 其他, 初始化失败;*/
u8 FDCAN2_Mode_Init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode) 
{FDCAN_FilterTypeDef fdcan_filterconfig;HAL_FDCAN_DeInit(&FDCAN2_Handler);                              /* 先清除以前的设置 */FDCAN2_Handler.Instance = FDCAN2; FDCAN2_Handler.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* 位速率变换FDCAN模式 */FDCAN2_Handler.Init.Mode = mode;                                /* 模式设置  */FDCAN2_Handler.Init.AutoRetransmission = ENABLE;                /* 使能自动重传!传统模式下一定要关闭!!! */FDCAN2_Handler.Init.TransmitPause = ENABLE;                     /* 使能传输暂停 */FDCAN2_Handler.Init.ProtocolException = DISABLE;                /* 关闭协议异常处理 *//* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s *//* 数据段通信速率(仅FDCAN模式需配置) = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */FDCAN2_Handler.Init.DataPrescaler = 10;                         /* 数据段分频系数范围:1~32  */FDCAN2_Handler.Init.DataSyncJumpWidth = 16;                     /* 数据段重新同步跳跃宽度1~16 */FDCAN2_Handler.Init.DataTimeSeg1 = 2;                           /* 数据段dsg1范围:1~32  5 */FDCAN2_Handler.Init.DataTimeSeg2 = 1;                           /* 数据段dsg2范围:1~16  1 *//* 仲裁段通信速率(FDCAN与传统CAN均需配置) = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */FDCAN2_Handler.Init.NominalPrescaler = presc;                   /* 分频系数 */FDCAN2_Handler.Init.NominalSyncJumpWidth = tsjw;                /* 重新同步跳跃宽度 */FDCAN2_Handler.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1范围:2~256 */FDCAN2_Handler.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2范围:2~128 */FDCAN2_Handler.Init.MessageRAMOffset = FDCAN1_Handler.msgRam.EndAddress - SRAMCAN_BASE;/* 信息RAM偏移(使用2路CAN时非常重要)  */FDCAN2_Handler.Init.StdFiltersNbr = 32;                         /* 标准信息ID滤波器编号 */FDCAN2_Handler.Init.ExtFiltersNbr = 1;                          /* 扩展信息ID滤波器编号 */FDCAN2_Handler.Init.RxFifo1ElmtsNbr = 1;                        /* 接收FIFO1元素编号 */FDCAN2_Handler.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;       /* 接收FIFO1元素大小:最大64字节 */FDCAN2_Handler.Init.RxBuffersNbr = 1;                           /* 接收FIFO1元素编号 */FDCAN2_Handler.Init.TxEventsNbr = 1;                            /* 发送事件编号 */FDCAN2_Handler.Init.TxBuffersNbr = 1;                           /* 发送缓冲编号 */FDCAN2_Handler.Init.TxFifoQueueElmtsNbr = 2;                    /* 发送FIFO序列元素编号 */FDCAN2_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* 发送FIFO序列模式 */FDCAN2_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_64;            /* 发送大小:最大64字节 */if (HAL_FDCAN_Init(&FDCAN2_Handler) != HAL_OK) {return 1;   /* 初始化 */}/* 配置CAN过滤器 */fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* 标准ID */fdcan_filterconfig.FilterIndex = 1;                              /* 滤波器索引 */fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* 滤波器类型 */fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;       /* 过滤器1关联到FIFO1 */fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32位ID */fdcan_filterconfig.FilterID2 = 0x0000;                           /* 如果FDCAN配置为传统模式的话,这里是32位掩码 *//* 过滤器配置 */if (HAL_FDCAN_ConfigFilter(&FDCAN2_Handler, &fdcan_filterconfig) != HAL_OK) {return 2;                                                    /* 滤波器初始化 */}/* 配置全局过滤器,拒收所有不匹配的标准帧或扩展帧 */if (HAL_FDCAN_ConfigGlobalFilter(&FDCAN2_Handler, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK){return 3;}/* 启动CAN外围设备 */if (HAL_FDCAN_Start(&FDCAN2_Handler) != HAL_OK){return 4;}HAL_FDCAN_ActivateNotification(&FDCAN2_Handler, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);return 0;
}static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0;//FDCAN底层驱动,引脚配置,时钟使能
//HAL_FDCAN_Init()调用
//hsdram:FDCAN1句柄
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{GPIO_InitTypeDef GPIO_Initure;RCC_PeriphCLKInitTypeDef FDCAN_PeriphClk;if(hfdcan->Instance==FDCAN1){//FDCAN时钟源配置为PLL1QFDCAN_PeriphClk.PeriphClockSelection=RCC_PERIPHCLK_FDCAN;FDCAN_PeriphClk.FdcanClockSelection=RCC_FDCANCLKSOURCE_PLL;if (HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk) != HAL_OK){printf("can1 init failed.\n");}/* Peripheral clock enable */HAL_RCC_FDCAN_CLK_ENABLED++;if(HAL_RCC_FDCAN_CLK_ENABLED==1){__HAL_RCC_FDCAN_CLK_ENABLE();}// FDCAN1__HAL_RCC_GPIOD_CLK_ENABLE();			        //开启GPIOD时钟GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速GPIO_Initure.Alternate=GPIO_AF9_FDCAN1;         //复用为CAN1HAL_GPIO_Init(GPIOD,&GPIO_Initure);             //初始化#if FDCAN1_RX0_INT_ENABLE     HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn,1,2);HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);#endif	}else if(hfdcan->Instance==FDCAN2){FDCAN_PeriphClk.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;FDCAN_PeriphClk.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;if (HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk) != HAL_OK){printf("can2 init failed.\n");}/* Peripheral clock enable */HAL_RCC_FDCAN_CLK_ENABLED++;if(HAL_RCC_FDCAN_CLK_ENABLED==1){__HAL_RCC_FDCAN_CLK_ENABLE();}// FDCAN2__HAL_RCC_GPIOB_CLK_ENABLE();			        //开启GPIOB时钟GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6;GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速GPIO_Initure.Alternate=GPIO_AF9_FDCAN2;         //复用为CAN2HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化#if FDCAN2_RX0_INT_ENABLE     HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn,1,2);HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn);#endif	}
}//此函数会被HAL_FDCAN_DeInit调用
//hfdcan:fdcan句柄
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
{/* Peripheral clock disable */if(hfdcan->Instance==FDCAN1){HAL_RCC_FDCAN_CLK_ENABLED--;if(HAL_RCC_FDCAN_CLK_ENABLED==0){__HAL_RCC_FDCAN_CLK_DISABLE();}HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1);#if FDCAN1_RX0_INT_ENABLE   HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);#endif}else if(hfdcan->Instance==FDCAN2){/* Peripheral clock disable */HAL_RCC_FDCAN_CLK_ENABLED--;if(HAL_RCC_FDCAN_CLK_ENABLED==0){__HAL_RCC_FDCAN_CLK_DISABLE();}HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5|GPIO_PIN_6);#if FDCAN2_RX0_INT_ENABLE   HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn);#endif}
}

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

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

相关文章

了解同步带选择同步带

同步带和轮选型 同步带传动属于皮带传动,但是改进了传统皮带传动无法保持严格的传动比的打滑问题,传统皮带传动依靠皮带和皮带轮张紧时产生的摩擦力传输动力,但是从动轮遇到障碍或超载荷时,皮带会在皮带轮产生滑动。 解决打滑问题…

项目1 物流仓库管理系统

一、项目概述 本项目旨在开发一个功能全面的物流仓库管理系统,以数字化手段优化仓库作业流程,提高管理效率。系统集成了前端用户交互界面与后端数据处理逻辑,涵盖了从用户注册登录、订单管理、货单跟踪到用户信息维护等多个核心业务模块。通…

前端3d动画-----平移 transform: translate3d()

必须加这个属性&#xff1a;transform-style: preserve-3d; perspective: 900px; 设置了景深才能感到近大远小的感觉 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

分享一个基于python爬虫的“今日头条”新闻数据分析可视化系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

AI赋能软件测试:从自动化到智能化,让测试工作事半功倍

引言 在当今这个日新月异的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;正以不可阻挡之势渗透并重塑着各行各业&#xff0c;其中&#xff0c;软件开发与测试领域更是迎来了前所未有的变革。随着软件系统的复杂性日益增加&#xff0c;用户对软件质量、性能及安全性的…

Nginx笔记(高级)

扩容 通过扩容提升整体吞吐量 单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等CPU/主板&#xff1a;更新到主流网卡&#xff1a;10G/40G网卡磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械&#xff09;、HHD&#xff08;混合&…

android13布局查看工具 无源码查看布局 在线查找ui布局id

总纲 android13 rom 开发总纲说明 目录 1.前言 2.工具介绍 2.1工具1 2.2工具2 2.3工具3 2.4工具4 3.彩蛋 1.前言 Android 13提供了一些工具来帮助开发人员查看和优化应用的布局。方便的让我们找到具体应用的布局文件等信息。 2.工具介绍 2.1工具1 老版本DDMS&#x…

封装通用第三方平台用户表(微信开放平台)

文章目录 一. 注册微信开放平台1.1 开发者资质认证1.2 应用申请1.3 配置应用 二.通用数据库表设计三.入库实体类四. 对接第三方平台4.1 微信开放平台VO对象4.2 通用方法 我们的系统可能要对接很多第三方系统&#xff0c;为了便利用户授权使用和对多平台账户的管理。有必要设计通…

ant design pro 技巧之实现列表页多标签

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的ant design pro 中用户的表单如何控制多个角色ant des…

影响五金精密零件加工价格的因素

在制造业中&#xff0c;五金精密零件的加工价格受到多种因素的影响。了解这些因素&#xff0c;对于企业合理控制成本、选择合适的加工供应商至关重要。 首先&#xff0c;零件的设计复杂度是一个重要因素。复杂的设计通常需要更先进的加工技术和更多的加工工序。例如&#xff0c…

Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。

Unity编辑器扩展&#xff1a;创建一个欢迎窗口&#xff0c;在启动Editor的时候显示自定义窗口。 在Unity开发过程中&#xff0c;经常会遇到需要向其他人展示重要信息的情况&#xff0c;比如项目文档、脚本说明、插件介绍等。这个窗口不仅能够展示必要的文档信息&#xff0c;还…

用手机写一本电子书

第1步、进入Andi.cn网站 第2步、点击登录&#xff0c;注册用户 第3步、点击去创作&#xff0c;进入创作页面 第4步、点击右下角的小笔&#xff0c;写一篇文章 第5步、下翻&#xff0c;点击提交按钮 第6步、再写一篇文章 第7步、点击栏目设计 第8步、进入栏目设计&#xff0c;点…

FFmpeg的入门实践系列三(基础知识)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客一、音视频常用术语二、FFmpeg库的结构介绍三、FFmpeg的常用函数初始化封装格式编解码器相关 四、FFmpeg常用的数…

安装搭建MongoDB及配置副本集

目录 一、什么是MongoDB的副本集 简介 &#xff08;1&#xff09;冗余和数据可用性 &#xff08;2&#xff09;MongoDB中的复制 &#xff08;3&#xff09;主从复制和副本集区别 二、副本集的架构 三、副本集的成员 四、部署副本集 1、节点划分 2、安装MongoDB 2.1、…

Jetpack 各种框架简介

Jetpack是Google推出的一套为Android开发提供极大便利的组件、工具和指导集&#xff0c;旨在帮助开发者快速构建高质量的应用&#xff0c;并遵循最佳实践。 Jetpack不仅是一个提高开发效率的工具集&#xff0c;还是Android开发的未来方向。它通过整合各种组件和工具&#xff0…

VAuditDemo审计之二次注入漏洞

目录 VAuditDemo二次注入漏洞 搜索危险函数&#xff0c;用户可控点 regCheck.php messageSub.php message.php 漏洞调用链 漏洞错误利用过程 注册用户 xxxx, 发表payload留言 漏洞正确利用过程 注册用户 wwww\ 退出用户 wwww\\ 使用 wwww\ 登录 发表留言 替换dat…

【全网最真实测评】随身WiFi值得入手吗?自费入手华为、中兴、格行、上赞4款随身WiFi,内含国产4款热门随身WiFi推荐!(最实用、最高性价比!)

随身WiFi的风越吹越大&#xff0c;市场乱象也更变本加厉。作为一名资深随身WiFi使用者&#xff0c;接触过太多的随身WiFi产品&#xff0c;越是了解这个行业黑幕&#xff0c;就越对无良商家夸大宣传、虚标限速&#xff0c;甚至售卖二手产品的行为深恶痛绝&#xff01; 本篇测评涉…

学习嵌入式第二十九天

ipc进程间通信方式 PC&#xff0c;即进程间通信&#xff08;Inter-Process Communication&#xff09;&#xff0c;是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式&#xff1a; 管道&#xff1a;用于父子进程或兄弟进程之间的通信。消息队列&#xff…

nestjs nest-cli.json中的assets不生效

官方文档 Documentation | NestJS - A progressive Node.js framework // nest-cli.json{"collection": "nestjs/schematics","sourceRoot": "src","compilerOptions": {"assets": ["microservices/mail/te…