【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟
目录
- 1.认识时钟树(掌握)
- 1.1什么是时钟?
- 1.2认识时钟树(F1)
- 1.2.1STM32F103时钟树简图
- 1.2.2STM32CubeMX时钟树(F103)
- 1.3认识时钟树(F4)
- 1.3.1F407时钟树
- 1.3.2F429时钟树
- 1.3.3STM32F4时钟树简图
- 1.3.4STM32CubeMX时钟树(F407)
- 1.3.5STM32CubeMX时钟树(F429)
- 2,配置系统时钟(掌握)
- 2.1外设时钟使能和失能
- 2.2`sys_stm32_clock_init` 函数(F1)
- 2.2.1`HAL_RCC_OscConfig()`函数(F1)
- 2.2.2` HAL_RCC_ClockConfig()`函数(F1)
- 2.2.3实际配置步骤
- 2.3.1.1.配置HSE_VALUE
- 2.3.2,调用SystemInit()函数(可选)
- 2.3.2,调用sys_stm32_clock_init()函数
- 2.4`sys_stm32_clock_init` 函数(F4/F7)
- 2.4.1 HAL_RCC_OscConfig()函数
- 2.4.2HAL_RCC_ClockConfig()函数
- 2.4.3Stm32_Clock_Init()函数
- 3,总结(了解)
1.认识时钟树(掌握)
1.1什么是时钟?
下图的clk是clock(时钟)的缩写,下面的波形可以理解为脉冲信号或者方波。简单来说,时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要!

1.2认识时钟树(F1)
下图是F1系列的时钟树,从左侧竖线开始,OSC_OUT与OSC_IN是外部高速晶振所连接的引脚,OSC32_IN与OSC32_OUT是外部低速晶振所连接的引脚,这两个是外部时钟源。STM32还有内部时钟源HSI与LSI。HSE经过PLLXTPRE选择器可以进行1分频或者2分频,PLLSRC用于选择内部还是外部时钟,经过PLL锁相环倍频得到PLLCLK,选择器控制位SW选择SYSCLK的时钟来源。Cortex系统时钟是滴答定时器SysTick,定时器时钟频率都为72Mhz,TIM1和TIM8位高级定时器。
STM32是向外部输出时钟通道,MCO是引脚PA8复用得到此项功能,时钟来源有四个。

四个时钟源的名字、作用如下,字母的简写形式为:
H:high
L:low
S:speed
I:internal
E:external

振荡器主要分为晶体、陶瓷、RC,如果是晶体需要外接晶振,陈本提高,RC振荡器是芯片内部,不需要额外成本,但是从稳定、精确度方面来讲外部振荡器比较好。
NIM为不可屏蔽中断,在休眠时将AHB总线时钟屏蔽,唤醒时需要中断进行唤醒,FCLK可以保证睡眠时仍可以产生中断,保证芯片内部一部分功能正常使用,

1.2.1STM32F103时钟树简图
STM32F103最大系统时钟为72MHz,HSE与HSI想要得到72MHz需要经过PLL锁相环进行倍频,进入PLL之前也需要进行分频,HSI只有2分频,HSE可以选择1分频或者2分频。HSI经过2分频为4MHz经过16倍频,最大是64MHz,即用内部高速时钟最大可达64MHz,显然用内部是不满足的,基本是不使用。F1系列最常用HSE为8MHz,与HSI时钟一致,一分频后为8MHz,经过9倍频,可以得到72MHz。
经过系统时钟来到HCLK(也就是AHB总线,AHB总线时钟用名字HCLK来表示),从SYSCLK到HCLK需要进行分频(分频系数不用关心,具体的分频系数需要查看寄存器,事实上该分频系数一般设置为1);HCLK经过两个桥分为APB1和APB2总线,分频系数份别为2和1,AHB除了能分出APB1和APB2,AHB总线上还会挂载外设,并且内核时钟也是来自AHB。
低速有LSI与LSE,LSI可以作为IWDG独立看门狗、RTC实时时钟外设的时钟来源,LSE只能作为RTC的时钟源。

