河北省建设项目环保备案网站/搜索量排名

河北省建设项目环保备案网站,搜索量排名,网页设计策划书方案,哈尔滨中国建设银行网站首页本文介绍stm32上usb的常用功能虚拟串口和DFU(Download Firmware Update) 文章目录 前言一、usb二、虚拟串口1.cubemx配置1.我们选用高速usb,然后选择内部低速的phy,这样使用的usb,最高速度为12Mbit每秒。2.USB_DEVICE cdc类配置3.时钟配置&am…

本文介绍stm32上usb的常用功能虚拟串口和DFU(Download Firmware Update)

文章目录

  • 前言
  • 一、usb
  • 二、虚拟串口
    • 1.cubemx配置
        • 1.我们选用高速usb,然后选择内部低速的phy,这样使用的usb,最高速度为12Mbit每秒。
        • 2.USB_DEVICE cdc类配置
        • 3.时钟配置,USB需要使能外设时钟,且好像只能倍频为48M
        • 4.最小的堆栈大小也设置的大一点,不然端口识别会出现错误。
        • 5.发送和接收函数
    • 2.使用usb的dfu实现iap
      • 1.cubemx
    • 3.代码
  • tips


前言

USB虚拟串口不仅简化了硬件设计,避免了传统串口电平转换芯片的使用,还能提供更稳定的通信速率和更远的传输距离。对于调试信息输出、数据采集与监控等应用场景来说,USB虚拟串口是一种非常实用的技术方案。此外,通过USB实现DFU功能,使得用户可以在不依赖额外硬件工具的情况下,方便快捷地对STM32设备进行固件更新,极大地提高了产品的可维护性和用户体验。


提示:以下是本篇文章正文内容,下面案例可供参考

一、usb

关于usb可以看这篇文章
STM32-USB学习系列(一) :USB与USB库的介绍

我们需要用到的USB的CDC(Communications Device Class)是一种用于通过USB接口实现设备间通信的协议。它旨在为各种类型的通信接口提供标准化的方法,包括但不限于虚拟串口、调制解调器等。CDC通常被用来让计算机与外部设备进行数据交换,例如连接到计算机的手机、网络摄像头或其他外围设备。

CDC类可以进一步分为多个子类,其中最常见的是抽象控制模型(Abstract Control Model, ACM),这通常用于模拟传统的串行端口通信。这对于需要通过串行通信来传输数据的设备特别有用,比如一些物联网设备、嵌入式系统或者需要固件更新的硬件。

使用CDC的一个主要优点是,它可以使得基于串行通信的设备无需物理串行端口即可与现代计算机系统通信,因为很多新式的计算机已经去除了传统的RS-232串行接口。此外,许多操作系统对CDC有内置的支持,这意味着不需要额外安装驱动程序就可以识别和使用这些设备,简化了用户的操作体验。

二、虚拟串口

1.cubemx配置

我的实验板子是野火的f429挑战者v1,他比较奇怪的一点是他用的应该是全速的usb,但是引脚用的是高速usb的引脚,然后有id信号线,看起来像是高速的,但是我又没看到高速的usb phy。是我的理解有问题吗,有没有知道的能解答一下。
在这里插入图片描述

1.我们选用高速usb,然后选择内部低速的phy,这样使用的usb,最高速度为12Mbit每秒。

其他的选项不做处理。
在这里插入图片描述

2.USB_DEVICE cdc类配置

需要注意的是,要确定自己的是大存储芯片还是小存储芯片,如果是f103c8t6,这里的TX 和 RX buffer size 应该是1024

在这里插入图片描述

3.时钟配置,USB需要使能外设时钟,且好像只能倍频为48M

我一开始倍频为45M时,会显示时钟错误。而且时钟最好在使能usb之后再去配置,我遇到过先配置了时钟,再配置usb,然后后面时钟再配置的时候,usb外设时钟一直没有使能。
在这里插入图片描述

4.最小的堆栈大小也设置的大一点,不然端口识别会出现错误。

在这里插入图片描述

5.发送和接收函数

接收函数

