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

STM32_USB

概述

本文是使用HAL库的USB驱动

因为官方cubeMX生成的hal库做组合设备时过于繁琐

所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备

有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存

插件安装

下载地址 https://github.com/alambe94/I-CUBE-USBD-Composite/releases/tag/V01.00.03

下载pack文件

打开cubeMX

image-20250327112752157

点击这个 之后选择下载的文件 安装

image-20250327112827185

出现这个即为安装成功

image-20250327113051627

生成代码

打开USB 设为设备模式,打开中断

image-20250327143923426

注意设置时钟树

USB需要较为精确的时钟 建议用外部晶振

image-20250327144003378

选择库文件

image-20250327150139349

目前打勾的这俩必选

其余根据需要选择

image-20250327150230465

根据需要选择,注意要在上步开启的库文件中选

image-20250327150308199

在初始化后加入这个函数

MX_USB_DEVICE_Init();

image-20250327161540514

可以去usbd_desc.c里设置VID/PID 某些名称等参数,不同设备有些许不同

image-20250328203448138

虚拟串口(CDC)

概述

串口名是由PC的驱动来决定的,没法在STM32端设置

设置

打开这个

可以在这里设置虚拟的串口数量

注意一个串口要占用2个IN端点和一个OUT端点

image-20250328133231954

也可以设置AL94.I-CUBE-USBD-COMPOSITE_conf.h文件中的_USBD_CDC_ACM_COUNT设置虚拟的CDC串口数量

发送

开始发送

类型名称功能
uint8_tch通道
uint8_t *Buf缓冲区地址
uint16_tLen发送数量
uint8_t输出已经发送的数量
uint8_t CDC_Transmit(uint8_t ch, uint8_t *Buf, uint16_t Len)

发送完成

类型名称功能
uint8_tcdc_ch通道
uint8_t *Buf缓冲区地址
uint32_tLen发送数量
uint8_tepnum端点号
uint8_t错误码
int8_t CDC_TransmitCplt(uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len, uint8_t epnum)

接收

类型名称功能
uint8_tcdc_ch通道
uint8_t *Buf缓冲区地址
uint32_tLen发送数量
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_tcdc_ch通道
uint8_tcmd命令类型
uint8_t *pbuf命令缓冲区
uint16_tlength长度
int8_t错误码
int8_t CDC_Control(uint8_t cdc_ch, uint8_t cmd, uint8_t *pbuf, uint16_t length)

cmdCDC_SET_LINE_CODING时收到来自主机的命令

具体内容生成的函数中有注释

人体工学设备(HID)

概述

全部使用自定义HID设备

根据不同设备设置描述符即可

HID间的复合直接复制就行

eg:鼠标+键盘 直接把鼠标的描述符和键盘的描述符写到一起即可

建立工程

image-20250329144505389

image-20250329144515151

设置

usbd_customhid.h

名称功能
CUSTOM_HID_STR_DESCHID描述
CUSTOM_HID_EPIN_SIZE输入缓冲大小(一般设为64)
CUSTOM_HID_EPOUT_SIZE输出缓冲大小(一般设为64)
USBD_CUSTOMHID_OUTREPORT_BUF_SIZEHID缓冲区(一般设为64)
CUSTOM_HID_FS_BINTERVAL包间隔时间

usbd_custom_hid_if.c

CUSTOM_HID_ReportDesc 设置HID描述符 USBD_CUSTOM_HID_REPORT_DESC_SIZE 同时也要设置配置符大小

image-20250329154822531

APIs

发送数据
类型名称功能
USBD_HandleTypeDef *pdevUSB句柄
uint8_t *report缓冲区
uint16_tlen数据长度
uint8_t错误码
  uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,uint8_t *report, uint16_t len);
接收数据回调

usbd_custom_hid_if.c

