STM32F103_HAL库+寄存器学习笔记17 - CAN中断接收 + 接收CAN总线所有报文
导言
如上所示,本实验的目的是使能CAN接收FIFO1的挂号中断,使用CAN过滤器0与CAN接收FIFO1的组合,接收CAN总线上所有的CAN报文。
如上所示,STM32F103有两个3级深度的接收FIFO。外设CAN想要正常接收CAN报文,必须配置接收FIFO与接收滤波器。两者缺一不可,否则导致无法接收CAN报文。
如上所示,当接收FIFO的3级深度(缓存)都被占满时,将会导致溢出。此时,必须让MCU快读取接收FIFO的邮箱,避免出现溢出。
最终效果如下:
如上所示,使用CAN分析仪发送5000个CAN报文,发送间隔1ms。从Keil的debug模式观察到,全局变量g_RxCount从0变成5000。没有丢包!
项目地址:
- HAL库:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_hal_library17_Can_Rec_Interrupt
- 寄存器方式:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library17_Can_Rec_Interrupt
一、CubeMX
CubeMX不主持生成外设CAN的LL库代码,仅支持HAL库。所以,先看看HAL库怎样实现接收CAN报文。
1.1、开启接收FIFO1中断
如上所示,只需要在NVIC_Settings里勾选CAN_RX1_interrupt即可开启接收FIFO1中断。另外,也可以选择接收FIFO0中断。二者只能选择其一,不能两个都选择。
如上所示,生成代码。
二、代码(HAL库)
2.1、myCanDrive.c
如上所示,函数CAN_FilterConfig_AllMessages()
配置一个滤波器,并将该滤波器关联到RX_FIFO1。之前说过,要能正常接收CAN报文,需要配置滤波器+FIFO。关于接收滤波器的设置,后面会专门拿一章节来讲。设置好滤波器,可以过滤掉大部分的CAN报文,让MCU减少没必要的中断。现在,为了方便起,让滤波器接收CAN总线上的所有CAN报文。
如上所示:
- 函数CAN_Config()里增加滤波器的设置,还有使能接收FIFO1接收中断。
- 函数HAL_CAN_RxFifo1MsgPendingCallback()是HAL库定义的一个虚函数,所以我们可以重新定义它的内容。
三、调试代码
如上所示,使用CAN分析仪发送50条CAN报文到CAN总线上,发送间隔100ms。然后,在Keil的debug模式下观察到全局变量g_RxCount最后等于50,说明一共接收到50条CAN报文。实验成功!
四、寄存器梳理
4.1、滤波器相关的寄存器
/* 9. 配置滤波器0,FIFO1 */CAN1->FMR |= (1UL << 0); // 进入滤波器初始化模式CAN1->sFilterRegister[0].FR1 = 0x00000000;CAN1->sFilterRegister[0].FR2 = 0x00000000;CAN1->FFA1R |= (1UL << 0); // 分配到 FIFO1CAN1->FM1R &= ~(1UL << 0); // 滤波器0使用屏蔽位模式CAN1->FA1R |= (1UL << 0); // 激活滤波器 0CAN1->FMR &= ~(1UL << 0); // 退出滤波器初始化模式
上面代码的功能是配置滤波器0,可以接收所有CAN报文,并关联到接收FIFO1。接下来,一个一个梳理。
4.1.1、寄存器CAN_FMR
如上所示,CAN_FMR是控制所有滤波器的模式,配置滤波器之前,要先进入初始化模式。等待配置完成后,需要从初始化模式改为正常模式。
CAN1->FMR |= (1UL << 0); // 进入滤波器初始化模式
CAN1->FMR &= ~(1UL << 0); // 退出滤波器初始化模式
4.1.2、寄存器CAN_FM1R
如上所示,寄存器CAN_FM1R主要控制滤波器的屏蔽模式,分为列表模式与屏蔽模式。
CAN1->FM1R &= ~(1UL << 0); // 滤波器0使用屏蔽位模式
屏蔽位模式
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照 “必须匹配”或“不用关心”处理。
标识符列表模式
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符
相同。
4.1.3、寄存器CAN_FiRx
如上所示,寄存器CAN_FiRx与寄存器CAN_FM1R组合起来,实现过滤CAN总线上的CAN报文的作用。后面,将单独用一个章节来举例子,达到只接收CAN总线上的部分CAN报文。
CAN1->sFilterRegister[0].FR1 = 0x00000000;
CAN1->sFilterRegister[0].FR2 = 0x00000000;
4.1.4、寄存器CAN_FFA1R
如上所示,寄存器CAN_FFA1R的作用是将滤波器x分配到FIFO0或者FIFO1。
CAN1->FFA1R |= (1UL << 0); // 滤波器0分配到FIFO1
4.1.5、寄存器CAN_FA1R
如上所示,寄存器CAN_FA1R的作用是激活滤波器x。
CAN1->FA1R |= (1UL << 0); // 激活滤波器0
4.2、开启接收FIFO1消息挂号中断(接收中断)
如上所示,寄存器CAN_IER的FMPIE1置1时,使能FIFO1消息挂号中断。
NVIC_SetPriority(CAN1_RX1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); // 设置CAN1_RX1全局中断的中断优先级
NVIC_EnableIRQ(CAN1_RX1_IRQn); // 开启CAN1_RX1的全局中断
CAN1->IER |= CAN_IER_FMPIE1; // 使能接收中断(消息挂号中断)
4.3、在全局中断CAN1_RX1_IRQHandler()里获取CAN报文的内容
如上所示,从启动文件看到:
- 接收FIFO0对应的全局中断函数名是
USB_LP_CAN1_RX0_IRQHandler()
。 - 接收FIFO1对应的全局中断函数名是
CAN1_RX1_IRQHandler()
。本章节实验使用FIFO1。
如上所示,在全局中断函数CAN1_RX1_IRQHandler()里通过4个寄存器就可以获取CAN报文的详细信息。
4.3.1、寄存器CAN_RIxR
如上所示,通过寄存器CAN_RIxR可以得到CAN报文以下内容:
- 标准帧 还是 拓展帧 ?对应的帧ID是什么?
- 数据帧 还是 远程帧 ?
uint32_t rx_rir = CAN1->sFIFOMailBox[1].RIR; // 接收标识符寄存器// 3. 判断帧类型并提取ID和远程传输请求(RTR)标志
// IDE位(一般在RIR的第2位):0表示标准帧,1表示扩展帧
if ((rx_rir & (1UL << 2)) == 0) { // 标准帧rxHeader->IDE = 0;// 标准ID位于RIR的[31:21],共11位rxHeader->StdId = (rx_rir >> 21) & 0x7FF;rxHeader->ExtId = 0;
} else { // 扩展帧rxHeader->IDE = 1;// 扩展ID位于RIR的[31:3],共29位rxHeader->ExtId = (rx_rir >> 3) & 0x1FFFFFFF;rxHeader->StdId = 0;
}
// RTR位(RIR的第1位):1表示远程帧,0表示数据帧
rxHeader->RTR = (rx_rir & (1UL << 1)) ? 1 : 0;
4.3.2、寄存器CAN_RDTxR
如上所示,通过寄存器CAN_RDTxR可以得到CAN报文的以下内容:
- 时间戳
- 数据长度
uint32_t rx_rdtr = CAN1->sFIFOMailBox[1].RDTR; // 接收数据长度和时间戳寄存器
// 2. 解析报文头
// RDTR寄存器:
// - [3:0] 表示数据字节数(DLC)
// - [7:4] 保留(根据实际情况不同,这里我们只关心DLC和时间戳)
// - [15:8] 表示滤波器匹配索引(FilterMatchIndex)
// - [31:16] 表示接收时间戳
rxHeader->DLC = rx_rdtr & 0x0F;
rxHeader->FilterMatchIndex = (rx_rdtr >> 8) & 0xFF;
rxHeader->Timestamp = (rx_rdtr >> 16) & 0xFFFF;
4.3.3、寄存器CAN_RDLxR与CAN_RDHxR
如上所示,通过寄存器CAN_RDLxR可以得到CAN报文的低4个字节的内容。
如上所示,通过寄存器CAN_RDLxR可以得到CAN报文的高4个字节的内容。
uint32_t rx_rdlr = CAN1->sFIFOMailBox[1].RDLR; // 接收数据低32位寄存器
uint32_t rx_rdhr = CAN1->sFIFOMailBox[1].RDHR; // 接收数据高32位寄存器// 4. 读取数据部分,根据DLC从RDLR和RDHR中提取数据字节(最多8字节)
uint8_t dlc = rxHeader->DLC;
if (dlc > 8)dlc = 8;
for (uint8_t i = 0; i < dlc; i++) {if (i < 4) {rxData[i] = (uint8_t)((rx_rdlr >> (8 * i)) & 0xFF);} else {rxData[i] = (uint8_t)((rx_rdhr >> (8 * (i - 4))) & 0xFF);}
}
4.3.4、寄存器CAN_RF1R
如上所示,在中断发生后,需要用软件清0。
CAN1->RF1R |= CAN_RF1R_RFOM1; // 释放FIFO1中的报文:写1到CAN1->RF1R中的RFOM1位,释放该报文,使FIFO1指针前移
五、代码(寄存器方式)
5.1、myCanDrive_reg.c
如上所示,函数CAN_Config()里增加滤波器0的设置、并开启CAN接收FIFO1全局中断。
如上所示,两个全局中断函数的定义。全局中断函数USB_HP_CAN1_TX_IRQHandler()
之前在stm32f1xx_it.c里,我觉得放在myCanDrive_reg更好,所以移过来了。
六、调试代码
如上所示,CAN分析仪发送50条CAN报文到CAN总线,发送间隔100ms。从Keil的debug模式观察全局变量g_RxCount等于50。没有丢包,效果跟HAL库一样。但是,寄存器效率肯定比HAL库高得多。
七、进一步优化全局中断函数CAN1_RX1_IRQHandler()的代码
7.1、再谈CAN接收FIFO1寄存器CAN_RF1R
FMP1(FIFO1报文数目),指的是FIFO1邮箱里一共接收到几个CAN报文(存储深度是3,所以最多3个CAN报文)。利用它,就能在全局中断函数CAN1_RX1_IRQHandler()里一次性把所有的CAN报文读取完。
如果你在中断函数中只读取了一个报文就退出,而此时FIFO1中仍残留有其他报文(例如还有一个报文未处理),那么由于CAN外设的中断条件依然成立(FIFO1报文挂号数FMP1不为0),会再一次进入中断。
所以,优化的思路是:
- 如果在
CAN1_RX1_IRQHandler()
里采用了根据FMP1来循环处理FIFO1中所有报文的方法(即在中断中使用while循环,直到FMP1为0),那么当两个报文都被读取处理后,FIFO1就被清空,中断触发条件就不再满足,此时就不会立即再次触发CAN1_RX1_IRQHandler()
。只有当之后有新的报文进入FIFO1,且FMP1变为非零时,才会再次触发中断回调。 - 使用while循环依据FMP1处理所有报文,可以一次性清空FIFO内所有待处理报文,从而避免不必要的重复中断,减轻中断服务函数的负担。但是,值得注意的是,正因为有while循环,所以一定要避免长时间卡在全局中断函数里。所以,在
CAN1_RX1_IRQHandler()
里不能当场解析、处理CAN报文,而是使用例如消息队列(ringbuffer)等数据结构。在全局中断CAN1_RX1_IRQHandler()
里用while循环将所有CAN报文放入ringbuffer,然后在main()
主循环while(1)里再从ringbuffer拿出CAN报文,接着解析、处理CAN报文。
7.2、优化myCanDrive.c
如上所示,增加代码while (CAN1->RF1R & CAN_RF1R_FMP1) { ... }
实现一次把FIFO1的所有CAN报文读取出来。
八、细节补充
8.1、再再谈CAN接收FIFO1寄存器(CAN_RF1R)
如上所示,还有另外两个中断可以使用。其中,FOVR1(FIFO1溢出)非常有用。通过它,就能知道咱们现在的系统是不是接不过来CAN总线的报文。此时,应该调整滤波器,过滤掉系统不关心的CAN报文,避免它们进入FIFO邮箱。下一章节,将用代码实践一遍这个功能。
相关文章:
STM32F103_HAL库+寄存器学习笔记17 - CAN中断接收 + 接收CAN总线所有报文
导言 如上所示,本实验的目的是使能CAN接收FIFO1的挂号中断,使用CAN过滤器0与CAN接收FIFO1的组合,接收CAN总线上所有的CAN报文。 如上所示,STM32F103有两个3级深度的接收FIFO。外设CAN想要正常接收CAN报文,必须配置接收…...
kafka报错:The Cluster ID doesn‘t match stored clusterId Some in meta.properties
kafka启动报错: ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.common.InconsistentClusterIdException: The Cluster ID kVSgfurUQFGGpHMTBqBPiw doesnt match stored clusterId Some(0Qftv9yBTAmf2iDPSl…...
QML 信号与槽
QML 信号与槽 QML 是 Qt 框架中用于构建现代化、流畅用户界面的声明式语言,其信号与槽(Signals and Slots)机制是实现组件间通信和交互的核心特性。与 C 的信号与槽类似,QML 的信号与槽提供了一种松耦合的方式,允许界…...
数据结构-栈
大家好,今天带来的是关于数据结构初阶中的栈和队列的内容,一起来看看吧!!! 1.栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为…...
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
摘要 本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP,主要包含以下内容。 1. 一些 MCP 基础与快速体验(熟悉的读者可以跳过此部分) 2. 如何将自己开发的 Spring 应用发布为 MCP Server,验…...
CSS核心笔记001
目录 杂七杂八知识点样式优先级风格基本选择器通配符元素类ID 复合选择器交集选择器并集后代-孙子儿子兄弟属性各种属性选择器的应用 伪类动态伪类结构伪类否定伪类目标为类语言伪类UI伪类 伪元素 杂七杂八知识点 样式优先级 行内 > 内部 > 外部风格 紧凑风格基本选择…...
Windows快速切换屏幕/桌面
windows自带的切屏 需要winctrl 小键盘左右键 但是! Windows使用还是键盘加鼠标舒服! 教程 安装autohotkey 代码 ~LWin & LButton::{SendInput "^#{Left}" ; 发送 Win Ctrl Left (切换到左侧虚拟桌面) } ; 使用花括号包裹命令&a…...
ESP32- 开发笔记- 硬件设计-ESP32-C3基本电路
ESP32的最小电路 1 ESP32固件下载 ESP32 有多种下载(烧录)固件的方式,具体选择取决于开发环境和硬件连接。以下是常见的几种下载方式: 1.1 USB 串口下载(最常用) 适用场景:通过 USB 转串口芯片(如 CP2102、CH340)连接电脑,使用 esptool 或其他工具烧录固件。这里…...
webgl入门实例-09索引缓冲区示例
实现效果 实现代码 <!doctype html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport"content"widthdevi…...
STM32 串口中断接收方式笔记:HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT
📘 STM32 串口中断接收方式笔记:HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT 🧠 1. 两者作用简述 函数/宏作用是否配置HAL状态是否调用Rx回调HAL_UART_Receive_IT()启动一次基于中断的串口接收任务✅ 是✅ 是__HAL_UART_ENABLE_IT()手动使…...
ubuntu 向右拖动窗口后消失了、找不到了
这是目前单显示器的设置,因为实际只有1个显示器,之前的设置如下图所示,有2个显示器,一个主显示器,一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时,向右一滑,发现这个窗口再也不显示了、找…...
Selenium 获取 Web 页面信息的全指南
Selenium 获取 Web 页面信息的全指南 Selenium 是一个功能强大的自动化测试工具,但它也可以用于 web 页面信息的抓取和分析。本文将详细介绍如何使用 Selenium 来获取网页信息,并涵盖从环境搭建到高级技巧的各个方面。 目录 简介环境搭建Selenium 的基…...
stm32-lm75、SPI
一、lm75--温度传感器 LM75 是一种数字温度传感器和带有 2 线接口的热监视器(热看门狗),以下是其详细介绍: 一、核心功能与特点 温度检测与转换 内置带隙温度传感器和 Sigma-Delta 模数转换器,可实现 -55℃ 至 125℃ 温…...
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker 是一种开源的容器化平台,可以帮助开发人员打包、部署和运行应用程序。Docker 的基本概念是利用容器来封装应用程序及其所有依赖项,使其能够在任何环境中快速、可靠地运行。 Docker 的优势包括: 轻量级和灵活性:Docker 容…...
如何判断单片机性能极限?
目录 1、CPU 负载 2、内存使用情况 3、实时性能 4、外设带宽 5、功耗与温度 在嵌入式系统设计中,当系统变得复杂、功能增加时,单片机可能会逐渐逼近其性能极限。及时识别这些极限点对于保证产品质量、稳定性和用户体验至关重要。 当你的嵌入式系统…...
LeetCode 2919 使数组变美的最小增量运算数
动态规划解题:最小操作次数使数组变为美丽数组 问题描述 给定一个下标从0开始、长度为n的整数数组nums和一个整数k。你可以对数组中的任意一个元素进行加1操作,操作次数不限。如果数组中任意长度大于或等于3的子数组的最大值都大于或等于k,…...
5.VTK 相机
文章目录 概念示例 概念 在VTK(VisualizationToolkit)中,相机(vtkCamera)用于定义场景的观察视角。以下是关于VTK相机的主要概念和设置方法的总结: 相机位置:通过vtkCamera::SetPosition()方法设…...
基于Flask的网络安全渗透知识库系统架构解析
基于Flask的网络安全渗透知识库系统架构解析 一、系统架构概述 本系统采用经典的三层Flask架构设计,通过模块化的方式实现渗透技术知识库的展示与管理。整体架构包含以下核心组件: 路由控制层:app.py作为入口文件模板展示层:Ji…...
Flutter BigInt 是用于处理任意精度整数的特殊数字类型,专为解决超大整数运算需求而设计
在Flutter/Dart中,BigInt 是用于处理任意精度整数的特殊数字类型,专为解决超大整数运算需求而设计。以下是从原理到实践的全面解析: 一、核心特性 特性说明任意精度突破普通int的64位限制(-2^63 ~ 2^63-1),…...
绿幕抠图直播软件-蓝松抠图插件--使用相机直播,灯光需要怎么打?
使用SONY相机进行绿幕抠图直播时,灯光布置是关键,直接影响抠图效果和直播画质。以下是详细的灯光方案和注意事项: 一、绿幕灯光布置核心原则 均匀照明:绿幕表面光线需均匀,避免阴影和反光(亮度差控制在0.5…...
DeepSeek在数据仓库的10大应用场景
一、智能数据集成与清洗 多源数据整合:DeepSeek能够从多种数据源中提取、转换和加载数据,实现跨系统数据的高效整合。 数据清洗与标准化:通过智能算法自动识别并纠正数据中的错误、不一致性和缺失值,提升数据质量。 二、数据仓…...
Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步
一、前言 在实际开发中,我们经常面临以下场景: 系统支持多种登录方式(用户名密码、管理员登录、OAuth 登录、短信登录等) 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用,而不暴露具体实现 这个…...
算法备案和大模型备案能否同时申请?
最近收到很多小伙伴咨询说“算法备案和大模型备案能不能同时申请?”也有一些小伙伴们还分不清算法备案和大模型备案的区别,纷纷询问做了大模型备案还需要做算法备案吗?今天一篇文章带大家了解一下,算法备案和大模型备案究竟是怎么…...
【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路
目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…...
纷析云开源财务软件:助力企业财务管理数字化转型
在当今数字化时代,企业对财务管理工具的需求日益增长,而开源软件以其透明性、灵活性和成本优势成为越来越多企业的选择。纷析云开源财务软件作为一款专注于企业财务数字化的开源解决方案,不仅提供了强大的功能支持,还通过开源生态…...
APang网联科技项目报告(服务器域管理篇)
APang网联科技:连接未来,智能领航 公司简介 APang网联科技成立于 [2005年],总部位于 [广东深圳],是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…...
制作Unoconv项目的Docker镜像
制作Unoconv项目的Docker镜像 1 介绍 1.1 Unoconv 在Linux下将Office转换为pdf的很多包仅支持Windows,Unoconv是一个用LibreOffice转化文档的项目,已经归档(2025-3-31)。迁移后的新版本是unoserver,unoserver不太好…...
神经网络--拓扑排序+思维
1.c<0的点赋0,不然会影响后面的入度 2.最后输出层是出度为0的,且题干要求输出c大于0的 3.有q0的情况,所以输的事后就会有答案 https://www.luogu.com.cn/problem/P1038 #include<bits/stdc.h> #include<string> using nam…...
更强的视觉 AI!更智能的多模态助手!Qwen2.5-VL-32B-Instruct-AWQ 来袭
Qwen2.5-VL-32B-Instruct 是阿里巴巴通义千问团队于 2025 年 3 月 24 日开源的多模态大模型,基于 Apache 2.0 协议发布。该模型在 Qwen2.5-VL 系列的基础上,通过强化学习技术优化,以 32B 参数规模实现了多模态能力的突破。 核心特性升级&…...
逻辑过期怎么设计
设计“逻辑过期”通常用于缓存、令牌管理、数据有效性验证等场景,其核心是通过业务逻辑判断数据是否过期(而非单纯依赖物理时间)。以下是设计逻辑过期的关键思路和实现方案: 1. 核心思想 物理过期:基于固定的时间&…...
EMIF详解
一、EMIF的基本定义 EMIF(External Memory Interface,外部存储器接口) 是嵌入式处理器(如DSP、FPGA、SoC)用于连接外部存储器的专用硬件接口模块,负责管理处理器与存储器之间的地址/数据总线、控制信号及时…...
Kubernetes》》K8S》》Pod调度机制
nodeName 、nodeSelector nodeName 是强绑定,nodeSelector是弱绑定 强绑定,如果Node失效时,则会导致Pod也无法调度 apiVersion: v1 kind: Pod metadata:name: example-pod spec:# nodeName Pod应该被调度到哪个具体的节点上 强绑定nodeNam…...
具身智能机器人学习路线全解析
一、引言 具身智能机器人作为融合了机器人学、人工智能、认知科学等多领域知识的前沿技术,正逐渐改变着我们的生活和工作方式。从工业制造到家庭服务,从医疗护理到太空探索,具身智能机器人都展现出了巨大的潜力。对于想要深入了解和学习这一…...
【PGCCC】Postgres MVCC 内部:更新与插入的隐性成本
为什么 Postgres 中的更新操作有时感觉比插入操作慢?答案在于 Postgres 如何在后台管理数据版本。 Postgres 高效处理并发事务能力的核心是多版本并发控制(MVCC)。 在本文中,我将探讨 MVCC 在 Postgres 中的工作原理以及它如何影响…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)
目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)简介模块概述功能定义架构位置核心特性 触摸(Touch)外设触摸外设概述触摸外设API和数据结构外设层API(periph_touch.h/periph_touch…...
Python高级爬虫之JS逆向+安卓逆向1.5节: 控制结构
目录 引言: 1.5.1 Python中的控制结构 1.5.2 条件控制 1.5.3 循环控制 1.5.4 跳转控制 1.5.5 爬虫不要接学生单 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级,中级,高级知识&a…...
Spine-Leaf 与 传统三层架构:全面对比与解析
本文将详细介绍Spine-Leaf架构,深入对比传统三层架构(Core、Aggre、Access),并探讨其与Full-mesh网络和软件定义网络(SDN)的关联。通过通俗易懂的示例和数据中心网络分析,我将帮助您理解Spine-L…...
微信小程序文字混合、填充动画有效果图
效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…...
山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到
在开发中医知识问答历史对话查看功能的时候,出现了前后端信息获取异同的问题,在经过非常非常非常艰难的查询之后终于解决了这一问题,而这一问题的罪魁祸首就是后端没有setter和getter方法!!!!&a…...
HttpSessionBindingListener 的用法笔记250417
HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口, 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口,用于监听该对象被绑定…...
EuroCropsML:首个面向少样本时间序列作物分类的多国基准数据集
2025-04-15,由慕尼黑工业大学等机构创建的 EuroCropsML 数据集,这是一个结合了农民报告的作物数据与 Sentinel-2 卫星观测的时间序列数据集,覆盖了爱沙尼亚、拉脱维亚和葡萄牙。该数据集为解决遥感应用中作物类型数据空间不平衡问题提供了新的…...
《如何用 Function 实现动态配置驱动的处理器注册机制?》
大家好呀!👋 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上?别担心,我会用最简单的方式讲清楚!😊 一、为什么要用Function实现处理器…...
PyTorch:学习 CIFAR-10 分类
🔍 开始你的图像分类之旅:一步一步学习 CIFAR-10 分类 图像分类是计算机视觉中最基础的任务之一,如果你是初学者,那么以 CIFAR-10 为训练场是一个不错的选择。本文一步一步带你从零开始,学习如何用深度学习模型实现图…...
SpringBoot整合Thymeleaf模板:构建现代化Web视图层的完整指南
在Java Web开发领域,Thymeleaf作为一款自然模板引擎,凭借其优雅的语法和与Spring生态的无缝集成,已成为替代传统JSP的首选方案。本文将从技术整合、核心原理到生产实践,深度解析SpringBoot与Thymeleaf的协同工作方式。 一、Thymel…...
学习笔记十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同学点进来!
🧠 Rust 柯里化从零讲透:看不懂 fn add(x) -> impl Fn(y) 的同学点进来! 🍔 一、什么是柯里化?先用一个超好懂的生活比喻 假设你在点一个汉堡: 你说:我要点一个鸡腿汉堡! 店员…...
软件安装包-yum
yum:软件管理的得力助手 yum是一个软件下载安装管理的一个客户端,例如:小米应用商城、华为应用商城... Linux中软件包可能有依赖关系——yum会帮我们解决依赖关系的问题! 1、软件包是什么? 在Linux下安装软件, 一个通…...
C++面试
C面试 c面试100题 1、封装多态继承 2、数据集合 3、 4、便于外部文件访问 5、只能通过对象访问 6、通过类名 7、构造函数、析构函数、拷贝构造函数、拷贝复制函数 8、将一个对象复制给新建的对象 9、没有返回值 10、类的对象中有指针,防止多个指针指向同…...
Java SpringBoot设置自定义web的图片本地路径
一,设置配置文件:application.properties my.config.image-pathD:\\Download\\images二,新增配置类:MyImagesConfig import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springfr…...
Python HTTP库——requests
文章目录 简介安装基本概念RESTfulAPIOAuth2.0Cookie和Session 初试GET请求POST请求PUT请求DELETE请求HEAD请求OPTIONS请求传递查询参数响应内容自定义响应头传递表单参数传递文件响应状态码响应头Cookies重定向和历史记录超时错误和异常Session对象请求和响应对象预处理请求SS…...
用idea配置springboot+mybatis连接postersql数据库
从socket开始,我们就要开始部署前后端的交互了,所以今天带来一份热度比较高的框架springboot,并教大家如何连接数据库。 框架 先给大家看一下目录结构,因为有些需要调用文件路径: 创建项目: 新版本可以…...