STM32_USB
概述
本文是使用HAL库的USB驱动
因为官方cubeMX生成的hal库做组合设备时过于繁琐
所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备
有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存
插件安装
下载地址 https://github.com/alambe94/I-CUBE-USBD-Composite/releases/tag/V01.00.03
下载pack文件
打开cubeMX
点击这个 之后选择下载的文件 安装
出现这个即为安装成功
生成代码
打开USB 设为设备模式,打开中断
注意设置时钟树
USB需要较为精确的时钟 建议用外部晶振
选择库文件
目前打勾的这俩必选
其余根据需要选择
根据需要选择,注意要在上步开启的库文件中选
在初始化后加入这个函数
MX_USB_DEVICE_Init();
可以去
usbd_desc.c
里设置VID/PID 某些名称等参数,不同设备有些许不同
虚拟串口(CDC)
概述
串口名是由PC的驱动来决定的,没法在STM32端设置
设置
打开这个
可以在这里设置虚拟的串口数量
注意一个串口要占用2个IN端点和一个OUT端点
也可以设置
AL94.I-CUBE-USBD-COMPOSITE_conf.h
文件中的_USBD_CDC_ACM_COUNT
设置虚拟的CDC串口数量
发送
开始发送
类型 | 名称 | 功能 |
---|---|---|
uint8_t | ch | 通道 |
uint8_t * | Buf | 缓冲区地址 |
uint16_t | Len | 发送数量 |
uint8_t | 输出 | 已经发送的数量 |
uint8_t CDC_Transmit(uint8_t ch, uint8_t *Buf, uint16_t Len)
发送完成
类型 | 名称 | 功能 |
---|---|---|
uint8_t | cdc_ch | 通道 |
uint8_t * | Buf | 缓冲区地址 |
uint32_t | Len | 发送数量 |
uint8_t | epnum | 端点号 |
uint8_t | 错误码 |
int8_t CDC_TransmitCplt(uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len, uint8_t epnum)
接收
类型 | 名称 | 功能 |
---|---|---|
uint8_t | cdc_ch | 通道 |
uint8_t * | Buf | 缓冲区地址 |
uint32_t | Len | 发送数量 |
int8_t | 错误码 |
接收到数据会自动调用这函数
int8_t CDC_Receive(uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len)
在这个函数里调用这俩句,来接收下个数据包
USBD_CDC_SetRxBuffer(cdc_ch, &hUsbDevice, &Buf[0]);USBD_CDC_ReceivePacket(cdc_ch, &hUsbDevice);
控制函数
类型 | 名称 | 功能 |
---|---|---|
uint8_t | cdc_ch | 通道 |
uint8_t | cmd | 命令类型 |
uint8_t * | pbuf | 命令缓冲区 |
uint16_t | length | 长度 |
int8_t | 错误码 |
int8_t CDC_Control(uint8_t cdc_ch, uint8_t cmd, uint8_t *pbuf, uint16_t length)
在
cmd
为CDC_SET_LINE_CODING
时收到来自主机的命令
具体内容生成的函数中有注释
人体工学设备(HID)
概述
全部使用自定义HID设备
根据不同设备设置描述符即可
HID间的复合直接复制就行
eg:鼠标+键盘 直接把鼠标的描述符和键盘的描述符写到一起即可
建立工程
设置
在
usbd_customhid.h
中
名称 | 功能 |
---|---|
CUSTOM_HID_STR_DESC | HID描述 |
CUSTOM_HID_EPIN_SIZE | 输入缓冲大小(一般设为64) |
CUSTOM_HID_EPOUT_SIZE | 输出缓冲大小(一般设为64) |
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE | HID缓冲区(一般设为64) |
CUSTOM_HID_FS_BINTERVAL | 包间隔时间 |
在
usbd_custom_hid_if.c
中
CUSTOM_HID_ReportDesc
设置HID描述符USBD_CUSTOM_HID_REPORT_DESC_SIZE
同时也要设置配置符大小
APIs
发送数据
类型 | 名称 | 功能 |
---|---|---|
USBD_HandleTypeDef * | pdev | USB句柄 |
uint8_t * | report | 缓冲区 |
uint16_t | len | 数据长度 |
uint8_t | 错误码 |
uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,uint8_t *report, uint16_t len);
接收数据回调
usbd_custom_hid_if.c
类型 | 名称 | 功能 |
---|---|---|
uint8_t | event_idx | |
uint8_t | state | |
uint8_t | 错误码 |
int8_t CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state)
在内部调用以获取数据
USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)HZ_DAP_USB_Handle.pClassData_HID_Custom;
// hhid->Report_buf;
USBD_CUSTOM_HID_ReceivePacket(&HZ_DAP_USB_Handle);
鼠标
鼠标的配置描述符
0x05, 0x01,
0x09, 0x02,
0xa1, 0x01, 0x85, 0x02, // 报告ID (2)0x09, 0x01,
0xa1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x03,
0x95, 0x03,
0x75, 0x08,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x09, 0x38,
0x15, 0x81,
0x25, 0x7f,
0x81, 0x06,
0xc0,
0xc0
需要发送的命令 含义
位置 | 功能 |
---|---|
Bit0 | 报告ID |
Bit1[0] | 左键(0未按1按下) |
Bit1[1] | 右键(0未按1按下) |
Bit1[2] | 中键(0未按1按下) |
Bit2 | x轴(正右负左 -127~127) |
Bit3 | y轴(正下负上 -127~127) |
Bit4 | 滚动(正上负下 -127~127) |
这个函数是自己封装的
extern USBD_HandleTypeDef hUsbDevice;/*** @brief 控制鼠标* @param key_l 左键(仅bit0 0未按1按下)* @param key_r 右键(仅bit0 0未按1按下)* @param key_m 中键(仅bit0 0未按1按下)* @param x x轴(正右负左 -127~127)* @param y y轴(正下负上 -127~127)* @param ec 滚动(正上负下 -127~127)* @author HZ12138* @date 2025-03-28 20:17:39*/
void HZ_Mouse_set(uint8_t key_l, uint8_t key_r, uint8_t key_m, int8_t x, int8_t y, int8_t ec)
{uint8_t buf[5];key_l &= 0x01;key_r &= 0x01;key_m &= 0x01;buf[0] = 0x02; // 报告ID 鼠标是0x02buf[1] = (key_m << 2) | (key_r << 1) | (key_l << 0);buf[2] = (uint8_t)x;buf[3] = (uint8_t)y;buf[4] = (uint8_t)ec;USBD_CUSTOM_HID_SendReport(&hUsbDevice, buf, 5);
}
键盘
描述符
0x85后面跟的是报告ID 0保留
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)0x85, 0x01, // 报告ID (1)0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
数据内容
Bit2~8 发送的是按下的键号 如果不按下写0即可
位置 | 功能 |
---|---|
Bit0 | 报告ID |
Bit1[0] | 左CTRL(0未按1按下) |
Bit1[1] | 左SHIFT(0未按1按下) |
Bit1[2] | 左ALT(0未按1按下) |
Bit1[3] | 左GUI(0未按1按下) |
Bit1[4] | 右CTRL(0未按1按下) |
Bit1[5] | 右SHIFT(0未按1按下) |
Bit1[6] | 右ALT(0未按1按下) |
Bit1[7] | 右GUI(0未按1按下) |
Bit2 | 保留(0x00) |
Bit3 | 按键1 |
Bit4 | 按键2 |
Bit5 | 按键3 |
Bit6 | 按键4 |
Bit7 | 按键5 |
Bit8 | 按键6 |
封装的发送按键函数和单个按键按下函数
extern USBD_HandleTypeDef hUsbDevice;
/*** @brief 发送按键* @param keys 按键* @param key_num 数量最大6个* @param ctrl_l 如名(0未按1按下)* @param shift_l 如名(0未按1按下)* @param alt_l 如名(0未按1按下)* @param gui_l 如名(0未按1按下)* @param ctrl_r 如名(0未按1按下)* @param shift_r 如名(0未按1按下)* @param alt_r 如名(0未按1按下)* @param gui_r 如名(0未按1按下)* @author HZ12138* @date 2025-03-28 22:52:09*/
void HZ_KeyBoard_set(uint8_t *keys, uint8_t key_num,uint8_t ctrl_l, uint8_t shift_l, uint8_t alt_l, uint8_t gui_l,uint8_t ctrl_r, uint8_t shift_r, uint8_t alt_r, uint8_t gui_r)
{uint8_t buf[9];ctrl_l &= 0x01;shift_l &= 0x01;alt_l &= 0x01;gui_l &= 0x01;ctrl_r &= 0x01;shift_r &= 0x01;alt_r &= 0x01;gui_r &= 0x01;buf[0] = 0x01;buf[1] = (gui_r << 7) | (alt_r << 6) | (shift_r << 5) | (ctrl_r << 4) |(gui_l << 3) | (alt_l << 2) | (shift_l << 1) | (ctrl_l << 0);buf[2] = 0x00;for (int i = 0; i < key_num; i++)buf[3 + i] = keys[i];USBD_CUSTOM_HID_SendReport(&hUsbDevice, buf, 9);
}
/*** @brief 发送单个按键 * @param key 按键值* @author HZ12138* @date 2025-03-28 22:52:12*/
void HZ_KeyBoard_one_key(uint8_t key)
{uint8_t temp[6];temp[0] = key;HZ_KeyBoard_set(temp, 6, 0, 0, 0, 0, 0, 0, 0, 0);
}
键码对应表,使用HID码
按键名称 | HID码 | 虚拟键码 |
---|---|---|
ESC | 41 [0X29] | 27 [0x1B] |
F1 | 58 [0X3a] | 112 [0x70] |
F2 | 59 [0X3b] | 113 [0x71] |
F3 | 60 [0X3c] | 114 [0x72] |
F4 | 61 [0X3d] | 115 [0x73] |
F5 | 62 [0X3e] | 116 [0x74] |
F6 | 63 [0X3f] | 117 [0x75] |
F7 | 64 [0X40] | 118 [0x76] |
F8 | 65 [0X41] | 119 [0x77] |
F9 | 66 [0X42] | 120 [0x78] |
F10 | 67 [0X43] | 121 [0x79] |
F11 | 68 [0X44] | 122 [0x7A] |
F12 | 69 [0X45] | 123 [0x7B] |
Esc | 41 [0X29] | 27 [0x1B] |
Back (回退) | 42 [0X2a] | 8 [0x08] |
Tab | 43 [0X2b] | 9 [0x09] |
CapLck (大小写) | 57 [0X39] | 20 [0x14] |
Enter (回车) | 40 [0X28] | 13 [0x0D] |
Space (空格) | 44 [0X2c] | 32 [0x20] |
Scroll | 71 [0X47] | 145 [0x91] |
Pause(暂停) | 72 [0X48] | 19 [0x13] |
Insert (插入) | 73 [0X49] | 45 [0x2D] |
PrintScr (截屏) | 70 [0X46] | 44 [0x2C] |
Delete (删除) | 76 [0X4c] | 46 [0x2E] |
Home (首页) | 74 [0X4a] | 36 [0x24] |
End (结尾) | 77 [0X4d] | 35 [0x23] |
PageUp (上一页) | 75 [0X4b] | 33 [0x21] |
PageDn (下一页) | 78 [0X4e] | 34 [0x22] |
Left (左) | 80 [0X50] | 37 [0x25] |
Up (上) | 82 [0X52] | 38 [0x26] |
Right (右) | 79 [0X4f] | 39 [0x27] |
Down (下) | 81 [0X51] | 40 [0x28] |
Num0 (小键盘) | 98 [0X62] | 96 [0x60] |
Num1 (小键盘) | 89 [0X59] | 97 [0x61] |
Num2 (小键盘) | 90 [0X5a] | 98 [0x62] |
Num3 (小键盘) | 91 [0X5b] | 99 [0x63] |
Num4 (小键盘) | 92 [0X5c] | 100 [0x64] |
Num5 (小键盘) | 93 [0X5d] | 101 [0x65] |
Num6 (小键盘) | 94 [0X5e] | 102 [0x66] |
Num7 (小键盘) | 95 [0X5f] | 103 [0x67] |
Num8 (小键盘) | 96 [0X60] | 104 [0x68] |
Num9 (小键盘) | 97 [0X61] | 105 [0x69] |
NumAdd (加号) | 87 [0X57] | 107 [0x6B] |
NumSub (减号) | 86 [0X56] | 109 [0x6D] |
NumMult (乘号) | 85 [0X55] | 106 [0x6A] |
NumDiv (除号) | 84 [0X54] | 111 [0x6F] |
NumDecim (点) | 99 [0X63] | 110 [0x6E] |
NumLock (数字锁定键) | 83 [0X53] | 144 [0x90] |
Ctrl | 1 [0X01] | 17 [0x11] |
LCtrl (左CTR) | 1 [0X01] | 162 [0xA2] |
RCtrl | 16 [0X10] | 163 [0xA3] |
Shift | 2 [0X02] | 16 [0x10] |
LShift | 2 [0X02] | 160 [0xA0] |
RShift | 32 [0X20] | 161 [0xA1] |
Alt | 4 [0X04] | 18 [0x12] |
LAlt | 4 [0X04] | 164 [0xA4] |
RAlt | 64 [0X40] | 165 [0xA5] |
WIN | 8 [0X08] | 91 [0x5B] |
LWIN | 8 [0X08] | 91 [0x5B] |
RWIN | 128 [0X80] | 92 [0x5C] |
A | 4 [0X04] | 65 [0x41] |
B | 5 [0X05] | 66 [0x42] |
C | 6 [0X06] | 67 [0x43] |
D | 7 [0X07] | 68 [0x44] |
E | 8 [0X08] | 69 [0x45] |
F | 9 [0X09] | 70 [0x46] |
G | 10 [0X0a] | 71 [0x47] |
H | 11 [0X0b] | 72 [0x48] |
I | 12 [0X0c] | 73 [0x49] |
J | 13 [0X0d] | 74 [0x4A] |
K | 14 [0X0e] | 75 [0x4B] |
L | 15 [0X0f] | 76 [0x4C] |
M | 16 [0X10] | 77 [0x4D] |
N | 17 [0X11] | 78 [0x4E] |
O | 18 [0X12] | 79 [0x4F] |
P | 19 [0X13] | 80 [0x50] |
Q | 20 [0X14] | 81 [0x51] |
R | 21 [0X15] | 82 [0x52] |
S | 22 [0X16] | 83 [0x53] |
T | 23 [0X17] | 84 [0x54] |
U | 24 [0X18] | 85 [0x55] |
V | 25 [0X19] | 86 [0x56] |
W | 26 [0X1a] | 87 [0x57] |
X | 27 [0X1b] | 88 [0x58] |
Y | 28 [0X1c] | 89 [0x59] |
Z | 29 [0X1d] | 90 [0x5A] |
0 | 39 [0X27] | 48 [0x30] |
1 | 30 [0X1e] | 49 [0x31] |
2 | 31 [0X1f] | 50 [0x32] |
3 | 32 [0X20] | 51 [0x33] |
4 | 33 [0X21] | 52 [0x34] |
5 | 34 [0X22] | 53 [0x35] |
6 | 35 [0X23] | 54 [0x36] |
7 | 36 [0X24] | 55 [0x37] |
8 | 37 [0X25] | 56 [0x38] |
9 | 38 [0X26] | 57 [0x39] |
大容量存储(MSC)
建立工程
设置
usbd_msc.h
中的MSC_MEDIA_PACKET
要设为扇区(sector)大小w25Qxx为4096 SD卡为512
STORAGE_LUN_NBR
为虚拟磁盘卷数量 一般把一个设备设为一个卷 设置这个可以虚拟出多个磁盘
usbd_storage_if.c
的STORAGE_BLK_NBR
为最小操作单元数量(一般写扇区数量)
usbd_storage_if.c
的STORAGE_BLK_SIZ
为最小操作单元大小 (一般写扇区大小) 单位(Byte)这俩相乘即可得到总大小 单位(Byte)
注意这俩的blk所指的块与FLASH的不同,也是我写成最小操作单元的原因
可以修改这个最后三项来更改显示名称
usbd_storage_if.c
的STORAGE_Inquirydata
APIs
存储读取(必写)
描述 | 名称 | 功能 |
---|---|---|
uint8_t | lun | 卷标 |
uint8_t * | buf | 缓冲区 |
uint32_t | blk_addr | 最小操作单元起始地址(*STORAGE_BLK_SIZ 后得到Byte起始地址 ) |
uint16_t | blk_len | 最小操作单元的数量(*STORAGE_BLK_SIZ 后得到Byte数量 ) |
int8_t | 输出 | 错误码 |
在
usbd_storage_if.c
中需要根据自己内容填写
int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
存储写入(必写)
描述 | 名称 | 功能 |
---|---|---|
uint8_t | lun | 卷标 |
uint8_t * | buf | 缓冲区 |
uint32_t | blk_addr | 最小操作单元起始地址(*STORAGE_BLK_SIZ 后得到Byte起始地址 ) |
uint16_t | blk_len | 最小操作单元的数量(*STORAGE_BLK_SIZ 后得到Byte数量 ) |
int8_t | 输出 | 错误码 |
在
usbd_storage_if.c
中需要根据自己内容填写
int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
相关文章:
STM32_USB
概述 本文是使用HAL库的USB驱动 因为官方cubeMX生成的hal库做组合设备时过于繁琐 所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备 有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存 插件安装 下载地址 https://github.com/alambe94/I-CUBE-USBD-Com…...
Java 基础-32-枚举-枚举的应用场景
在Java编程中,枚举(Enum)提供了一种强大的方式来定义一组固定的常量。它们不仅限于简单的用途,还可以包含构造函数、方法和字段等高级功能,使其适用于多种不同的应用场景。本文将探讨几种常见的使用枚举的场景…...
新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates
只需单击几下即可创建引人注目的视觉效果!您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含: 15 个静态 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…...
学透Spring Boot — 017. 魔术师—Http消息转换器
本文是我的专栏《学透Spring Boot》的第17篇文章,了解更多请移步我的专栏: 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 HTTP请求和响应 需求—新的Media Type 实现—新的Media Type 定义转换器 注册转换器 编写Controller 测试新的medi…...
stable diffusion 量化加速点
文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...
Xorg内存管理机制深度解析
Xorg内存管理机制深度解析 一、客户端资源生命周期管理 Xorg 采用 客户端绑定型资源管理 机制,所有资源(窗口、像素图、字体等)的生命周期与客户端连接状态强关联。 资源 ID 分配机制: • 每个资源由 32位标识符 表示,格式:0xBBCCDDEE ◦ BB:客户端 ID(ClientIndex)…...
第五期:深入理解 Spring Web MVC [特殊字符]( 前后端交互的综合性练习)
✨ 前言:从理解到实战,彻底掌握 Spring MVC 前后端交互 当我们学习了 Spring MVC 中的各种注解、参数绑定、请求方式、编码处理以及 Cookie/Session 操作之后,下一步就是 —— 动手实践! 理论再多,不如亲自敲一次代码…...
ansible可视化自动化平台-semaphore
1、简介 Semaphore UI 是一个开源的CI/CD工具,专注于简化和自动化软件交付流程,可轻松管理和运行 Ansible playbook,提供了一个直观的 Web 用户界面(UI),帮助DevOps团队轻松管理任务、部署和流水线。 官网…...
手撕LLM(二):从源码出发,探索LoRA加载、推理全流程
接上回接着说,前面我们通过分析源码,了解了大模型推理的详细流程,包括提示词从输入,到对话模版包装,到tokenID转换,到Embedding词向量转换;通过大模型推理,再将大模型输出进行最后一…...
数据库连接JDBC
概述 ✅概念 JDBC(JavaDataBaseConnectivityjava数据库连接)是⼀种⽤于执⾏SQL语句的JavaAPI,可以为多种关系型数据库提供 统⼀访问,它是由⼀组⽤Java语⾔编写的类和接⼝组成的。 本质 其实就是java官⽅提供的⼀套规范(接⼝)。⽤于帮助开发⼈员快速实现…...
VectorBT:使用PyTorch+Transformer训练和回测股票模型 进阶五
VectorBT:使用PyTorchTransformer训练和回测股票模型 进阶五 本方案基于PyTorch框架与Transformer模型,结合VectorBT回测引擎构建多股票量化交易系统,采用滑动窗口技术构建时序特征,通过自注意力机制捕捉市场规律预测收益率&#…...
DP Alt Mode 与 USB 的关系
DP Alt Mode 与 USB 的关系 1. 物理接口的统一:USB-C 是“万能插座” [USB-C接口物理结构] |-----------------------------------------------| | USB 3.0数据引脚 | DP Alt Mode视频引脚 | 电源引脚 | |-------------------------------------…...
C#“与AI的奇妙结合”
原文:C# 使用通义灵码 - AI 助力 Visual Studio 开发_w3cschool (注意:本文章中并不存在任何广告,也不存在任何盈利内容) C# 使用通义灵码 C# 作为一种功能强大且灵活多变的编程语言,被广泛应用于各个领…...
企业ITR流程设计与执行详细介绍【附全文阅读】
该方案聚焦企业 ITR 流程,适用于企业的服务管理人员、流程优化负责人、技术支持团队以及中高层管理者等。 ITR 流程的重要性:企业服务面临客户不满、管理者焦虑、服务人员无奈等挑战,缺乏完善的 ITR 流程会影响品牌形象、客户满意度和产品竞争力。ITR 流程能够保障客户满意,…...
Ubuntu 无密码热点(Soft AP)完整配置方案
适用于 Jetson、嵌入式 Linux、RDK 平台。目标:配置一个无密码热点(Soft AP),供手机等设备直接连接。实现开机自动启动热点,也支持后续一键切换回 WiFi 客户端模式。 平台:Yahboom RDK X3(Jetso…...
【力扣hot100题】(063)搜索二维矩阵
看到这题我就想到之前被我当作这题做的【力扣hot100题】(020)搜索二维矩阵Ⅱ 其实是完全不一样的两题,个人觉得这道题更简单也更考验基础,那道题思路更难想到但代码更好写。 两个二分查找结束,要注意的是第一个二分查…...
瑞萨RA4M2使用心得-KEIL5的第一次编译
目录 前言 环境: 开发板:RA-Eco-RA4M2-100PIN-V1.0 IDE:keil5.35 一、软件的下载 编辑瑞萨的芯片,除了keil5 外还需要一个软件:RASC 路径:Releases renesas/fsp (github.com) 向下找到: …...
玄机-apache日志分析
靶场任务 1、提交当天访问次数最多的IP,即黑客IP: 查看apache日志 apache访问日志的位置是:/var/log/apache2/access.log.1 匹配正则算法 首先先cat看看 发现地址都在第一行,直接匹配计算输出 cat access.log.1 |grep -Eo &…...
[C++]洛谷B2119 删除单词后缀
题目与解析 题干题目描述输入格式输出格式样例样例输入样例输出 答案解析食用提示AC代码AC代码详细解析头文件部分主程序8~12行代码 12行以后的代码 题干 题目描述 给定一个单词,如果该单词以 er、ly 或者 ing 后缀结尾,则删除该后缀(题目保…...
Ubuntu远程连接Mysql数据库(图文详解)
Ubuntu远程连接Mysql数据库 1、版本2、检查有没有Mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.3 查看Mysql运行状态 3、卸载Mysql4、安装4.1 更新4.2 开始安装4.3 安装完后查看状态 5、登录5.1、使用5.2、查看数据库权限5.3 更新权限5.4 再次查看数据库权限5.5 添加新用…...
回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测
回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-GRU多变量回归预测,牛顿-拉夫逊算法优…...
leetcode122-买卖股票的最佳时机II
leetcode 122 思路 方法一的核心思想是简单的贪心策略。我们每天都看当前价格和下一个价格的差值。如果下一个价格高于当前价格(即diff > 0),那么就认为当天可以买入并在第二天卖出,赚取利润。因此,方法一把所有…...
from PIL import Image 安装失败
正确安装 Pillow (PIL) # 通过 Conda 安装 conda install pillow -c conda-forge# 或通过 Pip 安装 pip install pillow验证安装 在 Python 中测试是否成功: from PIL import Image print(Image.__version__) # 应输出类似 "9.5.0" 的版本号常见问题说…...
DPFunc蛋白质功能预测模型复现报告
模型简介 模型的具体介绍见蛋白质功能预测论文阅读记录2025(DPFunc、ProtCLIP)_protein functions-CSDN博客 复现流程 仓库:CSUBioGroup/DPFunc 时间:2025.4.5 环境配置 python 3.9.21 & CUDA 11.6 Pytorch: 1.12.0 DG…...
在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus
一、安装环境信息说明 硬件资源(GB 和 GiB 的主要区别在于它们的换算基数不同,GB 使用十进制,GiB 使用二进制,导致相同数值下 GiB 表示的容量略大于 GB;换算关系:1 GiB ≈ 1.07374 GB ;1 GB ≈ …...
双系统ubuntu20.04不能外接显示器的解决办法
一,更换驱动 首先确定是不是英伟达显卡驱动,如果不是的话,设置里找到附加驱动,更改为NVIdia类型的驱动,更改完成之后重启 这里大部分电脑都可以了,如果不行 二、更改启动方式 重启之后进入BIOS设置&…...
高并发内存池:原理、设计与多线程性能优化实践
高并发内存池是一种专门为多线程环境设计的内存管理机制,其核心目标是通过优化内存分配和释放过程,解决传统内存分配器(如malloc/free)在高并发场景下的性能瓶颈,显著提升多线程程序的内存访问效率。 目录 一、核心设计…...
03.31-04.06 论文速递 聚焦具身智能、复杂场景渲染、电影级对话生成等五大前沿领域
🌟 论文速递 | 2025.03.31-04.06 📢 聚焦具身智能、复杂场景渲染、电影级对话生成等前沿领域 1️⃣ 具身智能体:从脑启发到安全协作系统 论文标题: Advances and Challenges in Foundation Agents: From Brain-Inspired Intellige…...
Django和Celery实现的异步任务案例
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 先决条件步骤1:安装依赖项步骤2:配置Celery2.1 创建`celery.py`2.2 更新 `__init__.py`步骤3:配置Django设置步骤4:定义Celery任务…...
DAY 38 leetcode 15--哈希表.三数之和
题号15 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 未去重版本 整体思路:先排序再双指针遍…...
Java项目之基于ssm的个性化旅游攻略定制系统(源码+文档)
项目简介 个性化旅游攻略定制系统实现了以下功能: 个性化旅游攻略定制系统能够实现对用户上传信息,旅游路线信息,景点项目信息,景点信息,标签分类信息等信息的管理。 💕💕作者:落落…...
链表和数组的效率
访问元素 • 数组:通过索引直接访问元素,时间复杂度为O(1),速度很快。例如arr[5]可以立即访问到数组arr中索引为5的元素。 • 链表:需要从链表头开始逐个遍历节点,直到找到目标元素,平均时间复杂度为O(n)…...
经典回溯问题———组合的输出
题目如下 思路 代码如下...
WPS宏开发手册——附录
目录 系列文章7、附录 系列文章 使用、工程、模块介绍 JSA语法 JSA语法练习题 Excel常用Api Excel实战 常见问题 附录 7、附录 颜色序列:在excel中设置颜色,只能设置颜色序号,不能直接设置rgb颜色 1、黑色 (Black)…...
【leetcode100】买卖股票的最佳时机
1、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你…...
uniapp小程序登录失效后操作失灵问题
一开始我在请求返回失效验证时做了登录失效处理然后用uni.switchTab跳转主页的逻辑,结果发现在一天后重新打开小程序或者其他登录挤掉登录验证时有概率导致整个页面失灵无法操作。 经过排查发现,在小程序跳转新页面的时候如果遇到**(过快还是过多&#…...
找树左下角的值(DFS 深度优先搜索)| LeetCode 513
✨ 题目描述 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 提示: 二叉树中至少有一个节点。 📄 示例 示例 1 输入: root [2,1,3] 输出: 1示例 2 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7ǵ…...
【力扣hot100题】(060)分割回文串
每次需要判断回文串,这点比之前几题回溯题目复杂一些。 还有我怎么又多写了循环…… class Solution { public:vector<vector<string>> result;string s;bool palindromic(string s){for(int i0;i<s.size()/2;i) if(s[i]!s[s.size()-1-i]) return …...
中国钧瓷收藏市场现状和风险警示
一、数据权威性与综合维度 本榜单由钧瓷联合体、钧瓷频道及钧瓷数据库三方协同制作,通过10项规则综合评估匠人影响力,涵盖知名度、用户评价、平台指数等多元维度,避免单一指标(如拍卖价格)的片面性。榜单每月更新&…...
forms实现任务文档功能
说明: forms实现任务文档功能 效果图: step1:C:\Users\wangrusheng\RiderProjects\WinFormsApp26\WinFormsApp26\Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; u…...
字符串的replace、replaceAll、split()方法
参考 字符串的replace、replaceAll、split()方法_字符串replace-CSDN博客...
Kotlin语言进阶:协程、Flow、Channel详解(二)
Kotlin语言进阶:协程、Flow、Channel详解(二) 一、Flow基础 1.1 什么是Flow Flow是Kotlin提供的用于处理异步数据流的解决方案,它建立在协程之上,具有以下特点: 冷流特性:只有在收集时才会开始发射数据背压处理:自动处理生产者和消费者速度不匹配的问题组合操作:提…...
VBA知识学习
文章目录 打开开发工具编写第一个VBA使用VBA调试器 VBA语法 打开开发工具 文件->选项->自定义功能区->开发工具 编写第一个VBA 点击开发工具 ->点击Visual Basic 选择sheet1->右键->插入->模块 Sub 第一个VBA程序()MsgBox "Hello World!&quo…...
JAVA EE_多线程-初阶(二)
1.线程安全 1.1.观察线程不安全 实例: package thread; public class text18 {//定义一个成员变量count,初始值为0private static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new Thread(()->{for(int i0;i&l…...
【Linux】进程预备知识——冯诺依曼、操作系统
目录: 一、冯诺依曼体系结构 (一)什么是冯诺依曼 (二)为什么需要冯诺依曼 (三)冯诺依曼如何操作 二、操作系统概念 (一)对下硬件管理 (二)…...
Java入门首周精要:从基础语法到面向对象核心解析
文章目录 Java入门首周精要:从基础语法到面向对象核心解析1.Java类名与文件名的一致性规则2.Java和C语言中char类型的区别3.Java中的注释4.Java中的‘’‘’运算符5.Java的输入输出6.方法(重载&重写)方法的重载方法的重写 7.面向对象&…...
嵌入式AI开源生态指南:从框架到应用的全面解析
嵌入式AI开源生态指南:从框架到应用的全面解析 引言 随着人工智能技术的迅速发展,将AI能力部署到边缘设备上的需求日益增长。嵌入式AI通过在资源受限的微控制器上运行机器学习模型,实现了无需云连接的本地智能处理,大幅降低了延…...
MCP server的stdio和SSE分别是什么?
文章目录 一、Stdio:本地进程间通信的核心二、SSE:远程通信与实时推送的利器三、Stdio vs SSE:关键差异对比四、如何选择?场景驱动的决策指南五、实战建议与避坑指南实际操作结语在AI应用开发中,MCP(Model Context Protocol)协议正成为连接大模型与外部资源的核心桥梁。…...
哈希表(闭散列)的实现
目录 概念及定义 闭散列的介绍 闭散列底层实现 哈希表的定义 哈希表的构造 哈希表扩容 哈希表插入 哈希表删除 哈希表查找 概念及定义 哈希表,也成为散列表,在C中unordered_set和unordered_map的底层实现依靠的都是哈希表。 map和set的底层是红…...
Shiro学习(六):Shiro整合CAS实现单点登录
一、单点登录介绍 单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个[应用],用户只需要登录一次就可以访问所有相互信任的应用系统。 一般这种单点登录的实现方案&…...