时钟源(振荡器)、锁相环:
HAL_RCC_OscConfig(),控制时钟源是否打开、锁相环PLL的倍频系数
系统时钟、总线:HAL_RCC_ClockConfig(),配置系统时钟的来源,SYSCLK->HCLK->APB1/APB2的分频器。
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE(),__HAL_RCC_PPP_CLK_ENABLE()并不是函数是宏,PPP代表任意外设,例如GPIO、ADC等,STM32为了低功耗,将所有外设时钟默认是关闭的,想要使用哪一个外设就要使能哪一个宏。
扩展外设时钟(RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig(),Ex是拓展Extend的缩写,不同系列,该函数配置的外设不同。
1.2.2STM32CubeMX时钟树(F103)

1.3认识时钟树(F4)
1.3.1F407时钟树
下图是F407时钟树图,与F429时钟树不同。图中VCO,V是电压,C是控制,O是振荡器,也就是压控振荡器。

时钟来源与F1类似,频率有些不同。

1.3.2F429时钟树

1.3.3STM32F4时钟树简图
HSE与HSI都无法直接达到SYSCLK的最大时钟频率,需要经过锁相环倍频,在此之前需要进行M倍分频,F1系列锁相环PLL只是倍频器,而F4系列锁相环是先倍频后分频,SYSCLK一般经过1分频到达HCLK也就是AHB总线,在F4系列中AHB分为AHB1和AHB2,甚至AHB3,APB1与APB2是AHB1总线经过桥达到的。。LSE是专门为RTC提供的,RTC对时钟的精准度要求较高,优先选择LSE,如果没有LSE则用LSI代替。

时钟源、PLL:
HAL_RCC_OscConfig(),用于配置四个时钟源的开关,以及RTC振荡器校准系数的设置。
系统时钟、总线:HAL_RCC_ClockConfig(),配置系统时钟的来源,
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE(),PPP可以是任意外设,例如GPIO
扩展外设时钟(PLLI2S/ I2S/ LTDC /RTC等):HAL_RCCEx_PeriphCLKConfig()
1.3.4STM32CubeMX时钟树(F407)
48MHz clocks(MHz)可以作为全速USB(FSUSB)的时钟来源。

1.3.5STM32CubeMX时钟树(F429)

USB相关例程的系统时钟配置,为了让FSUSB全速运行,但是系统会超频,但是这些超频是允许的。

2,配置系统时钟(掌握)
1.配置HSE_VALUE:告诉HAL库外部晶振频率,在stm32xxxx_hal_conf.h,定义;
2.调用SystemInit()函数(可选):在启动文件中调用, 在system_stm32xxxx.c定义;
3.选择时钟源,配置PLL:通过HAL_RCC_OscConfig()函数设置;
4.选择系统时钟源,配置总线分频器:通过HAL_RCC_ClockConfig()函数设置;
5.配置扩展外设时钟(可选):通过HAL_RCCEx_PeriphCLKConfig()函数设置,正点原子只在H7系列中设置此项。
3 +4 + 5 =正点原子自定义函数 sys_stm32_clock_init()
2.1外设时钟使能和失能
我们要使用某个外设,必需先使能该外设时钟!!!
HAL库使能某个外设时钟的方法,以使能GPIOA为例,如:
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能 GPIOA 时钟 */
HAL库禁止某个外设时钟的方法,以使能GPIOA为例,如:
__HAL_RCC_GPIOA_CLK_DISABLE(); /* 禁止 GPIOA 时钟 */
2.2sys_stm32_clock_init 函数(F1)
2.2.1HAL_RCC_OscConfig()函数(F1)
HAL_RCC_OscConfig()函数原型如下,函数返回值为HAL_StatusTypeDef类型。
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
`第一个参数OscillatorType是选择4个振荡器中的哪一个;HSEState配置HSE打开还是关闭;HSI是永远RC振荡器的,会随着温度、电压变化而变化,不稳定,需要有一个校验值。
typedef struct
{ uint32_t OscillatorType; /* 选择需要配置的振荡器 */ uint32_t HSEState; /* HSE 状态 */ uint32_t HSEPredivValue; /* HSE 预分频值 */ uint32_t LSEState; /* LSE 状态 */ uint32_t HSIState; /* HSI状态 */ uint32_t HSICalibrationValue; /* HSI 校准值 */ uint32_t LSIState; /* LSI 状态 */ RCC_PLLInitTypeDef PLL; /* PLL 结构体 */
}RCC_OscInitTypeDef;
RCC_PLLInitTypeDef锁相环结构体如下所示,PLLState是配置打开锁相环还是关闭,倍频系数为2~16倍频。
typedef struct
{ uint32_t PLLState; /* PLL 状态 */ uint32_t PLLSource; /* PLL 时钟源 */ uint32_t PLLMUL; /* PLL 倍频系数 */
}RCC_PLLInitTypeDef;
2.2.2 HAL_RCC_ClockConfig()函数(F1)
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
HCLK是AHB总线时钟,PCLK1是APB1总线上时钟,PCLK2是APB2总线上时钟。
typedef struct
{ uint32_t ClockType; /* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */ uint32_t SYSCLKSource; /* 系统时钟源 */ uint32_t AHBCLKDivider; /* AHB 时钟预分频系数 */ uint32_t APB1CLKDivider; /* APB1 时钟预分频系数 */ uint32_t APB2CLKDivider; /* APB2 时钟预分频系数 */
}RCC_ClkInitTypeDef;
F1系统时钟为72Mhz,FLASH时钟来源来自72Mhz,但是用72Mhz会超频,最大时钟频率为24Mhz,用72Mhz的时钟访问FLAH太快,需要等待几个周期。
uint32_t FLatency #define FLASH_LATENCY_0 0x00000000U /* FLASH 0个等待周期 */
#define FLASH_LATENCY_1 FLASH_ACR_LATENCY_0 /* FLASH 1个等待周期 */
#define FLASH_LATENCY_2 FLASH_ACR_LATENCY_1 /* FLASH 2个等待周期 */
实际设置FLASH_ACR寄存器LATENCY位域,需要参考《 STM32F10xxx闪存编程参考手册.pdf 》3.1小节

2.2.3实际配置步骤
2.3.1.1.配置HSE_VALUE
在stm32f1xx_hal_conf.h中配置HSE_VALUE的值。
#if !defined (HSE_VALUE)
#if defined(USE_STM3210C_EVAL)
#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */
#endif
#endif /* HSE_VALUE */
2.3.2,调用SystemInit()函数(可选)
如果不想调用SystemInit()函数,可以用分号“;”注释掉。SystemInit()函数在system_stm32f1xx.c中被定义,只配置了中断向量表所在的位置,并没有配置时钟相关。
; Reset handler
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInitLDR R0, =SystemInitBLX R0 LDR R0, =__mainBX R0ENDP
2.3.2,调用sys_stm32_clock_init()函数
sys_stm32_clock_init()函数一般在main函数的前几行被调用,主要由函数HAL_RCC_OscConfig和HAL_RCC_ClockConfig组成。选择要配置的时钟时,可以用或“|”同时设置多个时钟,结构体rcc_osc_init在定义时给到0,如果其中结构体未被赋值,则默认为0,如果不定义可能为随机数,赋值为0是为了避免不必要的麻烦。
void sys_stm32_clock_init(uint32_t plln)
{HAL_StatusTypeDef ret = HAL_ERROR;RCC_OscInitTypeDef rcc_osc_init = {0};RCC_ClkInitTypeDef rcc_clk_init = {0};rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; /* 选择要配置HSE */rcc_osc_init.HSEState = RCC_HSE_ON; /* 打开HSE */rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1; /* HSE预分频系数 */rcc_osc_init.PLL.PLLState = RCC_PLL_ON; /* 打开PLL */rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE; /* PLL时钟源选择HSE */rcc_osc_init.PLL.PLLMUL = plln; /* PLL倍频系数 */ret = HAL_RCC_OscConfig(&rcc_osc_init); /* 初始化 */if (ret != HAL_OK){while (1); /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */}/* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2*/rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 设置系统时钟来自PLL */rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB分频系数为1 */rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV2; /* APB1分频系数为2 */rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV1; /* APB2分频系数为1 */ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_2); /* 同时设置FLASH延时周期为2WS,也就是3个CPU周期。 */if (ret != HAL_OK){while (1); /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */}
}
2.4sys_stm32_clock_init 函数(F4/F7)
STM32F4/F7系列的sys_stm32_clock_init 函数实现主要由HAL_RCC_OscConfig()函数和HAL_RCC_ClockConfig()函数实现。
2.4.1 HAL_RCC_OscConfig()函数
HAL_RCC_OscConfig()函数的返回值数据类型为HAL_StatusTypeDef ,一般无需关心其返回值,除非函数在调用过程中出现了问题。
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
`OscillatorType是选择外部的哪个振荡器,如果要配置多个振荡器,则用竖线“|”隔开。
typedef struct
{ uint32_t OscillatorType; /* 选择需要配置的振荡器 */ uint32_t HSEState; /* HSE 状态 */ uint32_t LSEState; /* LSE 状态 */ uint32_t HSIState; /* HSI 状态 */ uint32_t HSICalibrationValue; /* HSI 校准微调值,范围0x0~0x1F */ uint32_t LSIState; /* LSI 状态 */ RCC_PLLInitTypeDef PLL; /* PLL 结构体 */
}RCC_OscInitTypeDef;
typedef struct
{ uint32_t PLLState; /* PLL 状态 */ uint32_t PLLSource; /* PLL 时钟源 */ uint32_t PLLM; /* PLL 分频系数 M */ uint32_t PLLN; /* PLL 倍频系数 N */ uint32_t PLLP; /* PLL 分频系数 P */ uint32_t PLLQ; /* PLL 分频系数 Q */
}RCC_PLLInitTypeDef;
2.4.2HAL_RCC_ClockConfig()函数
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
typedef struct
{ uint32_t ClockType; /* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */ uint32_t SYSCLKSource; /* 系统时钟源 */ uint32_t AHBCLKDivider; /* AHB 时钟预分频系数 */ uint32_t APB1CLKDivider; /* APB1 时钟预分频系数 */ uint32_t APB2CLKDivider; /* APB2 时钟预分频系数 */
}RCC_ClkInitTypeDef;
配置FLASH的等待周期,由于F4/F7系列的系统时钟都比访问FLASH的时钟更快,如果要有系统时钟访问FLASH则需要进行等待,一共是有0~15,16个选择。但是在有些芯片中,可能是0~7,那么需要查询FLASH_ACR寄存器LATENCY位域
uint32_t FLatency #define FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /* FLASH 0个等待周期 */
#define FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /* FLASH 1个等待周期 */
#define FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /* FLASH 2个等待周期 */
...
#define FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /* FLASH 15个等待周期 */
2.4.3Stm32_Clock_Init()函数
下面为F429时钟配置函数,__HAL_PWR_VOLTAGESCALING_CONFIG函数设置调压器输出电压,来控制最大可达到的时钟。其中等待周期FLASH_LATENCY_5可以根据STM32F4xx中文参考手册中的表7, CPU 时钟 (HCLK) 频率对应的等待周期数来进行配置。

//时钟系统配置函数
//Fvco=Fs*(plln/pllm);
//SYSCLK=Fvco/pllp=Fs*(plln/(pllm*pllp));
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));//Fvco:VCO频率
//SYSCLK:系统时钟频率
//Fusb:USB,SDIO,RNG等的时钟频率
//Fs:PLL输入时钟频率,可以是HSI,HSE等.
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.//外部晶振为25M的时候,推荐值:plln=360,pllm=25,pllp=2,pllq=8.
//得到:Fvco=25*(360/25)=360Mhz
// SYSCLK=360/2=180Mhz
// Fusb=360/8=45Mhz
//返回值:0,成功;1,失败
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{HAL_StatusTypeDef ret = HAL_OK;RCC_OscInitTypeDef RCC_OscInitStructure; RCC_ClkInitTypeDef RCC_ClkInitStructure;__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟//下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作//时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSERCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSERCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLLRCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSERCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432. RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化if(ret!=HAL_OK) while(1);ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能if(ret!=HAL_OK) while(1);//选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLLRCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。if(ret!=HAL_OK) while(1);
}
3,总结(了解)