static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 11 */USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceHS);// CDC_Transmit_HS(Buf,*Len);user_usb_vpc_func(Buf,*Len);//用户定义函数return (USBD_OK);/* USER CODE END 11 */
}

发送函数

void user_usb_vpc_func(uint8_t* Buf, uint32_t Len)
{CDC_Transmit_HS(Buf,Len);//数据回环发送
}

2.使用usb的dfu实现iap

dfu:Device Firmware Upgrade
iap:In-Application Programming,IAP指的是在不使用外部编程器的情况下,在设备正在运行的应用程序中直接对存储在其内部或外部闪存中的固件进行编程的能力
我们常用的iap手段有
串口:优点是方便,硬件涉及简单,缺点是速度慢,速度在几KB撑死了,而且在出品后的现场环境中,串口往往没有引出来。
sd:优点是速度快,就算是普通的sd卡接口,也能到25M,使用简单,不需要上位机。缺点,如果需要频繁的升级则需要频繁的插拔和sd卡中的固件更新。而且需要额外的器件(sd卡)。
usb:优点是速度较快,全速在12M,高速可以上百兆(单片机会限速),而且使用方便,不用频繁的插拔。缺点:需要上位机。
网络:优点是速度快,几十兆肯定能做到,使用方便,不用插拔。缺点,硬件成本较,技术要求相对较高,而且现场环境未必能支持你做网络升级。

我在h7上做开发的时候,因为程序非常大,烧录很慢,所以我就是用高速usb烧录,然后仿真不擦除的去做调试。

要使用iap,我们需要两个工程,一个是正常的应用程序,一个引导程序。
引导程序(bootloader)是用来做接收新固件程序和擦除改写应用程序的flash的。
关于iap的介绍可以看这个
STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

简单来举例说明,我需要两个工程APP(用户应用程序)和bootloader,stm32f429的flash程序起始地址为0x08000000,大小为0x100000。
其中一半用来做bootloader的程序地址,一半用来做app的程序地址。(具体分配可以随意来,app的大小可以稍微大一点。但是注意flash的地址是按页划分的,所以两个程序分配的大小也需要按页来分。)
bootloader addr:0x08000000,size:0x100000(因为他需要访问app的flash地址并作擦除和写入操作)

在这里插入图片描述
app addr:0x08080000,size:0x80000
在这里插入图片描述

1.cubemx

usb配置和虚拟串口一样。

在这里插入图片描述

这是软件实现流程
在这里插入图片描述

3.代码

usbd_dfu_if.c


