【03】STM32F407 HAL 库框架设计学习
【03】STM32F407 HAL 库框架设计学习
摘要
本文旨在为初学者提供一个关于STM32F407微控制器HAL(Hardware Abstraction Layer)库框架设计的详细学习教程。通过本文,读者将从零开始,逐步掌握STM32F407的基本知识、HAL库的配置步骤、HAL库函数的使用方法,并通过配套的例程和代码注释加深理解。本文内容涵盖基础知识、配置步骤、HAL库函数详解、配套例程和总结,并附有思维导图以帮助读者更好地理解知识结构。
初学者重要提示
在开始学习STM32F407和HAL库之前,请注意以下几点:
- 硬件准备:
- 确保你拥有STM32F407开发板,并熟悉其硬件结构。
- 准备好调试工具,如ST-Link或类似设备。
- 软件安装:
- 安装STM32CubeMX和STM32CubeIDE。
- 安装STM32Cube_FW_F4固件库。
- 开发环境配置:
- 确保STM32CubeMX和STM32CubeIDE已正确配置,并能够生成和编译项目。
- 学习资源:
- 熟悉STM32F407的数据手册和HAL库参考手册。
- 参考STM32CubeMX和STM32CubeIDE的用户指南。
- 编程基础:
- 熟悉C语言编程基础。
- 理解基本的嵌入式系统概念,如中断、DMA等。
1. 基础知识
1.1 STM32F407简介
STM32F407是STMicroelectronics公司推出的一款高性能32位微控制器,基于ARM Cortex-M4内核,工作频率高达168MHz。它集成了丰富的外设,如GPIO、UART、SPI、I2C、PWM、ADC、DAC等,适用于多种嵌入式应用。
1.2 HAL库简介
HAL(Hardware Abstraction Layer)库是ST公司为STM32系列微控制器提供的标准软件库,旨在为开发者提供一个统一的接口,简化硬件操作。HAL库将硬件操作抽象为函数调用,使得开发者无需深入了解底层硬件细节,即可完成复杂的硬件操作。
1.3 开发环境搭建
在开始使用STM32F407和HAL库之前,需要先搭建开发环境。以下是搭建开发环境的步骤:
- 安装STM32CubeMX:STM32CubeMX是一个图形化配置工具,用于配置STM32微控制器的外设和时钟。
- 安装STM32CubeIDE:STM32CubeIDE是基于Eclipse的集成开发环境,用于STM32项目的开发和调试。
- 安装STM32Cube_FW_F4:这是STM32F4系列的HAL库和底层固件库,包含HAL库的源代码和头文件。
2. 配置步骤
2.1 使用STM32CubeMX配置STM32F407
- 打开STM32CubeMX,选择STM32F407VG芯片。
- 配置时钟:在“Clock Configuration”选项卡中,配置系统时钟为168MHz。
- 配置GPIO:在“Pinout & Configuration”选项卡中,配置GPIO引脚的功能。例如,配置GPIOA的第5引脚为LED输出。
- 配置其他外设:根据需要配置其他外设,如UART、SPI、I2C等。
- 生成代码:完成配置后,点击“Generate Code”按钮,选择保存路径,生成初始化代码。
2.2 在STM32CubeIDE中配置项目
- 导入生成的代码:在STM32CubeIDE中,选择“File” -> “Import” -> “STM32CubeMX Project” -> “Existing STM32CubeMX Project”,导入生成的代码。
- 配置项目:在“Project Explorer”中,右键点击项目,选择“Properties”,配置项目属性,如调试配置、编译选项等。
- 构建项目:点击“Build”按钮,构建项目,确保没有错误。
3. HAL库函数详解
3.1 GPIO操作
3.1.1 GPIO初始化
HAL_StatusTypeDef HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
-
参数
:
GPIOx:GPIO端口,如GPIOA、GPIOB等。GPIO_Init:指向GPIO初始化结构体的指针,包含GPIO模式、速度、上下拉配置等信息。
-
返回值
:
HAL_OK:初始化成功。HAL_ERROR:初始化失败。
3.1.2 GPIO输入输出操作
HAL_StatusTypeDef HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
-
参数
:
GPIOx:GPIO端口。GPIO_Pin:GPIO引脚,如GPIO_PIN_5。PinState:引脚状态,GPIO_PIN_SET表示高电平,GPIO_PIN_RESET表示低电平。
-
返回值
:
HAL_OK:操作成功。HAL_ERROR:操作失败。
3.2 UART操作
3.2.1 UART初始化
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart, UART_InitTypeDef *uInit)
-
参数
:
huart:UART句柄,包含UART配置信息。uInit:指向UART初始化结构体的指针,包含波特率、数据位、停止位、校验位等信息。
-
返回值
:
HAL_OK:初始化成功。HAL_ERROR:初始化失败。
3.2.2 UART数据发送
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
-
参数
:
huart:UART句柄。pData:指向发送数据缓冲区的指针。Size:发送数据的长度。Timeout:超时时间。
-
返回值
:
HAL_OK:发送成功。HAL_ERROR:发送失败。
3.3 PWM操作
3.3.1 PWM初始化
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim, TIM_InitTypeDef *pInitStruct)
-
参数
:
htim:TIM句柄,包含PWM配置信息。pInitStruct:指向TIM初始化结构体的指针,包含PWM模式、时钟源、频率等信息。
-
返回值
:
HAL_OK:初始化成功。HAL_ERROR:初始化失败。
3.3.2 PWM输出
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
-
参数
:
htim:TIM句柄。Channel:PWM通道,如TIM_CHANNEL_1。
-
返回值
:
HAL_OK:启动成功。HAL_ERROR:启动失败。
4. 配套例程
4.1 LED闪烁例程
4.1.1 代码实现
#include "main.h"GPIO_InitTypeDef GPIO_InitStructure;void SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);HAL_Delay(500);}
}static void MX_GPIO_Init(void)
{GPIO_InitStructure.Pin = GPIO_PIN_5;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{while (1){}
}
4.1.2 代码说明
HAL_Init():初始化HAL库。SystemClock_Config():配置系统时钟。MX_GPIO_Init():配置GPIO引脚。HAL_GPIO_WritePin():控制GPIO引脚输出。HAL_Delay():延时函数。
4.2 UART通信例程
4.2.1 代码实现
#include "main.h"UART_HandleTypeDef huart2;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();while (1){char data = 'A';HAL_UART_Transmit(&huart2, (uint8_t *)&data, 1, 100);HAL_Delay(1000);}
}static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_2;GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}static void MX_USART2_UART_Init(void)
{huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){Error_Handler();}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{while (1){}
}
4.2.2 代码注释
UART_HandleTypeDef huart2:UART句柄。MX_USART2_UART_Init():配置UART2。HAL_UART_Transmit():发送数据。HAL_Delay():延时函数。
4.3 PWM生成例程
4.3.1 代码实现
#include "main.h"TIM_HandleTypeDef htim2;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM2_Init();HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);while (1){HAL_Delay(1000);}
}static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_0;GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}static void MX_TIM2_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};htim2.Instance = TIM2;htim2.Init.Prescaler = 8399;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 999;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{while (1){}
}
4.3.2 代码说明
TIM_HandleTypeDef htim2:TIM句柄。MX_TIM2_Init():配置TIM2。HAL_TIM_PWM_Start():启动PWM输出。HAL_Delay():延时函数。
5. 总结
通过本文的学习,读者应该能够掌握STM32F407的基本知识、HAL库的配置步骤、HAL库函数的使用方法,并能够通过配套的例程和代码注释加深理解。HAL库的使用大大简化了硬件操作,使得开发者能够更专注于应用逻辑的实现。希望本文能够帮助读者快速上手STM32F407的开发。
相关文章:
【03】STM32F407 HAL 库框架设计学习
【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL(Hardware Abstraction Layer)库框架设计的详细学习教程。通过本文,读者将从零开始,逐步掌握STM32F407的基本知识、HAL库的配置步骤…...
鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2
// 1 // 2 ArkUI 基本语法 // 方舟开发框架(简称:ArkUI),是一套 构建HarmonyOS应用 界面 的框架。 // 构建页面的最小单位就是 "组件"。 // 组件名(参数) { // 内容 // } // .属性1() // .属性2() // .属性N() import text from @ohos.graphics.text // @En…...
SQLAlchemy系列教程:SQLAlchemy快速入门示例项目
SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单,并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程,包括安装依赖包,创建连…...
【Linux网络#10】:Https协议原理
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 生活总是不会一帆风顺…...
蓝桥杯备考:记忆化搜索之function
这道题是有重复的问题的,所以我们可以选择记忆化搜索 #include <iostream> using namespace std; typedef long long LL; const int N 25; LL ret[N][N][N]; LL dfs(LL a,LL b, LL c) {if(a<0 || b<0 || c<0) return 1;if(a>20 || b>20 || c…...
在Nginx上配置并开启WebDAV服务的完整指南
在Nginx上配置并开启WebDAV服务的完整指南 如何在 Nginx 上开启 WebDAV 服务 要在 Nginx 上开启 WebDAV 服务,你需要配置 Nginx 以支持 WebDAV 请求。以下是详细的步骤: 1. 确保 Nginx 安装了 WebDAV 模块 Nginx 的 WebDAV 功能由 http_dav_module 模…...
mysql 全方位安装教程
下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包,小的安装包是一个安装器。 我们不用登录,直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…...
设计模式Python版 观察者模式
文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组…...
如何在Python用Plot画出一个简单的机器人模型
如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中,首先要知道机器人的DH参数,然后计算出每一个关节的位置,最后利用 plot 函数画出关节之间的连杆就可以了,最后利用 animation 库来实现一个动画效果。 import matplo…...
如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南
ArcGIS Pro,作为Esri公司推出的新一代地理信息系统(GIS)平台,以其强大的功能和灵活的操作界面,在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中,图例作为地图的重要组成部分&…...
MySQL 创建指定IP用户并赋予全部权限(兼容8.0以下及8.0以上版本)
在MySQL中,为用户指定访问IP并授予权限是常见的运维操作。但由于MySQL 8.0对用户创建和权限管理机制进行了升级,不同版本的操作存在差异。以下是针对MySQL 8.0以下版本和8.0及以上版本的具体实现方法。 一、MySQL 8.0以下版本(如5.7、5.6) 在MySQL 8.0之前,可以通过一条G…...
每日十个计算机专有名词 (7)
Metasploit 词源:Meta(超越,超出) exploit(漏洞利用) Metasploit 是一个安全测试框架,用来帮助安全专家(也叫渗透测试人员)发现和利用计算机系统中的漏洞。你可以把它想…...
【Python 数据结构 3.顺序表】
目录 一、顺序表基本概念 1.顺序表的概念 2.顺序表的元素插入 元素插入的步骤 3.顺序表的元素删除 元素删除的步骤 4.顺序表的元素查找 元素查找的步骤 5.顺序表的元素索引 元素索引的步骤 6.顺序表的元素修改 元素修改的步骤 二、Python中的顺序表 1.顺序表的定义 2.顺序表的插…...
C# 装箱(Boxing)与拆箱(Unboxing)
C# 装箱(Boxing)与拆箱(Unboxing) 在 C# 中,装箱和拆箱是与值类型(如结构体)和引用类型(如类)之间的转换相关的操作。它们是类型系统的一部分,但如果不正确使…...
[ComfyUI][AI生图]如何在Comfyui中安装插件管理器
如何在ComfyUI便携版中安装插件管理器 在现代软件环境中,图形用户界面(GUI)提供了一种直观的方式来与应用程序交互。ComfyUI是一个出色的GUI框架,它使用户能够通过图形化方式配置和管理他们的应用程序。特别是ComfyUI的便携版,它允许用户在没有安装的情况下使用这一工具,…...
从零开始构建高效Spring Boot应用:实战案例与最佳实践
摘要 本文旨在为初学者及有一定基础的开发者提供一份详尽的指南,以帮助大家深入理解并掌握如何使用Spring Boot框架来快速开发企业级应用程序。通过实际案例分析、代码示例以及架构设计思路分享,读者不仅能够学习到理论知识,还能获得宝贵的实…...
EdgeNext模型详解及代码复现
架构特点 EdgeNeXt是一种集CNN与Transformer于一体的混合架构,其核心创新在于引入了 分割深度转置注意力(SDTA)编码器 。这种设计巧妙地将深度卷积与自适应核大小以及转置注意力相结合,实现了最佳的精度-速度平衡。 SDTA编码器主要由两个组件构成: 特征编码模块 :受Res…...
SQL经典题型
查询不在表里的数据,一张学生表,一张学生的选课表,要求查出没有选课的学生? select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...
物联网小范围高精度GPS使用
在园区内实现小范围高精度GPS(全球定位系统)定位,通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案,包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...
【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装
【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错,网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程 2. 页面探索2.1 设置管理账号2.2 添加…...
P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用
P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环,完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值,在不同的年份中应该更新2月的值 还有…...
动态规划多阶段报童模型,c++ 实现, java 实现
借助 chaptgpt 和 deepseek,成功实现了c上的多阶段报童模型的动态规划。花费了几天,将以前的 java 程序用 c 实现。 文章目录 C 代码Java 代码 总结: c 还是比 java 快点,30个阶段快了零点几秒c 使用了 unordered_map ࿰…...
hivePB级迁移方案
1、评估磁盘空间大小、调整副本数、设置heapsize大小 2、distcp -i -skipcrccheck 源端到目标端,迁移 3、元数据迁移,建表,替换location地址,或者导出db 4、表分区修复 5、配置增量T-1迁移或者T-2 6、校验历史分区脚本&#…...
Transformer 代码剖析2 - 模型训练 (pytorch实现)
一、模型初始化模块 参考:项目代码 1.1 参数统计函数 def count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)#mermaid-svg-OL9twT8AmPz3Bp0O {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…...
PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构
一:DOS部分 DOS部分分为DOS MZ文件头和DOS块,其中DOS MZ头实际是一个64位的IMAGE_DOS——HEADER结构体。 DOS MZ头部结构体的内容如下,我们所需要关注的是前面两个字节(e_magic)和后面四个字节(e_lfanew&a…...
[含文档+PPT+源码等]精品基于Python实现的vue3+Django计算机课程资源平台
基于Python实现的Vue3Django计算机课程资源平台的背景,可以从以下几个方面进行阐述: 一、教育行业发展背景 1. 教育资源数字化趋势 随着信息技术的快速发展,教育资源的数字化已成为不可逆转的趋势。计算机课程资源作为教育领域的重要组成部…...
vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用
目录 Ⅰ.ref 1.基本用法:ref响应式数据 2.ref模板引用 3.ref在v-for中的模板引用 4.ref在组件上使用 5.TS中ref数据标注类型 Ⅱ.reactive 1.基本用法:reactive响应式数据 2.TS中reactive标注类型 Ⅲ.ref和reactive的使用场景和区别 Ⅳ.小结…...
Oracle VM VirtualBox 7.1 安装与虚拟机创建全流程指南(Windows平台)
一、软件定位与核心功能 Oracle VM VirtualBox 是开源跨平台虚拟化工具,支持在 Windows、Linux、macOS 系统上创建和管理虚拟机(VM),其核心功能包括: 多系统兼容:可安装 Windows、Ubuntu、CentOS 等 50 操…...
细说 Java GC 垃圾收集器
一、GC目标 业务角度,我们需要追求2个指标: 低延迟(Latency):请求必须多少毫秒内完成响应;高吞吐(Throughput):每秒完成多少次事务。 两者通常存在权衡关系࿰…...
云原生网络篇——万级节点服务网格与智能流量治理
引言:网络即神经系统 2023年双十一期间,某电商平台的支付网关因瞬时流量激增导致服务网格控制面崩溃,造成2.7亿元交易失败。而另一家跨国流媒体公司通过智能流量治理系统,在跨三大洲的云环境中实现了200万QPS的稳定传输。这两个案…...