类型名称功能
uint8_tevent_idx
uint8_tstate
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按下)
Bit2x轴(正右负左 -127~127)
Bit3y轴(正下负上 -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码虚拟键码
ESC41 [0X29]27 [0x1B]
F158 [0X3a]112 [0x70]
F259 [0X3b]113 [0x71]
F360 [0X3c]114 [0x72]
F461 [0X3d]115 [0x73]
F562 [0X3e]116 [0x74]
F663 [0X3f]117 [0x75]
F764 [0X40]118 [0x76]
F865 [0X41]119 [0x77]
F966 [0X42]120 [0x78]
F1067 [0X43]121 [0x79]
F1168 [0X44]122 [0x7A]
F1269 [0X45]123 [0x7B]
Esc41 [0X29]27 [0x1B]
Back (回退)42 [0X2a]8 [0x08]
Tab43 [0X2b]9 [0x09]
CapLck (大小写)57 [0X39]20 [0x14]
Enter (回车)40 [0X28]13 [0x0D]
Space (空格)44 [0X2c]32 [0x20]
Scroll71 [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]
Ctrl1 [0X01]17 [0x11]
LCtrl (左CTR)1 [0X01]162 [0xA2]
RCtrl16 [0X10]163 [0xA3]
Shift2 [0X02]16 [0x10]
LShift2 [0X02]160 [0xA0]
RShift32 [0X20]161 [0xA1]
Alt4 [0X04]18 [0x12]
LAlt4 [0X04]164 [0xA4]
RAlt64 [0X40]165 [0xA5]
WIN8 [0X08]91 [0x5B]
LWIN8 [0X08]91 [0x5B]
RWIN128 [0X80]92 [0x5C]
A4 [0X04]65 [0x41]
B5 [0X05]66 [0x42]
C6 [0X06]67 [0x43]
D7 [0X07]68 [0x44]
E8 [0X08]69 [0x45]
F9 [0X09]70 [0x46]
G10 [0X0a]71 [0x47]
H11 [0X0b]72 [0x48]
I12 [0X0c]73 [0x49]
J13 [0X0d]74 [0x4A]
K14 [0X0e]75 [0x4B]
L15 [0X0f]76 [0x4C]
M16 [0X10]77 [0x4D]
N17 [0X11]78 [0x4E]
O18 [0X12]79 [0x4F]
P19 [0X13]80 [0x50]
Q20 [0X14]81 [0x51]
R21 [0X15]82 [0x52]
S22 [0X16]83 [0x53]
T23 [0X17]84 [0x54]
U24 [0X18]85 [0x55]
V25 [0X19]86 [0x56]
W26 [0X1a]87 [0x57]
X27 [0X1b]88 [0x58]
Y28 [0X1c]89 [0x59]
Z29 [0X1d]90 [0x5A]
039 [0X27]48 [0x30]
130 [0X1e]49 [0x31]
231 [0X1f]50 [0x32]
332 [0X20]51 [0x33]
433 [0X21]52 [0x34]
534 [0X22]53 [0x35]
635 [0X23]54 [0x36]
736 [0X24]55 [0x37]
837 [0X25]56 [0x38]
938 [0X26]57 [0x39]

大容量存储(MSC)

建立工程

image-20250404233158298

image-20250404233251426

设置

usbd_msc.h 中的 MSC_MEDIA_PACKET 要设为扇区(sector)大小

w25Qxx为4096 SD卡为512

STORAGE_LUN_NBR为虚拟磁盘卷数量 一般把一个设备设为一个卷 设置这个可以虚拟出多个磁盘

usbd_storage_if.cSTORAGE_BLK_NBR 为最小操作单元数量(一般写扇区数量)

usbd_storage_if.cSTORAGE_BLK_SIZ 为最小操作单元大小 (一般写扇区大小) 单位(Byte)

这俩相乘即可得到总大小 单位(Byte)

注意这俩的blk所指的块与FLASH的不同,也是我写成最小操作单元的原因

可以修改这个最后三项来更改显示名称

usbd_storage_if.cSTORAGE_Inquirydata

image-20250405214854576

APIs

存储读取(必写)

描述名称功能
uint8_tlun卷标
uint8_t *buf缓冲区
uint32_tblk_addr最小操作单元起始地址(*STORAGE_BLK_SIZ后得到Byte起始地址 )
uint16_tblk_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_tlun卷标
uint8_t *buf缓冲区
uint32_tblk_addr最小操作单元起始地址(*STORAGE_BLK_SIZ后得到Byte起始地址 )
uint16_tblk_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…...

STM32 的编程方式总结

&#x1f9f1; 按照“是否可独立工作”来分&#xff1a; 库/方式是否可独立使用是否依赖其他库说明寄存器裸写✅ 是❌ 无完全自主控制&#xff0c;无库依赖标准库&#xff08;StdPeriph&#xff09;✅ 是❌ 只依赖 CMSIS自成体系&#xff08;F1专属&#xff09;&#xff0c;只…...

MFC工具栏CToolBar从专家到小白

CToolBar m_wndTool; //创建控件 m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC); //加载工具栏资源 m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定义&#xff1a;IDR_TOOL_LOAD BITMAP …...

vllm作为服务启动,无需额外编写sh文件,一步到位【Ubuntu】

看到网上有的vllm写法&#xff0c;需要额外建立一个.sh文件&#xff0c;还是不够简捷。这里提供一种直接编写service文件一步到位的写法&#xff1a; vi /etc/systemd/system/vllm.service [Unit] DescriptionvLLM Service Afternetwork.target[Service] Typesimple Userroot…...

大厂机考——各算法与数据结构详解

目录及其索引 哈希双指针滑动窗口子串普通数组矩阵链表二叉树图论回溯二分查找栈堆贪心算法动态规划多维动态规划学科领域与联系总结​​ 哈希 ​​学科领域​​&#xff1a;计算机科学、密码学、数据结构 ​​定义​​&#xff1a;通过哈希函数将任意长度的输入映射为固定长度…...

hive中的特殊字符

1、​​UTF-8 编码的非断空格&#xff08;对应 Unicode 码点为 \u00A0&#xff09; 这种空格在网页中常见&#xff08;HTML 中的 &#xff09;&#xff0c;用于阻止文本在换行时被分割。由于它不是标准空格&#xff08;ASCII 20&#xff09;&#xff0c;使用TRIM 函数无法直接…...

10:00开始面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

基于ueditor编辑器的功能开发之给编辑器图片增加水印功能

用户需求&#xff0c;双击编辑器中的图片的时候&#xff0c;出现弹框&#xff0c;用户可以选择水印缩放倍数、距离以及水印所放置的方位&#xff08;当然有很多水印插件&#xff0c;位置大小透明度用户都能够自定义&#xff0c;但是用户需求如此&#xff0c;就自己写了&#xf…...

fabric test-network启动

//按照这个来放&#xff0c;免得出错 mkdir -p $GOPATH/src/github.com/hyperledger cd $GOPATH/src/github.com/hyperledger # 获取fabric-samples源码 git clone https://github.com/hyperledger/fabric-samples.git export FABRIC_LOGGING_SPECdebug cd fabric-samples # …...

【CSS基础】- 02(emmet语法、复合选择器、显示模式、背景标签)

css第二天 一、emmet语法 1、简介 ​ Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法。 ​ 快速生成HTML结构语法 ​ 快速生成CSS样式语法 2、快速生成HTML结构语法 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab…...

centos7系统搭建nagios监控

~监控节点安装 1. 系统准备 1.1 更新系统并安装依赖 sudo yum install -y httpd php php-cli gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel wget unzip sudo yum install -y epel-release # 安装 EPEL 仓库 sudo yum install -y automake autoconf lib…...

docker的几种网络模式

Bridge&#xff08;桥接&#xff09;模式 默认网络模式&#xff1a;Docker的默认网络模式是Bridge模式。工作原理&#xff1a;Docker在宿主机上创建一个虚拟的桥接网络&#xff0c;每个容器在启动时会从这个桥接网络中分配一个IP地址。容器之间可以通过这个桥接网络进行通信。…...

Android 中Intent 相关问题

在回答 Intent 问题时&#xff0c;清晰区分其 定义、类型 和 应用场景。以下是的回答策略&#xff1a; 一、Intent 的核心定义 Intent 是 Android 系统中的 消息传递对象&#xff0c;主要用于三大场景&#xff1a; 2. 隐式 Intent&#xff08;Implicit Intent&#xff09; 三、…...

MCP 服务搭建与配置学习资源部分汇总

MCP 服务搭建与配置学习资源汇总 目录 图文教程GitHub 示例项目视频课程不同开发语言实现案例 图文教程 Cherry Studio 配置 MCP 服务教程 – 介绍如何在 Cherry Studio 客户端中配置 MCP 服务器&#xff0c;让 AI 模型能够自主调用本地/网络工具来完成任务&#xff0c;提升…...

2025.04.09【Sankey】| 生信数据流可视化精讲

文章目录 引言Sankey图简介R语言中的Sankey图实现安装和加载networkD3包创建Sankey图的数据结构创建Sankey图绘制Sankey图 结论 引言 在生物信息学领域&#xff0c;数据可视化是理解和分析复杂数据集的关键工具之一。今天&#xff0c;我们将深入探讨一种特别适用于展示数据流动…...

【码农日常】vscode编码clang-format格式化简易教程

文章目录 0 前言1 工具准备1.1 插件准备1.2 添加.clang-format1.3 添加配置 2 快速上手 0 前言 各路大神都说clangd好&#xff0c;我也来试试。这篇主要讲格式化部分。 1 工具准备 1.1 插件准备 照图安装。 1.2 添加.clang-format 右键添加文件&#xff0c;跟添加个.h或者.c…...

金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类

一、网络数据采集 证券宝是一个免费、开源的证券数据平台&#xff08;无需注册&#xff09;&#xff0c;提供大盘准确、完整的证券历史行情数据、上市公司财务数据等&#xff0c;通过python API获取证券数据信息。 1. 安装并导入第三方依赖库 baostock 在命令提示符中运行&…...

git 如何彻底删除已经提交到远程仓库的文件?而不是覆盖删除?git 如何删除已经提交到本地的文件?从历史记录中彻底清除彻底删除(本地+远程)

git 如何彻底删除已经提交到远程仓库的文件&#xff1f;而不是覆盖删除&#xff1f;git 如何删除已经提交到本地的文件&#xff1f; 覆盖删除&#xff1a; 提交了某个不需要的文件&#xff0c;并push到了远程分支&#xff0c;此时在本地删除该文件&#xff0c;然后再提交一次…...

IP协议之IP,ICMP协议

1.因特网中的主要协议是TCP/IP&#xff0c;Interneet协议也叫TCP/IP协议簇 2.ip地址用点分十进制表示&#xff0c;由32位的二进制表示&#xff0c;两部分组成&#xff1a;网络标识主机标识 3.IP地址分类; A:0.0.0.0-127.255.255.255 B&#xff1a;128.0.0.0-191.255.255.25…...

死锁 手撕死锁检测工具

目录 引言 一.理论联立 1.死锁的概念和原因 2.死锁检测的基本思路 3.有向图在死锁检测中的应用 二.代码实现案例&#xff08;我们会介绍部分重要接口解释&#xff09; 1.我们定义一个线性表来存线程ID和锁ID 2.表中数据的查询接口 3.表中数据的删除接口 4.表中数据的添…...

软考高级-系统架构设计师 案例题-软件架构设计

文章目录 软件架构设计质量属性效用树&#xff0c;质量属性判断必背概念架构风格对比MVC架构J2EE四层结构面向服务架构SOA企业服务总线ESB历年真题【问题1】 &#xff08;12分)【问题2】&#xff08;13分&#xff09; 参考答案历年真题【问题1】&#xff08;12分&#xff09;【…...

JavaScript Date(日期)

JavaScript Date(日期) JavaScript的Date对象是处理日期和时间的一个强大工具。它允许开发者轻松地创建日期对象、格式化日期、计算日期差以及执行各种日期相关的操作。本文将深入探讨JavaScript中的Date对象,包括其创建、格式化、操作以及与其他日期时间的交互。 创建Dat…...

vue+d3js+fastapi实现天气柱状图折线图饼图

说明&#xff1a; vued3jsfastapi实现天气柱状图折线图饼图 效果图&#xff1a; step0:postman 1. 生成天气数据&#xff08;POST请求&#xff09;&#xff1a;URL: http://localhost:8000/generate-data/?year2024&month3&seed42 方法: POST Headers:Content-Type:…...

vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf

一、本文目标 <iframe> 方法预览 pdf 、word vue-pdf 预览pdf 二、<iframe> 方法 2.1、iframe 方法预览需要 浏览器 设置为&#xff1a; chrome&#xff1a;设置-隐私设置和安全性-网站设置-更多内容设置-PDF文档 浏览器访问&#xff1a; chrome://settings/co…...

【NLP 56、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence()&#xff1a; ② decode()&#xff1a; 代码运行流程 ③ padding()&#xff1a; 代码…...

Java性能调优2025:从JVM到Kubernetes的全链路优化策略

摘要 &#x1f4dd; 本文将带你深入探讨2025年Java全链路性能调优的最新实践&#xff0c;从JVM底层优化到Kubernetes集群调优&#xff0c;涵盖GC策略选择、JIT优化、容器化最佳实践等核心内容。通过大量实践案例和代码示例&#xff0c;帮助你构建完整的性能优化知识体系。 目…...

【力扣hot100题】(076)买卖股票的最佳时机

终于来到了最考验智商的贪心算法。 之前做过&#xff0c;但花了不少时间思考&#xff0c;所以这次做的很快。 思路就是记录最小价格&#xff0c;然后一路遍历边调整新的最小价格边比较目前价格和最小价格差价。 class Solution { public:int maxProfit(vector<int>&am…...

Java基础 4.9

1.方法递归调用练习 //请使用递归的方式求出斐波那契数1, 1, 2, 3, 5, 8, 13 //给你一个整数n, 求出它的值是多少 /* 思路 n 1 1 n 2 1 n > 3 前两个数的和 递归的思路 */ public class RecursionExercise01 {public static void main(String[] args) {Mathod mathod ne…...

NDK开发:音视频处理基础

音视频处理基础 一、音视频基础 1.1 音视频基本概念 视频编码格式 H.264/AVCH.265/HEVCVP8/VP9AV1音频编码格式 AACMP3PCMOPUS封装格式 MP4FLVMKVTS1.2 音视频处理流程 视频处理流程 采集(Camera/Screen)预处理(美颜/滤镜)编码(H.264/H.265)封装传输/存储音频处理流程 …...

WPF 组件的宽高绑定另一个组件的宽高的指定比值

0.此方法比较适用于响应式界面,组件的大小需要根据窗体大小改变。 1.创建转换函数,并传入比值 public class SizeConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double d &&…...