/* USER CODE BEGIN PRIVATE_DEFINES */
#define FLASH_ERASE_TIME (uint16_t)50
#define FLASH_PROGRAM_TIME (uint16_t)50
// APP存放的结束地址
#define USBD_DFU_APP_END_ADD 0x08100000
// FLASH页大小
#define FLASH_PAGE_SIZE 0x800U // 2K#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000)  /* Base address of Sector 0, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000)  /* Base address of Sector 1, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000)  /* Base address of Sector 2, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000)  /* Base address of Sector 3, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000)  /* Base address of Sector 4, 64 Kbytes   */
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000)  /* Base address of Sector 5, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000)  /* Base address of Sector 6, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000)  /* Base address of Sector 7, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000)  /* Base address of Sector 8, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000)  /* Base address of Sector 9, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base address of Sector 10, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base address of Sector 11, 128 Kbytes  */
/* USER CODE END PRIVATE_DEFINES */
/*** @}*//** @defgroup USBD_DFU_Private_Macros* @brief Private macros.* @{*//* USER CODE BEGIN PRIVATE_MACRO *//* USER CODE END PRIVATE_MACRO *//*** @}*//** @defgroup USBD_DFU_Private_Variables* @brief Private variables.* @{*//* USER CODE BEGIN PRIVATE_VARIABLES *//* USER CODE END PRIVATE_VARIABLES *//*** @}*//** @defgroup USBD_DFU_Exported_Variables* @brief Public variables.* @{*/extern USBD_HandleTypeDef hUsbDeviceHS;/* USER CODE BEGIN EXPORTED_VARIABLES *//* USER CODE END EXPORTED_VARIABLES *//*** @}*//** @defgroup USBD_DFU_Private_FunctionPrototypes* @brief Private functions declaration.* @{*/static uint16_t MEM_If_Init_HS(void);
static uint16_t MEM_If_Erase_HS(uint32_t Add);
static uint16_t MEM_If_Write_HS(uint8_t *src, uint8_t *dest, uint32_t Len);
static uint8_t *MEM_If_Read_HS(uint8_t *src, uint8_t *dest, uint32_t Len);
static uint16_t MEM_If_DeInit_HS(void);
static uint16_t MEM_If_GetStatus_HS(uint32_t Add, uint8_t Cmd, uint8_t *buffer);/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
static uint32_t GetSector(uint32_t Address);/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION *//*** @}*/#if defined(__ICCARM__) /* IAR Compiler */
#pragma data_alignment = 4
#endif__ALIGN_BEGIN USBD_DFU_MediaTypeDef USBD_DFU_fops_HS __ALIGN_END ={(uint8_t *)FLASH_DESC_STR,MEM_If_Init_HS,MEM_If_DeInit_HS,MEM_If_Erase_HS,MEM_If_Write_HS,MEM_If_Read_HS,MEM_If_GetStatus_HS};/* Private functions ---------------------------------------------------------*//*** @brief  Memory initialization routine.* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Init_HS(void)
{/* USER CODE BEGIN 6 */// unlock inter flashHAL_FLASH_Unlock();// clear the flash flag bit__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);return (USBD_OK);/* USER CODE END 6 */
}/*** @brief  De-Initializes Memory.* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_DeInit_HS(void)
{/* USER CODE BEGIN 7 */HAL_FLASH_Lock();return (USBD_OK);/* USER CODE END 7 */
}/*** @brief  Erase sector.* @param  Add: Address of sector to be erased.* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Erase_HS(uint32_t Add)
{/* USER CODE BEGIN 8 *//*擦除整个APP程序存放的空间,即是0x08080000-0x08010000*//*因为起始地址是0x8000000,而Size是0x100000,所以MCU存放代码的最后一个区域的地址为0x8100000。而DFU占了其中的0x80000的空间。*/uint32_t UserStartSector;uint32_t SectorError;FLASH_EraseInitTypeDef pEraseInit;// Unlock the Flash to enable the flash control register accessMEM_If_Init_FS();UserStartSector = GetSector(Add);pEraseInit.TypeErase = TYPEERASE_SECTORS;pEraseInit.Sector = UserStartSector;pEraseInit.NbSectors = 4; // 需要擦除的扇区数,扇区8-11pEraseInit.VoltageRange = VOLTAGE_RANGE_3;if (HAL_FLASHEx_Erase(&pEraseInit, &SectorError) != HAL_OK){/* Error occurred while page erase */return (USBD_FAIL);}return (USBD_OK);/* USER CODE END 8 */
}/*** @brief  Memory write routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be written (in bytes).* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Write_HS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* USER CODE BEGIN 9 */uint32_t i = 0;for (i = 0; i < Len; i += 4){if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest + i), *(uint32_t *)(src + i)) == HAL_OK){if (*(uint32_t *)(src + i) != *(uint32_t *)(dest + i)){return USBD_FAIL;}}else{return USBD_FAIL;}}return (USBD_OK);/* USER CODE END 9 */
}/*** @brief  Memory read routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be read (in bytes).* @retval Pointer to the physical address where data should be read.*/
uint8_t *MEM_If_Read_HS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* Return a valid address to avoid HardFault *//* USER CODE BEGIN 10 */uint32_t i = 0;uint8_t *psrc = src;for (i = 0; i < Len; i++){dest[i] = *psrc++;}return (uint8_t *)(dest);/* USER CODE END 10 */
}/*** @brief  Get status routine.* @param  Add: Address to be read from.* @param  Cmd: Number of data to be read (in bytes).* @param  buffer: used for returning the time necessary for a program or an erase operation* @retval 0 if operation is successful*/
uint16_t MEM_If_GetStatus_HS(uint32_t Add, uint8_t Cmd, uint8_t *buffer)
{/* USER CODE BEGIN 11 */switch (Cmd){case DFU_MEDIA_PROGRAM:buffer[1] = (uint8_t)FLASH_PROGRAM_TIME;buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8);buffer[3] = 0;break;case DFU_MEDIA_ERASE:buffer[1] = (uint8_t)FLASH_ERASE_TIME;buffer[2] = (uint8_t)(FLASH_ERASE_TIME << 8);buffer[3] = 0;default:break;}return (USBD_OK);/* USER CODE END 11 */
}/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION *//*** @brief  根据输入的地址给出它所在的sector*					例如:uwStartSector = GetSector(FLASH_USER_START_ADDR);uwEndSector = GetSector(FLASH_USER_END_ADDR);* @param  Address:地址* @retval 地址所在的sector*/
static uint32_t GetSector(uint32_t Address)
{uint32_t sector = 0;if ((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)){sector = FLASH_SECTOR_0;}else if ((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)){sector = FLASH_SECTOR_1;}else if ((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2)){sector = FLASH_SECTOR_2;}else if ((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3)){sector = FLASH_SECTOR_3;}else if ((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4)){sector = FLASH_SECTOR_4;}else if ((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5)){sector = FLASH_SECTOR_5;}else if ((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6)){sector = FLASH_SECTOR_6;}else if ((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7)){sector = FLASH_SECTOR_7;}else if ((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)){sector = FLASH_SECTOR_8;}else if ((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)){sector = FLASH_SECTOR_9;}else if ((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)){sector = FLASH_SECTOR_10;}else // Address > ADDR_FLASH_SECTOR_11{sector = FLASH_SECTOR_11;}return sector;
}/************************************************************************* * *@brief 跳转到应用程序* * *
************************************************************************/
void JumpToApp(void)
{typedef void (*pFunction)(void);static pFunction JumpToApplication;static uint32_t JumpAddress;/* Test if user code is programmed starting from USBD_DFU_APP_DEFAULT_ADD * address */if (((*(__IO uint32_t *)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000) == 0x20000000){//bootmod key not push ,go to app/* Jump to user application */JumpAddress = *(__IO uint32_t *)(USBD_DFU_APP_DEFAULT_ADD + 4);JumpToApplication = (pFunction)JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP((*(__IO uint32_t *)USBD_DFU_APP_DEFAULT_ADD));__disable_irq(); //shut down interruptJumpToApplication();}
}

main.c

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();// MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){JumpToApp();}printf("press key2 to download");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_SET){MX_USB_DEVICE_Init();}}/* USER CODE END 3 */
}

tips

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

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

相关文章

HCIA项目实践--静态路由的综合实验

八 静态路由综合实验 &#xff08;1&#xff09;划分网段 # 192.168.1.0 24#分析&#xff1a;每个路由器存在两个环回接口&#xff0c;可以把两个环回接口分配一个环回地址&#xff0c;所以是四个环回&#xff0c;一个骨干&#xff0c;这样分配&#xff0c;不会出现路由黑洞#19…

通过内网穿透ssh实现远程对家里的linux进行终端操作和编程

内网穿透就是将自己的地址当穿透到公网ip&#xff0c;这一就可以在外网访问了(因为大部分人ip都是动态分配的)&#xff0c;以适用ssh远程连接&#xff0c;我这里用的是极点云cpolar&#xff0c;反正也是黑框编程&#xff0c;免费就行了。我是ubuntu虚拟机&#xff0c;在虚拟机上…

Redis 数据类型 Zset 有序集合

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数&#xff08;score&#xff09;与之关 联&#xff0c;着使得有序集合中的元素是可以维…

PHP 中的除以零错误

除以零错误&#xff08;Division by zero&#xff09;是指数字除以零的情况&#xff0c; 这在数学上是未定义的。在 PHP 中&#xff0c;处理这种错误的方式取决于 PHP 版本&#xff1a; PHP 7&#xff1a; 使用 / 运算符会产生一个警告 (E_WARNING) 并返回 false。 使用 intd…

基于springboot轨道交通安全评估系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;轨道交通安全评估管理当然不能排除在外。轨道交通安全评估系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Java语言以及Spring…

UE5.2后 Bake Out Materials失效

这个问题出现在5.3&#xff0c;5.4&#xff0c;5.5没有测试 烘焙贴图后会找不到贴图位置&#xff0c; 这个是5.2的正常状态 默认是生成在模型当前目录里&#xff0c;包括新的材质 但是这个bug会让材质和贴图都消失&#xff0c;无法定位 暂时没有办法解决&#xff0c;等官方 …

【音视频】RTSP拉流: RTP负载AAC详解(三)

此文为系列文章&#xff0c;此系列主要讲解RTSP客户端的拉流及播放&#xff0c;文章持续更新&#xff0c;会从rtsp的基本协议讲起&#xff0c;如何一步步实现音视频的拉流过程&#xff0c;包括一系列涉及到的协议&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

【ARM】JTAG接口介绍

1、 文档目标 对 JTAG 接口有更多的认识&#xff0c;在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时&#xff0c;免不了要接触到 JTAG 接口&#xff0c;当出现连接不上时&#xff0c;就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…

C++-AVL树

一、AVL树的概念 1.二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二叉排序树或二叉查找树。 二叉搜索树&#xff1a;一棵二叉树&#xff0c;可以为空&#xff1b;如果不为空&#xff0c;满足以下性质&#xff1a; 非空左子…

w208基于spring boot物流管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)

