stm32week10
stm32学习
七.CAN
7.STM32 CAN外设
标识符过滤器:
每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]

FSCx:位宽设置,置0为16位,置1为32位
FBMx:模式设置,置0为屏蔽模式,置1为列表模式
FFAx:关联模式,置0为FIFO0,置1为FIFO1
FACTx;激活设置,置0,禁用,置1,启用
匹配模式:
若是列表模式,则按设置的ID匹配一个ID
若是屏蔽模式,若屏蔽(mask)为1,则表示该位需严格匹配,为0则不严格匹配
过滤器配置示例:

左移5位或者21位是为了避开后面的RTR、IDE位之类的
CAN的三种测试模式:

CAN的三种工作模式:

位时间特性:

波特率=APB1时钟/分频系数/1位Tq的数量=36MHz/(BRP[9:0]+1)/(1+(TS1[3:0]+1))+(TS2[2:0]+1)
中断:
CAN外设占用4个专用的中断向量
发送中断:发送邮箱空时产生
FIFO0中断:收到一个报文/FIFO0满/FIFO0溢出时产生
FIFO1中断:收到一个报文/FIFO1满/FIFO1溢出时产生
状态改变错误中断:出错/唤醒/进入睡眠时产生
事件标志和中断产生:

时间触发通信:

错误处理和离线恢复:
TEC和REC根据错误的情况增加或者减少
ABOM:置1,开启离线自动恢复,进入离线状态后,就自动开启恢复过程;置0,关闭离线自动恢复,软件必须先请求进入然后再退出初始化模式,随后恢复过程才被开启