相关文章:
【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟
目录 1.认识时钟树(掌握)1.1什么是时钟?1.2认识时钟树(F1)1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树(F103) 1.3认识时钟树(F4)1.3.1F407时钟树1.3.2F429时钟树1.3…...
Kotlin基础(十):函数进阶
前言 本文主要讲解kotlin函数,之前系列文章中提到过函数,本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言,它在函数的定义和使用上有一些特点…...
计算机视觉(四)神经网络与典型的机器学习步骤
文章目录 神经网络生物神经元人工神经元激活函数导数 人工神经网络“层”的通俗理解 前馈神经网络Delta学习规则前馈神经网络的目标函数梯度下降输出层权重改变量 误差方向传播算法误差传播迭代公式简单的BP算例随机梯度下降(SGD)Mini-batch Gradient De…...
使用easyui的tree组件实现给角色快捷分配权限功能
这篇文章主要介绍怎么实现角色权限的快捷分配功能,不需要像大多数项目的授权一样,使用类似穿梭框的组件来授权。 具体实现:通过菜单树的勾选和取消勾选来给角色分配权限,在这之前,需要得到角色的菜单树,角色…...
Postman打不开/黄屏/一直转圈/Windows
环境背景 内网环境Postman-win64-8.11.1-Setup.exe 问题描述 电脑重启后,打开Postman后,出现加载弹窗:Preparing your workspaces…This might take a few minutes; 等待数分钟后,还是没有反应,于是关闭…...
使用SVM模型完成分类任务
SVM,即支持向量机(Support Vector Machine),是一种常见的机器学习算法,用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中,在该空间中找到一个最优的超平面,将不同类别的数据点分开…...
计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid
文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉…...
开发经验分享之:import引入包和@Autowired注入类有什么区别
大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 import 和 Autowired 想必大家在 Java 开发中使用频率最多的关键字之一了把,这篇博客将解释这两个概念的区别和作用,帮助你更好地理解它们在Ja…...
MySQL和Oracle区别
由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…...
QT--day6(人脸识别、图像处理)
人脸识别: /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...
深度学习:常用优化器Optimizer简介
深度学习:常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降,但往往深度学习的训练集规模很大,计算整个训练集的梯度需要很大…...
【算法心得】二维dp的状态转移狂练
LCS: LCS变式:使两个字符串变成一样的,删除的和最小 https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/ 建表 m ∗ n m*n m∗n or ( m 1 ) ∗ ( n 1 ) (m1)*(n1) (m1)∗(n1)? 感觉 ( m 1 ) ∗ ( n …...
JMeter常用内置对象:vars、ctx、prev
在前文 Beanshell Sampler 与 Beanshell 断言 中,初步阐述了JMeter beanshell的使用,接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注:示例使用JMeter版本为5.1 1. vars 如 API 文档 所言,这是定义变量的类&a…...
【C++从0到王者】第十四站:list基本使用及其介绍
文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示,是库里面对list的基本…...
正则表达式、常用的正则
文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字(包括正数、负数、零)只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...
ST官方基于米尔STM32MP135开发板培训课程(一)
本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载: https://www.st.com/en/embedded-software/stm32mp1dev.ht…...
组件(lvs,keeplive,orm,mysql,分布式事务)
lvs LVS 已经集成到Linux内核系统中,ipvsadm 是 LVS 的命令行管理工具。 目前有三种 IP 负载均衡技术( VS/NAT 网络地址转换 、VS/TUN IP 隧道技术实现虚拟服务器 和 VS/DR 直接路由); 八种调度算法:轮询 …...
《视觉SLAM十四讲》报错信息和解决方案
文章目录 ch4-Sophus编译报错ch5/imageBasics安装opencv4.x报错ch5/joinMap/CMakeLists.txt编译报错ch5/joinMap-pcl_viewer map.pcd报错 ch4-Sophus编译报错 报错信息: error: lvalue required as left operand of assignmentunit_complex_.real() 1.;^~ error:…...
golang 设置http请求代理
tinypoxy 搭建http代理服务可参考:tinyproxy搭建http代理_wangxiaoangg的博客-CSDN博客 需求背景: 项目需要访问一国外服务接口,地址被墙。购买香港ecs服务器,并在上面搭建http代理服务。 一 使用http和https代理 func main() {pr…...
我的会议(会议通知)
前言: 我们在实现了发布会议功能,我的会议功能的基础上,继续来实现会议通知的功能。 4.1实现的特色功能: 当有会议要参加时,通过查询会议通知可以知道会议的内容,以及当前会议状态(未读) 4.2思路…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