1.简介 上一篇中&#xff0c;宏哥说的宏哥在最后提到网站的反爬虫机制&#xff0c;那么宏哥在自己本地做一个网页&#xff0c;没有那个反爬虫的机制&#xff0c;谷歌浏览器是不是就可以验证成功了&#xff0c;宏哥就想验证一下自己想法&#xff0c;其次有人私信宏哥说是有那种…

神经网络常见激活函数 8-SELU函数

SELU 缩放指数线性单元&#xff1a;SELU&#xff08;Scaled Exponential Linear Unit&#xff09; 函数导函数 SELU函数 S E L U ( x ) { λ x x > 0 λ α ( e x − 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

达梦:AWR 生成

目录标题 AWR 性能诊断与报告生成1. 检查 AWR 系统状态2. 查看数据库中的所有表空间3. 查看现有的 AWR 快照4. 设置 AWR 快照的时间间隔5. 创建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 报告8. 将 AWR 报告保存到指定文件链接总结 自动工作集负载信息库 AWR 报告解析指…

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…

【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言 】C语言 桌游开发数字竞拍&#xff08;源码…

Reinforcement Learning Heats Up 强化学习持续升温

Reinforcement Learning Heats Up 强化学习持续升温 核心观点&#xff1a;强化学习正成为构建具有高级推理能力大语言模型&#xff08;LLMs&#xff09;的重要途径。 最新进展 模型示例&#xff1a;近期出现了如DeepSeek - R1及其变体&#xff08;DeepSeek - R1 - Zero&#xf…

Whisper+T5-translate实现python实时语音翻译

1.首先下载模型&#xff0c;加载模型 import torch import numpy as np import webrtcvad import pyaudio import queue import threading from datetime import datetime from faster_whisper import WhisperModel from transformers import AutoTokenizer, AutoModelForSeq2…

湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构

导读&#xff1a;浙江霖梓早期使用 CDH 产品套件搭建了大数据系统&#xff0c;面临业务逻辑冗余、查询效率低下等问题&#xff0c;基于 Apache Doris 进行整体架构与表结构的重构&#xff0c;并基于湖仓一体和查询加速展开深度探索与实践&#xff0c;打造了 Doris Paimon 的实…

Jmeter压测怎么控制TPS

压测固定TPS的接口 有些任务需要我们控制接口的TPS&#xff0c;例如每秒请求一次。 TPS定时器 然后1个并发持续运行 压测结果 需要注意TPS在1.0/s左右&#xff0c;有时可能是1.2、1.3&#xff0c;定时器会自动调整压力&#xff0c;让TPS保持在1.0左右。