8.单个设备的环回测试
初始化代码:
void MyCAN_Init(void)
{// 使能GPIOA和CAN1外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA属于APB2总线RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // CAN1属于APB1总线// 配置CAN_TX引脚(PA12)为复用推挽输出模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PA12对应CAN_TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// 配置CAN_RX引脚(PA11)为上拉输入模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // PA11对应CAN_RXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输入模式速度配置无效GPIO_Init(GPIOA, &GPIO_InitStructure);// CAN总线基本配置CAN_InitTypeDef CAN_InitStructure;CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; // 环回模式(测试模式)CAN_InitStructure.CAN_Prescaler = 48; // 预分频器:36MHz/48=750KHz// 时间段配置(同步段+传播段+相位缓冲段):// 同步段tq=1,BS1=2tq,BS2=3tq → 总周期=1+2+3=6tq → 波特率=750KHz/6=125KbpsCAN_InitStructure.CAN_BS1 = CAN_BS1_2tq; // 同步后采样点位置CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; // 信号重新同步时间CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; // 重新同步跳跃宽度// 其他模式配置(默认关闭高级功能)CAN_InitStructure.CAN_NART = DISABLE; // 禁止自动重传CAN_InitStructure.CAN_TXFP = DISABLE; // 发送优先级由标识符决定CAN_Init(CAN1, &CAN_InitStructure); // 应用配置到CAN1// 过滤器配置(允许所有消息通过)CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber = 0; // 使用过滤器0CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; // 过滤器ID高位CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; // 过滤器ID低位CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; // 过滤器掩码高位CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;// 过滤器掩码低位CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 32位过滤CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 掩码模式CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; // 分配到FIFO0CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; // 启用过滤器CAN_FilterInit(&CAN_FilterInitStructure); // 应用过滤器配置
}
发送接收函数:
// CAN数据发送函数
// 参数:ID - 标准帧ID(0-0x7FF),Length - 数据长度(0-8),Data - 数据指针
void MyCAN_Transmit(uint32_t ID, uint8_t Length, uint8_t *Data)
{CanTxMsg TxMessage; // 定义发送消息结构体TxMessage.StdId = ID; // 设置标准帧IDTxMessage.ExtId = ID; // 扩展帧ID(未使用)TxMessage.IDE = CAN_Id_Standard; // 使用标准帧格式TxMessage.RTR = CAN_RTR_Data; // 数据帧(非远程请求)TxMessage.DLC = Length; // 设置数据长度for (uint8_t i = 0; i < Length; i ++) // 拷贝数据到发送缓冲区{TxMessage.Data[i] = Data[i];}uint8_t TransmitMailbox = CAN_Transmit(CAN1, &TxMessage); // 发送请求// 等待发送完成(带超时保护)uint32_t Timeout = 0;while (CAN_TransmitStatus(CAN1, TransmitMailbox) != CAN_TxStatus_Ok){Timeout++; if (Timeout > 100000) // 超时退出(防止死锁){break;}}
}// 检查接收缓冲区状态
// 返回值:1-有新数据,0-无数据
uint8_t MyCAN_ReceiveFlag(void)
{// 检查FIFO0中待处理消息数量(>0表示有新数据)if (CAN_MessagePending(CAN1, CAN_FIFO0) > 0){return 1;}return 0;
}// CAN数据接收函数
// 参数:ID - 接收到的帧ID,Length - 数据长度,Data - 接收数据缓冲区
void MyCAN_Receive(uint32_t *ID, uint8_t *Length, uint8_t *Data)
{CanRxMsg RxMessage; // 定义接收消息结构体CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); // 从FIFO0读取数据// 根据帧类型获取ID(支持标准帧和扩展帧)if (RxMessage.IDE == CAN_Id_Standard){*ID = RxMessage.StdId;}else{*ID = RxMessage.ExtId;}// 处理数据帧(忽略远程帧)if (RxMessage.RTR == CAN_RTR_Data){*Length = RxMessage.DLC; // 获取数据长度for (uint8_t i = 0; i < *Length; i ++){Data[i] = RxMessage.Data[i]; // 拷贝接收数据}}else{// 此处可添加远程帧处理逻辑}
}
9.数据帧-遥控帧
// 自定义 CAN 发送函数,用于将 CAN 消息发送出去
void MyCAN_Transmit(CanTxMsg *TxMessage)
{// 调用 CAN_Transmit 函数尝试将消息发送到 CAN1 总线,并获取使用的发送邮箱编号uint8_t TransmitMailbox = CAN_Transmit(CAN1, TxMessage);// 初始化超时计数器uint32_t Timeout = 0;// 循环检查消息是否发送成功while (CAN_TransmitStatus(CAN1, TransmitMailbox) != CAN_TxStatus_Ok){// 超时计数器递增Timeout ++;// 如果超时计数器超过 100000,退出循环if (Timeout > 100000){break;}}
}// 自定义 CAN 接收函数,用于从 CAN1 总线接收消息
void MyCAN_Receive(CanRxMsg *RxMessage)
{// 调用 CAN_Receive 函数从 CAN1 的 FIFO0 接收消息CAN_Receive(CAN1, CAN_FIFO0, RxMessage);
}
主函数中的测试程序:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "MyCAN.h"uint8_t KeyNum;// 定义一个 CAN 发送消息数组,包含多条不同的 CAN 消息
CanTxMsg TxMsgArray[] = {
/* StdId ExtId IDE RTR DLC Data[8] */{0x555, 0x00000000, CAN_Id_Standard, CAN_RTR_Data, 4, {0x11, 0x22, 0x33, 0x44}},{0x000, 0x12345678, CAN_Id_Extended, CAN_RTR_Data, 4, {0xAA, 0xBB, 0xCC, 0xDD}},{0x666, 0x00000000, CAN_Id_Standard, CAN_RTR_Remote, 0, {0x00, 0x00, 0x00, 0x00}},{0x000, 0x0789ABCD, CAN_Id_Extended, CAN_RTR_Remote, 0, {0x00, 0x00, 0x00, 0x00}},
};// 定义发送消息数组的索引变量
uint8_t pTxMsgArray = 0;// 定义 CAN 接收消息结构体变量
CanRxMsg RxMsg;int main(void)
{OLED_Init();Key_Init();MyCAN_Init();OLED_ShowString(1, 1, " Rx :");OLED_ShowString(2, 1, "RxID:");OLED_ShowString(3, 1, "Leng:");OLED_ShowString(4, 1, "Data:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){// 调用自定义 CAN 发送函数,发送当前索引对应的 CAN 消息MyCAN_Transmit(&TxMsgArray[pTxMsgArray]);// 发送消息数组索引递增pTxMsgArray ++;// 如果索引超过数组长度,将索引重置为 0if (pTxMsgArray >= sizeof(TxMsgArray) / sizeof(CanTxMsg)){pTxMsgArray = 0;}}// 如果有 CAN 接收标志if (MyCAN_ReceiveFlag()){// 调用自定义 CAN 接收函数,接收 CAN 消息MyCAN_Receive(&RxMsg);// 如果接收到的消息是标准帧if (RxMsg.IDE == CAN_Id_Standard){// 在 OLED 第一行显示 "Std"OLED_ShowString(1, 6, "Std");// 在 OLED 第二行显示标准 ID 的十六进制值OLED_ShowHexNum(2, 6, RxMsg.StdId, 8);}// 如果接收到的消息是扩展帧else if (RxMsg.IDE == CAN_Id_Extended){// 在 OLED 第一行显示 "Ext"OLED_ShowString(1, 6, "Ext");// 在 OLED 第二行显示扩展 ID 的十六进制值OLED_ShowHexNum(2, 6, RxMsg.ExtId, 8);}// 如果接收到的消息是数据帧if (RxMsg.RTR == CAN_RTR_Data){// 在 OLED 第一行显示 "Data "OLED_ShowString(1, 10, "Data ");// 在 OLED 第三行显示数据长度的十六进制值OLED_ShowHexNum(3, 6, RxMsg.DLC, 1);// 在 OLED 第四行显示数据的十六进制值OLED_ShowHexNum(4, 6, RxMsg.Data[0], 2);OLED_ShowHexNum(4, 9, RxMsg.Data[1], 2);OLED_ShowHexNum(4, 12, RxMsg.Data[2], 2);OLED_ShowHexNum(4, 15, RxMsg.Data[3], 2);}// 如果接收到的消息是远程帧else if (RxMsg.RTR == CAN_RTR_Remote){// 在 OLED 第一行显示 "Remote"OLED_ShowString(1, 10, "Remote");// 在 OLED 第三行显示数据长度的十六进制值OLED_ShowHexNum(3, 6, RxMsg.DLC, 1);// 在 OLED 第四行显示 0x00 的十六进制值OLED_ShowHexNum(4, 6, 0x00, 2);OLED_ShowHexNum(4, 9, 0x00, 2);OLED_ShowHexNum(4, 12, 0x00, 2);OLED_ShowHexNum(4, 15, 0x00, 2);}}}
}
10.定时发送
// 此函数用于初始化定时器2,设置其工作模式、定时周期、中断等参数
void Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 配置定时器2使用内部时钟源。定时器可以使用内部或外部时钟源,这里选择内部时钟TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);// 清除定时器2的更新标志位。在初始化时清除标志位,避免误触发中断TIM_ClearFlag(TIM2, TIM_FLAG_Update);// 使能定时器2的更新中断。当定时器产生更新事件时,会触发中断服务函数TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置NVIC(嵌套向量中断控制器)的优先级分组为2。这决定了中断的抢占优先级和子优先级的分配方式NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;// 设置NVIC的中断通道为定时器2中断NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;// 使能定时器2的中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// 设置定时器2中断的抢占优先级为2。抢占优先级高的中断可以打断正在执行的低优先级中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 设置定时器2中断的子优先级为1。在抢占优先级相同的情况下,子优先级高的中断先执行NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2, ENABLE);
}
#include "stm32f10x.h" // 包含STM32F10x系列微控制器的头文件,用于访问硬件寄存器和外设
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "MyCAN.h"
#include "Timer.h"uint8_t KeyNum;uint8_t TimingFlag;
uint8_t TriggerFlag;
uint8_t RequestFlag;// 定义定时发送的CAN消息结构体
CanTxMsg TxMsg_Timing = {.StdId = 0x100, // 标准标识符.ExtId = 0x00000000, // 扩展标识符.IDE = CAN_Id_Standard, // 使用标准标识符.RTR = CAN_RTR_Data, // 消息类型为数据帧.DLC = 4, // 数据长度为4字节.Data = {0x11, 0x22, 0x33, 0x44}
};// 定义触发发送的CAN消息结构体
CanTxMsg TxMsg_Trigger = {.StdId = 0x200, // 标准标识符.ExtId = 0x00000000, // 扩展标识符.IDE = CAN_Id_Standard, // 使用标准标识符.RTR = CAN_RTR_Data, // 消息类型为数据帧.DLC = 4, // 数据长度为4字节.Data = {0x11, 0x22, 0x33, 0x44}
};// 定义请求发送的CAN消息结构体
CanTxMsg TxMsg_Request = {.StdId = 0x300, // 标准标识符.ExtId = 0x00000000, // 扩展标识符.IDE = CAN_Id_Standard, // 使用标准标识符.RTR = CAN_RTR_Data, // 消息类型为数据帧.DLC = 4, // 数据长度为4字节.Data = {0x11, 0x22, 0x33, 0x44}
};// 定义接收CAN消息的结构体
CanRxMsg RxMsg;int main(void)
{OLED_Init();Key_Init();MyCAN_Init();Timer_Init();// 在OLED显示屏上显示标题OLED_ShowString(1, 1, "Tx");OLED_ShowString(2, 1, "Tim:");OLED_ShowString(3, 1, "Tri:");OLED_ShowString(4, 1, "Req:");// 主循环while (1){/*定时发送*/if (TimingFlag == 1){// 清除定时标志位TimingFlag = 0;TxMsg_Timing.Data[0] ++;TxMsg_Timing.Data[1] ++;TxMsg_Timing.Data[2] ++;TxMsg_Timing.Data[3] ++;MyCAN_Transmit(&TxMsg_Timing);OLED_ShowHexNum(2, 5, TxMsg_Timing.Data[0], 2);OLED_ShowHexNum(2, 8, TxMsg_Timing.Data[1], 2);OLED_ShowHexNum(2, 11, TxMsg_Timing.Data[2], 2);OLED_ShowHexNum(2, 14, TxMsg_Timing.Data[3], 2);}/*触发发送*/KeyNum = Key_GetNum();if (KeyNum == 1){// 设置触发标志位TriggerFlag = 1;}if (TriggerFlag == 1){// 清除触发标志位TriggerFlag = 0;TxMsg_Trigger.Data[0] ++;TxMsg_Trigger.Data[1] ++;TxMsg_Trigger.Data[2] ++;TxMsg_Trigger.Data[3] ++;MyCAN_Transmit(&TxMsg_Trigger);OLED_ShowHexNum(3, 5, TxMsg_Trigger.Data[0], 2);OLED_ShowHexNum(3, 8, TxMsg_Trigger.Data[1], 2);OLED_ShowHexNum(3, 11, TxMsg_Trigger.Data[2], 2);OLED_ShowHexNum(3, 14, TxMsg_Trigger.Data[3], 2);}/*请求发送*/if (MyCAN_ReceiveFlag()){// 接收CAN消息MyCAN_Receive(&RxMsg);// 判断是否为标准帧、远程帧且标识符为0x300if (RxMsg.IDE == CAN_Id_Standard &&RxMsg.RTR == CAN_RTR_Remote &&RxMsg.StdId == 0x300){// 设置请求标志位RequestFlag = 1;}// 判断是否为标准帧、数据帧且标识符为0x3FFif (RxMsg.IDE == CAN_Id_Standard &&RxMsg.RTR == CAN_RTR_Data &&RxMsg.StdId == 0x3FF){// 设置请求标志位RequestFlag = 1;}}if (RequestFlag == 1){// 清除请求标志位RequestFlag = 0;TxMsg_Request.Data[0] ++;TxMsg_Request.Data[1] ++;TxMsg_Request.Data[2] ++;TxMsg_Request.Data[3] ++;MyCAN_Transmit(&TxMsg_Request);OLED_ShowHexNum(4, 5, TxMsg_Request.Data[0], 2);OLED_ShowHexNum(4, 8, TxMsg_Request.Data[1], 2);OLED_ShowHexNum(4, 11, TxMsg_Request.Data[2], 2);OLED_ShowHexNum(4, 14, TxMsg_Request.Data[3], 2);}}
}// 定时器2中断服务函数
void TIM2_IRQHandler(void)
{// 判断定时器2更新中断标志位是否置位if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){// 设置定时标志位TimingFlag = 1;// 清除定时器2更新中断标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
八.stm32基础
1.介绍

Cortex内核分类:

STM32微控制器有多种封装类型,每种封装类型都有其特定的特点和应用场景
常见的STM32封装类型:
- LQFP:LQFP封装是一种常见的平面封装类型,具有四边引脚,适用于大多数通用应用。LQFP封装的引脚数量从32到144不等,适合需要较多引脚的应用
- VFQFPN:VFQFPN封装是一种无引脚封装类型,具有较小的占用空间和较好的散热性能
- BGA:BGA封装是一种高密度封装类型,具有球形引脚阵列,适用于高性能和高密度的应用
LQFP144:

复位电路:

boot启动电路:

Cortex-M内核有硬件调试模块(JTAG和SWD调试接口),该模块可在取指(指令断点)或访问数据(数据断点)时停止。内核停止时,可以查询内核的内部状态和系统的外部状态。完成查询后,可恢复程序执行
F1系列可以通过AFIO_MAPR寄存器的SWJ_CFG[2:0]位来释放部分或者全部SWJ-DP引脚
相关文章:
stm32week10
stm32学习 七.CAN 7.STM32 CAN外设 标识符过滤器: 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0] FSCx:位宽设置,置0为16位,置1为32位 FBMx:模式设置,置0为屏蔽模式,…...
【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
Unity 编辑器扩展:3D 空间中绘制安全区棱柱体(含撤销/恢复/保存/读取) 在虚拟现实(VR)和增强现实(AR)开发中,安全区是保障用户安全的重要组成部分。通过精确控制用户活动范围&#…...
C++小游戏 合集
生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…...
常州 d??
回来了! 今天(?发出来的时候可能已经是第二天了吧 真的爆零了qaq 挺难的 最高分只有100 而且t2t3t4一个人都没拿分qaq 这段时间在写网络流 唉博客还是不要写太水了 抄一点网络流代码上来 EK不写了 dinic会就行了 板子题洛谷p3376 dini…...
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略 1. juc包下的常用类:线程池:并发集合类:同步工具类:原子类: 2. 怎么保证多线程安全:3. Java中常用锁及使用场景:4. 线程同步的方法…...
学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
论文阅读:Inductive Matrix Completion Using Graph Autoencoder 代码:swtheing/IMC-GAE 总而言之就是设计了一个不同评分下的邻接图,然后对每一个评分图T进行独立GNN编码。这个 GNN 编码器主要由三个组件构成:嵌入层、消息传递层…...
FPGA入门:状态机思想编程
一、状态机思想编写流水灯 1、状态机思想的概念 状态机思想是一种用于描述和处理具有多个状态以及状态之间转换关系的系统的思维方式。以下是对其主要概念、应用场景和优势的介绍: 主要概念 状态:指系统在某一时刻的状况或条件。例如,在一…...
【电路笔记】-切换触发器
切换触发器 文章目录 切换触发器1、概述2、切换触发器3、JK触发器转换为D型触发器4、D型触发器转换为切换触发器切换触发器是常用的时序逻辑电路,作为单个比特双稳态存储元件,在计数器、存储器设备中经常使用,或作为响应时钟脉冲的分频器。 1、概述 切换触发器是另一种基于…...
示例项目文档模板集:TaskBoard 任务管理系统
一套完整、高可读性、结构清晰的项目文档模板,适用于中小型软件项目的设计、开发、交接与展示全流程。 📌 项目概述文档(overview.md) 📂 项目名称:TaskBoard 🧭 项目简介 TaskBoard 是一款专为敏捷团队打造的任务管理系统,支持任务分配、状态追踪与协作沟通,帮…...
TF-IDF忽略词序问题思考
自从开始做自然语言处理的业务,TF-IDF就是使用很频繁的文本特征技术,他的优点很多,比如:容易理解,不需要训练,提取效果好,可以给予大规模数据使用,总之用的很顺手,但是人…...
代理模式的优缺点是什么?
什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建代理对象来控制对原始对象的访问。 这种模式在前端开发中广泛应用,特别是在需要控制对象访问、添加额外逻辑或优化性能的场景中。 核心…...
十分钟上手:Distilling the Knowledge in a Neural Network
概述:知识蒸馏是一种模型压缩技术,通过让轻量化的学生模型模仿复杂教师模型的输出概率分布,结合软目标和硬目标进行训练,从而将教师模型的泛化能力迁移至学生模型,实现小模型的高效部署而不显著降低性能。 硬目标&…...
百度的deepseek与硅基模型的差距。
问题: 已经下载速度8兆每秒,请问下载30G的文件需要多长时间? 关于这个问题。百度的回答如下: 30GB文件下载时间计算 理论计算(基于十进制单位): 单位换算 文件大小:3…...
OpenCV 图形API(18)用于执行两个矩阵(或数组)的逐元素减法操作函数sub()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算两个矩阵之间的逐元素差值。 sub 函数计算两个矩阵之间的差值,要求这两个矩阵具有相同的尺寸和通道数: dst ( I ) src…...
布谷一对一直播源码android版环境配置流程及功能明细
一:举例布谷交友(一对一直播源码)搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统,硬盘最低 40G 2. 安装宝塔环境 https://bt.cn(强烈推荐使用) 3. 安装环境 ● PHP 7.3(安装redis扩展…...
#MongoDB 快速上手
docker pull mongo docker run -d --name my-mongo -p 27017:27017 mongo docker exec -it my-mongo mongo 🚪进入 Mongo Shell 后的第一步 你进入后会看到类似提示符: >说明已经进入 Mongo Shell,现在就可以操作数据库了。 …...
docker相关命令
常用命令 #创建并启动 docker-compose up -d # 启动之后就可以通过浏览器访问了 #停止并删除 docker-compose down #重启 docker-compose restart #停止 docker-compose stop #启动 docker-compose startdocker search #搜索镜像(只搜索官方仓库的,官方仓库地址&am…...
浅谈进程与程序的区别
如大家所了解的,进程与程序是有区别的。 下面做了一个总结,供大家参考、学习: 1. 程序是指令的有序集合,是一个静态的概念,其本身没有任何运行的含义。进程是程序在 CPU 上的一次执行过程,是一个动态的概…...
redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比
Redis 存储 JSON 键值对示例 存储操作: // 存储用户信息(键:user:1001,值:JSON对象) SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…...
基于chatgpt得到的生活成本计算
意大利的生活成本因城市而异,比如米兰和罗马相对较贵,而南部城市如那不勒斯或巴勒莫则便宜一些。下面是意大利大致的基本生活成本和费用明细(以欧元€为单位,2025年初数据为基础,具体数值可能随时间和汇率略有变化&…...
C和C++有什么区别?
C和C是两种不同的编程语言,虽然它们有许多相似之处,但也存在一些关键的区别。 C是一种过程化编程语言,专注于函数和流程控制,非常适合系统级编程。而 C是一种面向对象编程语言,支持类、对象和封装、继承、多态等特性。…...
力扣1338 === 贪心算法解决数组减半问题
目录 问题分析 方法思路:贪心算法 步骤分解 代码解释 复杂度分析 正确性证明 示例验证 边界情况 总结 要解决这个问题,我们需要找到最少需要删除的不同整数集合,使得剩余的元素个数不超过原数组的一半。以下是对该问题的详细分析和解…...
企业知识库如何搭建?应对高频咨询的AI自助问答系统
在客户服务和内部沟通中,“同样的问题被反复问”、“信息找不到”、“新员工上手慢”等现象屡见不鲜。为了提升企业运营效率,越来越多企业开始重视知识库建设,而“企业知识库如何搭建”也成为热门话题。 尤其在AI技术快速发展的今天…...
UE5学习笔记 FPS游戏制作44 统一UI大小 sizeBox
如果我们希望多个类似的UI大小一样,例如不同菜单的标题,可以使用sizeBox组件 我们在标题控件上,用sizeBox包裹所有子物体 然后指定他的最小宽高,或最大宽高 如果指定的是最小宽高,当子元素(如图片…...
SpringAOP新链浅析
前言 在复现CCSSSC软件攻防赛的时候发现需要打SpringAOP链子,于是跟着前人的文章自己动手调试了一下 参考了大佬的文章 https://gsbp0.github.io/post/springaop/#%E6%B5%81%E7%A8%8B https://mp.weixin.qq.com/s/oQ1mFohc332v8U1yA7RaMQ 正文 依赖于Spring-AO…...
高效网页截图利器:支持长截图、异步加载内容截图、API调用、Docker一键部署!
一、简介 利用playwright自动化工具,模拟浏览器打开网页,实现完整网页截图功能支持长截图,支持异步加载动态渲染内容截图支持docker一键部署支持API调用项目地址:https://github.com/luler/hello_screenshot 二、安装 提前安装好d…...
处理语言模型返回的响应
completion.choices[0].message.content 是在处理语言模型(如 OpenAI 的 GPT 系列)返回的响应时,用于 访问模型生成的文本内容的代码路径。为了更好地理解它,我们需要先了解语言模型响应的结构。 1. 响应的结构 当使用语言模型&…...
Go语言类型捕获及内存大小判断
代码如下: 类型捕获可使用:reflect.TypeOf(),fmt.Printf在的%T。 内存大小判断:len(),unsafe.Sizeof。 package mainimport ("fmt""unsafe""reflect" )func main(){var i , j 1, 2f…...
Java 大视界 -- Java 大数据机器学习模型在智能客服多轮对话系统中的优化策略(179)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
CAS号:288574-78-7,Zinpyr-1可用作PET传感器
试剂描述: Zinpyr-1(ZP-1)是一种具细胞膜渗透性的荧光探针,选择性检测锌离子(Zn2)(Kd 0.7 0.1 nM)。一旦与金属离子复合,诱发荧光信号产生。活细胞内,Zinpyr…...
【JVM调优实战指南:从案例分析到性能优化】
一、JVM 调优核心原则 JVM 调优旨在平衡系统的吞吐量、延迟和内存使用。在进行 JVM 调优时,我们可以遵循以下原则: 先优化代码:优先排查业务逻辑中的内存泄漏、对象滥用等问题。优化代码不仅能从根本上解决性能问题,还能减少对 J…...
交换机转发原理 和 DNS服务
1. 收到报文后,将其转换为二进制,并记录在缓存当中 2. 根据二进制中的源 MAC 地址,与接收报文的接口,记录对应关系,在 MAC 地址表中,每个动态表项 300S 老化时间。 3. 判断 如果目的 MAC 是组播或广…...
强化学习Q-Learning:DQN
强化学习Q-Learning/DQN 本文是一篇学习笔记,主要参考李宏毅老师的强化学习课程。 目前主流的强化学习方法大致可以分为 policy-based 和 value-based 两大类。之前我们介绍的 policy gradient 策略梯度,就是 policy-based 的方法。本文要介绍的 Q-learn…...
OpenCv(七)——模板匹配、打包、图像的旋转
目录 一、模板匹配 模板匹配原理 1、单模板之间的匹配 (1)读取并显示待匹配的图片和模板图片 (2)模板匹配并绘制匹配位置的外接矩形 (3)显示最终的效果 2、模板与多个对象匹配,仅匹配当前…...
汽车售后诊断 ODX 和 OTX 对比分析报告
一、引言 在汽车行业不断发展的当下,汽车售后诊断技术对于保障车辆性能、维护车主权益以及提升汽车品牌服务质量起着至关重要的作用。随着汽车电子化程度的不断提高,售后诊断所涉及的数据和流程愈发复杂,这就促使行业需要更加标准化、高效化…...
关于图卷积
深入理解神经网络中的图卷积 一、为什么需要图卷积(动机) 在图结构中,比如: 社交网络(节点是人,边是朋友关系)分子结构(节点是原子,边是化学键)知识图谱&a…...
Meta LLaMA 4:对抗 GPT-4o 与 Claude 的开源王牌
2025 年 4 月,Meta 正式发布了 LLaMA 4 系列的首批两款模型。 这两款模型模型分别是:LLaMA 4 Scout 与 LLaMA 4 Maverick,均采用了 专家混合架构(Mixture-of-Experts, MoE)。 据 Meta 表示,这是首次有 …...
如何进行SQL调优
如何进行SQL调优 SQL 调优是优化数据库查询性能的过程,目的是减少查询的执行时间,提高数据库系统的整体效率。SQL 调优的技巧和方法可以针对不同的数据库管理系统(DBMS)有所不同,但基本的原则和步骤是相似的。以下是一…...
WAF防护规则配置技巧与企业级安全实践指南
面对日益复杂的Web应用攻击,WAF规则配置直接决定防护体系的有效性。本文深度解析规则优先级编排、误报消减策略、智能学习机制等17项关键技术,结合金融行业API攻击案例与Gartner最新防御框架,为企业提供可落地的WAF优化路径。 WAF规则引擎的…...
第16届蓝桥杯单片机模拟试题Ⅱ
试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //ds1302.c extern unsigned char time[3]; void w_ds1302(); void r_ds1302(); //iic.c float v_adc(unsigned char addr); //sys.c extern float light_v; extern float rb2_v; exte…...
机器学习——ROC曲线、PR曲线
一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴(假正率,FPR): 表示负样本被错误分类为正的比例(越小越好) 2.纵轴(真正率,TPR,即召回率): 表示正样…...
Flutter之交互事件
目录: 1、点击事件标准案例1.1、效果图2.1、代码实现 1、点击事件标准案例 1.1、效果图 2.1、代码实现 class FavoriteWidget extends StatefulWidget {const FavoriteWidget({super.key});overrideState<FavoriteWidget> createState() > _FavoriteWidge…...
深入解析Spring Boot自动装配:原理、设计与最佳实践
引言 Spring Boot作为现代Java开发中的一股清流,凭借其简洁、快速和高效的特性,迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中,自动装载(Auto-configuration)无疑是最为耀眼的明珠之一。本文将深入剖析Sp…...
【责任链】模式解决流程中多个接口的流程问题
业务需求 整体流程有5步骤,每个步骤调用一个接口,每个接口成功才能进行下一步。如a->b->c->d->e, 比如入学报到 a:报班,根据名字生成学号uid b:根据学号分配班级获取班级编号cid c:…...
excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )
目录 1. #N/A2. #VALUE!3. #REF!4. #DIV/0!5. #NUM!6. #NAME?7. #NULL!8.图表总结 在 Excel 中,可能会遇到以下常见的错误值,每个都有特定的含义和成因: 1. #N/A 含义: 表示“Not Available”(不可用)。…...
【湖南大学】2025我们该如何看待DeepSeek
大家好,我是樱木。 DeepSeek 官方网站:https://www.deepseek.com/ 一、DeepSeek 到底是什么? TA 到底厉害在哪里? 故事从 ChatGPT 说起 去年我们看到 Open AI 发布ChatGPT 后,全球的注意力到了 AI 身上。 我们来拆…...
RAG中构建个人知识库
1. 添加本地模型 1.1 查看本地模型 ollama list1.2 ragflow添加本地模型 1.3 系统模型配置 2. 构建知识库 2.1 准备知识库素材 2.2 配置知识库 2.3 知识库绑定素材文件 上传文件素材 - 解析文件 3. 构建交互系统 3.1 配置助理 3.2 完善提示词 3.3 设置模型参数 4. 体验效…...
在 Kubernetes (k8s) 中,apiserver 的 IIP和 VIP的区别
在 Kubernetes (k8s) 中,apiserver 的 IIP(Internal IP) 和 VIP(Virtual IP) 是与集群网络通信和高可用性设计相关的两个重要概念。 IIP(Internal IP) 定义: IIP 是 apiserver 所在…...
OpenCV--图像形态学
在图像处理领域,图像形态学是一种基于形状进行图像分析的有力工具,广泛应用于图像分割、特征提取、边缘检测、图像降噪等多个方面。借助 OpenCV 这个强大的计算机视觉库,我们可以轻松实现各种图像形态学操作。本文将深入探讨图像形态学的基本…...
智慧医疗数据集
WiNGPT2 更新时间:2024-11-29 访问地址: GitHub 描述: WiNGPT是一个基于GPT的医疗垂直领域大模型,旨在将专业的医学知识、医疗信息、数据融会贯通,为医疗行业提供智能化的医疗问答、诊断支持和医学知识等信息服务,…...