【HAL库】STM32F407----CAN通信----过滤器配置

news2025/1/13 15:58:01

【HAL库】STM32F407----CAN通信----基本原理
【HAL库】STM32F407----CAN通信----电路图
【HAL库】STM32F407----CAN通信----中断详解

【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验


一、STM32F407----CAN过滤器----简介

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

1. CAN过滤器组

STM32F407有两路CAN,所以有28个过滤器组,具体如下表:

CAN过滤器组
CAN10 ~ 13
CAN214 ~ 27

2. CAN过滤器模式

掩码模式

在掩码模式下,标识符寄存器与掩码寄存器关联,用以指示标识符的哪些位必须匹配,哪些位无关

列表模式

传入标识符的所有位都必须与筛选器寄存器中指定的位匹配

3. CAN过滤器位宽

每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

  • 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位。
  • 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位。

4. CAN过滤器匹配序号

消息接收到 FIFO 中后,即可供应用程序使用。
通常情况下,报文中的数据被拷贝到SRAM中;为了把数据拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数据。bxCAN提供了过滤器匹配序号,以简化这一辨别过程。
根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。因此每个收到的报文,都有与它相关联的过滤器匹配序号。

过滤器匹配序号的使用方法有两种:

  1. 把过滤器匹配序号跟一系列所期望的值进行比较
  2. 把过滤器匹配序号当作一个索引来访问目标地址

对于列表模式过滤器,软件不再需要比较标识符。
对于掩码模式过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。

筛选器编号与筛选器组的激活状态无关。此外,还将使用两个独立的编号方案,每个 FIFO 各一个。具体举例如下:
在这里插入图片描述
此图只是举例,具体配置不用按照此图。

5. CAN过滤器优先级规则

根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:

  • 位宽为32位的过滤器,优先级高于位宽为16位的过滤器。
  • 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。
  • 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。

6. CAN过滤器配置

过滤器组可以通过相应的CAN_FMR寄存器(CAN过滤器主控寄存器)配置。但是不是什么时候都可以直接配置,在配置一个过滤器组前,必须通过清除CAN_FAR寄存器(CAN过滤器激活寄存器)的FACT位,把它设置为禁用状态。然后才能设置或设置过滤器组的配置

  • 通过设置CAN_FS1R(CAN过滤器位宽寄存器)的FSCx位,可以配置一个过滤器组的位宽
  • 通过设置CAN_FM1R(CAN过滤器模式寄存器)的FBMx位,可以配置对应的屏蔽/标识符寄存器的标识符列表模式掩码模式

过滤器配置具体如下图所示:
在这里插入图片描述


二、STM32F407----CAN过滤器----配置实验

以下是STM32F407----CAN过滤器----配置的具体实验内容和代码。
前期准备工作,请参考这篇文章:【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验

实验内容: CAN通信波特率为 500K bps,将接收到的CAN_ID发送出来,发送帧ID为0x18888888,前4个字节数据为接收到的CAN_ID。


过滤器配置-----代码模板

在STM32CubeMX生成【HAL库】程序中,没有关于过滤器相关的配置代码,如果不配置过滤器无法接收数据,所以需要我们自己手写代码配置过滤器

以下是 所有CAN帧ID都可以通过的过滤器 配置代码。

具体过滤器配置代码模板如下:

void CAN1_Filter_Bank(void)//过滤器
{
    CAN_FilterTypeDef FilterConfig;

    /*配置CAN过滤器*/
    FilterConfig.FilterBank = 0;                      //过滤器组号
    FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  //过滤模式:屏蔽位模式--CAN_FILTERMODE_IDMASK,列表模式--CAN_FILTERMODE_IDLIST
    FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器位宽:32位
    FilterConfig.FilterIdHigh = 0x0000;               //32位ID
    FilterConfig.FilterIdLow = 0x0000;
    FilterConfig.FilterMaskIdHigh = 0x0000;           //32位MASK
    FilterConfig.FilterMaskIdLow = 0x0000;
    FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //过滤器0关联到FIFO0
    FilterConfig.FilterActivation = ENABLE;           //激活滤波器0
    FilterConfig.SlaveStartFilterBank = 14;           //单CAN此参数无意义
    
    //过滤器配置激活
    if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

说明: 过滤器掩码模式:0不验证,1验证。所以屏蔽位都为0,就都不需要验证,所有CAN帧ID都可以接收了。

列表模式

只有列表中存放的CAN_ID才可以被接收到。

1. 列表模式----16位

在16位列表模式下,只能接收处理 标准帧CAN_ID
CAN_FxR1和CAN_FxR2寄存器一共有64位,可以存放4个16位CAN_ID。

具体如下图所示:
在这里插入图片描述

过滤器配置具体说明如下:

1514131211109876543210
映射STID[10:0]RTRIDEEXID[17:15]]
说明 11位标准帧CAN_ID帧类型:
0 数据帧
1 远程帧
标识符类型:
0 标准帧
1 扩展帧
无用数据
置0即可
举例0x101000
0x102100
0x1030.00
0x104100

因为在16位列表模式下,只能接收处理 标准帧CAN_ID,所以IDE位都置0

具体代码如下:

void CAN1_Filter_Bank(void)//过滤器、
{
	//标准帧ID
    uint16_t CanFilterListSTID0 = 0x101;
    uint8_t CanFilterListRTR0 = 0x00;   //帧类型:0x00数据帧,0x01远程帧
    
    uint16_t CanFilterListSTID1 = 0x102;
    uint8_t CanFilterListRTR1 = 0x01;   //帧类型:0x00数据帧,0x01远程帧
    
    uint16_t CanFilterListSTID2 = 0x103;
    uint8_t CanFilterListRTR2 = 0x00;   //帧类型:0x00数据帧,0x01远程帧
    
    uint16_t CanFilterListSTID3 = 0x104;
    uint8_t CanFilterListRTR3 = 0x01;   //帧类型:0x00数据帧,0x01远程帧
    
    CAN_FilterTypeDef FilterConfig;

    /*配置CAN过滤器*/
    FilterConfig.FilterBank = 0;                      //过滤器组号
    FilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;  //过滤模式:列表模式--CAN_FILTERMODE_IDLIST
    FilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; //过滤器位宽:16位
    FilterConfig.FilterIdHigh = (CanFilterListSTID0<<5)|(CanFilterListRTR0<<4);               //ID
    FilterConfig.FilterIdLow =  (CanFilterListSTID1<<5)|(CanFilterListRTR1<<4);
    FilterConfig.FilterMaskIdHigh = (CanFilterListSTID2<<5)|(CanFilterListRTR2<<4);           //MASK
    FilterConfig.FilterMaskIdLow = (CanFilterListSTID3<<5)|(CanFilterListRTR3<<4);
    FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //过滤器0关联到FIFO0
    FilterConfig.FilterActivation = ENABLE;           //激活滤波器
    FilterConfig.SlaveStartFilterBank = 14;           //单CAN此参数无意义
    //过滤器配置
    if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

实验结果如下:

在这里插入图片描述

2. 列表模式----32位

在32位列表模式下,可以接收处理 标准帧CAN_ID扩展帧CAN_ID
CAN_FxR1和CAN_FxR2寄存器一共有64位,可以存放2个32位CAN_ID。

具体如下图所示:
在这里插入图片描述
过滤器配置具体说明如下:

31 ~ 2120 ~3 210
映射STID[10:0]EXID[17:0]IDERTR0
说明 29位扩展帧CAN_ID标识符类型:
0 标准帧
1 扩展帧
帧类型:
0 数据帧
1 远程帧
0
11位标准帧CAN_ID0
举例0x1B010F01100
0x7010010

具体代码如下:

void CAN1_Filter_Bank(void)//过滤器
{
	//扩展帧ID
    uint32_t CanFilterListEXID0 = 0x1B010F01;
    uint8_t CanFilterListIDE0 = 0x01;       //帧类型:0x00标准帧,0x01扩展帧
    uint8_t CanFilterListRTR0 = 0x00;       //帧类型:0x00数据帧,0x01远程帧

    //标准帧ID
    uint16_t CanFilterListSTID1 = 0x701;
    uint8_t CanFilterListIDE1 = 0x00;//帧类型:0x00标准帧,0x01扩展帧
    uint8_t CanFilterListRTR1 = 0x01;//帧类型:0x00数据帧,0x01远程帧

    CAN_FilterTypeDef FilterConfig;

    /*配置CAN过滤器*/
    FilterConfig.FilterBank = 0;                      //过滤器组号
    FilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;  //过滤模式:列表模式--CAN_FILTERMODE_IDLIST
    FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器位宽:32位
    FilterConfig.FilterIdHigh = (CanFilterListEXID0<<3)>>16;         //ID
    FilterConfig.FilterIdLow =  (CanFilterListEXID0<<3)|(CanFilterListIDE0<<2)|(CanFilterListRTR0<<1);
    FilterConfig.FilterMaskIdHigh = CanFilterListSTID1<<5;           //MASK
    FilterConfig.FilterMaskIdLow = (CanFilterListIDE1<<2)|(CanFilterListRTR1<<1);
    FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //过滤器0关联到FIFO0
    FilterConfig.FilterActivation = ENABLE;           //激活滤波器
    FilterConfig.SlaveStartFilterBank = 14;           //单CAN此参数无意义
    //过滤器配置
    if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

实验结果如下:

在这里插入图片描述

掩码模式

由屏蔽码决定是否与验证CAN_ID哪几位做比较,只有与验证CAN_ID一致,才可以接收到。屏蔽码:0不验证,1验证。

掩码模式举例说明:

16进制76543210
屏蔽码0xFC11111100
验证码0x7901111001
可通过数据0x78,0x79,0x7A,0x7B011110xx

屏蔽码是1的位,必须与验证码一致才可通过。
屏蔽码是0的位,0和1皆可通过。

1. 掩码模式----16位

在16位掩码模式下,只能接收处理 标准帧CAN_ID
CAN_FxR1和CAN_FxR2寄存器一共有64位,可以存放2个16位验证码和2个16位屏蔽码。

具体如下图所示:
在这里插入图片描述
过滤器配置具体说明如下:

1514131211109876543210
映射STID[10:0]RTRIDEEXID[17:15]]
说明 11位标准帧CAN_ID帧类型:
0 数据帧
1 远程帧
标识符类型:
0 标准帧
1 扩展帧
无用数据
置0即可
举例屏蔽码0:0x7FC100
验证码0:0x201000
可接收帧:0x200,0x201,0x202,0x203
只可接收数据帧
屏蔽码1:0x7CF000
验证码1:0x301000
可接收帧:0x301,0x311,0x321,0x331
可接收数据帧和远程帧

因为在16位列表模式下,只能接收处理 标准帧CAN_ID,所以IDE位都置0

具体代码如下:

void CAN1_Filter_Bank(void)//过滤器
{
	uint16_t CanFilterMaskSTID0 = 0x7FC;//屏蔽码:0不验证,1验证
    uint8_t  CanFilterMaskRTR0 = 0x01;//屏蔽码:0不验证,1验证
    uint16_t CanFilterSTID0 = 0x201;
    uint8_t  CanFilterRTR0 = 0x00;//帧类型:0x00数据帧,0x01远程帧
    
    uint16_t CanFilterMaskSTID1 = 0x7CF;//屏蔽码:0不验证,1验证
    uint8_t CanFilterMaskRTR1 = 0x00;//屏蔽码:0不验证,1验证
    uint16_t CanFilterSTID1 = 0x301;
    uint8_t CanFilterRTR1 = 0x00;//帧类型:0x00数据帧,0x01远程帧

    CAN_FilterTypeDef FilterConfig;

    /*配置CAN过滤器*/
    FilterConfig.FilterBank = 0;                      //过滤器组号
    FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  //过滤模式:掩码模式--CAN_FILTERMODE_IDMASK
    FilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; //过滤器位宽:16位
    FilterConfig.FilterIdHigh = (CanFilterSTID0<<5)|(CanFilterRTR0<<4);               //ID
    FilterConfig.FilterIdLow =  (CanFilterSTID1<<5)|(CanFilterRTR1<<4);
    FilterConfig.FilterMaskIdHigh = (CanFilterMaskSTID0<<5)|(CanFilterMaskRTR0<<4);           //MASK
    FilterConfig.FilterMaskIdLow = (CanFilterMaskSTID1<<5)|(CanFilterMaskRTR1<<4);
    FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //过滤器0关联到FIFO0
    FilterConfig.FilterActivation = ENABLE;           //激活滤波器
    FilterConfig.SlaveStartFilterBank = 14;           //单CAN此参数无意义
    //过滤器配置
    if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

实验结果1如下:
在这里插入图片描述
可接收帧:0x200,0x201,0x202,0x203,只可接收数据帧。

实验结果2如下:
在这里插入图片描述
可接收帧:0x301,0x311,0x321,0x331,可接收数据帧和远程帧。

2. 掩码模式----32位

在32位列表模式下,可以接收处理 标准帧CAN_ID扩展帧CAN_ID
CAN_FxR1和CAN_FxR2寄存器一共有64位,可以存放1个32位验证码和1个32位屏蔽码。

具体如下图所示:
在这里插入图片描述
过滤器配置具体说明如下:

31 ~ 2120 ~3 210
映射STID[10:0]EXID[17:0]IDERTR0
说明 29位扩展帧CAN_ID标识符类型:
0 标准帧
1 扩展帧
帧类型:
0 数据帧
1 远程帧
0
11位标准帧CAN_ID0
举例屏蔽码:0x1FFFFFFC110
验证码:0x1B030F01100
可接收帧:0x1B030F00,0x1B030F01,0x1B030F02,0x1B030F03
只可接收数据帧扩展帧

具体代码如下:

void CAN1_Filter_Bank(void)//过滤器
{
    uint32_t CanFilterMaskEXID = 0x1FFFFFFC;//屏蔽码:0不验证,1验证
    uint8_t CanFilterMaskIDE = 0x01;//屏蔽码:0不验证,1验证
    uint8_t CanFilterMaskRTR = 0x01;//屏蔽码:0不验证,1验证

    uint32_t CanFilterEXID = 0x1B030F01;
    uint8_t CanFilterIDE= 0x01;     //帧类型:0x00标准帧,0x01扩展帧
    uint8_t CanFilterRTR= 0x00;     //帧类型:0x00数据帧,0x01远程帧

    CAN_FilterTypeDef FilterConfig;

    /*配置CAN过滤器*/
    FilterConfig.FilterBank = 0;                      //过滤器组号
    FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  //过滤模式:掩码模式--CAN_FILTERMODE_IDMASK
    FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器位宽:32位
    FilterConfig.FilterIdHigh = (CanFilterEXID<<3)>>16;               //ID
    FilterConfig.FilterIdLow =  (CanFilterEXID<<3)|(CanFilterIDE<<2)|(CanFilterRTR<<1);
    FilterConfig.FilterMaskIdHigh = (CanFilterMaskEXID<<3)>>16;           //MASK
    FilterConfig.FilterMaskIdLow = (CanFilterMaskEXID<<3)|(CanFilterMaskIDE<<2)|(CanFilterMaskRTR<<1);
    FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //过滤器0关联到FIFO0
    FilterConfig.FilterActivation = ENABLE;           //激活滤波器
    FilterConfig.SlaveStartFilterBank = 14;           //单CAN此参数无意义
    //过滤器配置
    if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
    {
        Error_Handler();
    }

实验结果如下:
在这里插入图片描述
可接收帧:0x1B030F00,0x1B030F01,0x1B030F02,0x1B030F03,只可接收数据帧扩展帧。


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

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

相关文章

纯vue 获取usb串口,实现电子秤的对接

说明&#xff1a;解决生产上过秤重量手动输入出错问题 效果图&#xff1a; 一&#xff1a;代码部分 1、创建一个名字为seriaport.js文件&#xff08;随便定义&#xff0c;为下面页面引入使用&#xff09; export default class MySerialPort {constructor() {this.state {po…

超级干货!前端入门先学什么?前端自学路线分享!

各位同学&#xff0c;下午好~之前给大家分享了前端岗位的面试题&#xff0c;小源能看的出来&#xff0c;还是有不少同学想入行前端的&#xff01;那除了会面试&#xff0c;还要有充足丰富的知识储备&#xff0c;这样才能拿下工作&#xff01; 好程序员今天就给大家整理了一份前…

C++进阶 —— set

目录 一&#xff0c;set介绍 二&#xff0c;set使用 一&#xff0c;set介绍 set是按照特定次序存储元素的关联式容器&#xff0c;元素不可重复&#xff1b;set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可从容器中插入和删除它们&#xff1b;set中的元素总是按…

【Linux】进程间通信详解

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅 进程间通信介绍 什么是进程间通信&#xff1f; 进程间通信&#xff08;Interprocess communication&#xff0c;简称IPC&#xff09;就是让程序员能够协调不同的进…

【Apache 网页优化】

文章目录 一、Apahce 网页优化1、网页压缩2、网页缓存 二、Apachen的安全优化1、隐藏版本信息2、Apache 防盗链 一、Apahce 网页优化 1、网页压缩 1.检查是否安装 mod_deflate 模块 apachectl -t -D DUMP_MODULES | grep "deflate"2.如果没有安装mod_deflate 模块…

Java基础 流程控制语句

顺序结构 顺序结构就是程序从上到下逐行地执行。表达式语句都是顺序执行的。并且上一 行对某个变量的修改对下一行会产生影响。 public class StatementTest{public static void main(String[] args){int x 1;int y 2; System.out.println("x " x);System.out.p…

非科班自学一年心得,学弟学妹别瞎学了

大家好&#xff0c;我是帅地。 前两天我发了一篇亲学弟自学一年拿大厂 offer 的文章&#xff1a;非科班&#xff0c;帅地亲学弟自学一年拿到大厂offer了 不过那一篇只写了自己转行开发岗的心里变化&#xff0c; 这两天学弟又在知识星球发了一篇关于找工作的万字长文 说实话&…

ISO21434 项目网络安全管理

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 4.1 网络安全责任 4.2 网络安全规划 4.3 裁剪 4.4 重用 4.5 非上下文组件 4.6 现成组件 4.7 网络安全案例&#xff08;Cybersecurity case&#xff09; 4.8 网络安全评估&#…

【惊叹】AI进步的速度太快,我们赶不上了?

文章目录 前言一、LoRA二、QLoRA1、环境准备2、推理就是直接 跑shscripts/generate.sh。3、前面的环境和数据都没问题了&#xff0c;运行scripts/generate.sh。 总结 前言 AI 领域的技术&#xff0c;真是隔一段时间就有一个新突破&#xff01; 全民都能训练大模型的时代&…

TypeScript算法题实战——剑指 Offer篇(3)

随着TypeScript的流行&#xff0c;越来越多的开发者开始使用TypeScript来解决算法问题。 在本文中&#xff0c;我们将使用TypeScript来解决剑指offer的算法题。这些问题涵盖了各种各样的主题&#xff0c;包括数组、字符串、链表、树、排序和搜索等。我们将使用TypeScript的强类…

【MySQL高级篇笔记 (中-索引的数据结构) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引及其优缺点 1、索引概述 2、优点 3、缺点 二、InnoDB中索引的推演 1、设计索引 1.一个简单的索引设计方案 2.InnoDB中的索引方案 2、常见索引概念 1. 聚簇索引 2. 二级索引&#xff08;辅助索引、非聚簇索引&#…

Node.js详解(一):基础知识

文章目录 一、Node.js介绍二、Node.js的优势三、Node.js的特点1、V8虚拟机2、事件驱动3、异步、非堵塞I/O 四、NodeJS带来的对系统瓶颈的解决方案1. 并发连接2. I/O阻塞 五、NodeJS的优缺点1、优点&#xff1a;2、缺点&#xff1a; 六、适合NodeJS的场景1、RESTful API2、统一W…

VMware、Ubuntu安装以及虚拟机复制粘贴问题

安装VMware 下载阿里云链接&#xff08;16 pro&#xff09;&#xff1a;VMware https://www.aliyundrive.com/s/ot9dhPNdSwC 安装&#xff1a;选一下安装地址&#xff0c;一直下一步即可。&#xff08;可能会要求重启电脑&#xff0c;重启即可&#xff09; 然后点击“许可证”…

Java 高级应用-多线程-(四)FutureTask的介绍及使用

Java多线程之FutureTask的介绍及使用 FutureTask属于java.util.concurrent 包&#xff1b;FutureTask表示可取消的异步计算。FutureTask类提供了一个Future的基本实现 &#xff0c;具有启动和取消计算的方法&#xff0c;查询计算是否完整&#xff0c;并检索计算结果。结果只能…

Camtasia2023试用版新功能介绍

Camtasia 2023在易用性更进一步&#xff0c;再一次降低了制作精美视频的门槛&#xff0c;下面看一看&#xff0c;Camtasia 2023有哪些的新功能&#xff01;包括影像、音效、鼠标移动轨迹、解说声音等等内容的录制&#xff0c;并且软件还可以提供即时播放和编辑压缩的功能&#…

如何监控电动车充电桩能耗?

一 背景 随着新能源汽车的快速发展&#xff0c;像特斯拉、BYD、蔚来、小鹏和理想等品牌的电动汽车在我们的日常生活中越来越多了&#xff0c;可见电动汽车如今已逐渐被我们所认可了。同汽油车需要加油一样&#xff0c;电动汽车需要充电&#xff0c;如此一来&#xff0c;电动汽…

第14届蓝桥杯省赛真题剖析-2023年5月7日Scratch编程中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第142讲。 第14届蓝桥杯Scratch省赛真题&#xff0c;这是2023年5月7日举办的省赛中级组试题&#xff0c;比赛仍然采取线…

洗地机充电底座语音芯片选型?NV040DS语音芯片

一、洗地机语音提示功能的价值 洗地机充电底座加入语音提示功能&#xff0c;主要是为了提高洗地机的智能化程度和使用便利性&#xff01; 1. 提高使用效率&#xff1a;底座语音提示充电状态可以使用户更方便地掌握底座电量和洗地机的使用情况&#xff0c;从而更快捷地对底座进…

ProtoBuf 语法(二)

系列文章 ProtoBuf 语法&#xff08;一&#xff09; ProtoBuf 语法&#xff08;三&#xff09; 文章目录 八、更新消息8.1 更新规则8.2 reserved 保留字段8.3 验证错误删除字段造成的数据损坏8.4 未知字段及其获取方法8.5 验证未知字段 八、更新消息 8.1 更新规则 如果现有的…

mysql中的count(1)、count(*)、count(id)哪个更快?

今天和大家聊一下mysql中的count()方法 我们日常开发中&#xff0c;经常会用到count()命令&#xff0c;有的人用count(*)&#xff0c;有的人用count(1)&#xff0c;还有的人用count(id)&#xff0c;那么这几种写法都有什么区别呢&#xff1f;哪种方法效率更高呢&#xff1f;今…