【动手学电机驱动】STM32-FOC(4)STM32之UART 串口通信
STM32-FOC(1)STM32 电机控制的软件开发环境
STM32-FOC(2)STM32 导入和创建项目
STM32-FOC(3)STM32 三路互补 PWM 输出
STM32-FOC(4)STM32之UART 串口通信
STM32-FOC(6)IHM03 电机控制套件介绍
【动手学电机驱动】STM32-FOC(4)STM32之UART 串口通信
- 1. UART 串口通信原理
- 1.1 USART 串口通信的基本框架
- 1.2 UART 串口通信的配置
- 2. 在 STM32G431 使用 UART 串口通信的示例
- 2.1 初始化串口
- 2.2 发送数据
- 2.3 接收数据
- 2.4 中断处理
- 3. 使用 CubeMX 创建新项目
- 3.1 使用 CubeMX 创建新项目
- 3.2 使用 CubeIDE 编程
- 4. UART 常用函数
- 4.1 串口句柄
- 4.2 HAL_UART_Transmit
- 4.3 HAL_UART_Receive_IT
- 4.4 HAL_UART_RxCpltCallback
本节内容:
UART(Universal Asynchronous Receiver Transmitter)是一种串口通信的实现方式。
本节通过 NUCLEO-G431RB 开发板, 介绍 STM32G4 的编程和调试。
实验条件:
① 硬件平台:NUCLEO-G431RB 开发板
② 软件平台:STM32CubeMX, STM32CubeIDE
③ 串口调试工具:串口调试助手
1. UART 串口通信原理
串口通信,即串行通信,数据通过一条数据线逐位传输。串行通信的传输速率较低,但只需要一条数据线,线路设计简单、抗干扰能力强,适合长距离低成本的数据传输。串行通信常用于微控制器与外设之间的短距离通信。
USART(Universal Synchronous Asynchronous Receiver Transmitter)是实现串口通信的一种标准接口,支持同步和异步两种通信模式,具备灵活性和高效性。异步通信通过波特率(Baud Rate)进行数据传输,同步通信则通过时钟信号来协调数据传输。
UART(异步通信协议)是基于USART实现的一种异步通信协议,不需要外部时钟信号来同步发送和接收数据,适合简单的点对点通信,广泛应用于与传感器、无线通信模块及其他外围设备的连接。
1.1 USART 串口通信的基本框架
在USART通信中,数据通过一系列的帧进行传输。每个数据帧都包含起始位、数据位、可选的校验位和停止位。
数据帧结构
USART 数据帧的结构如下:
- 起始位(Start Bit):一个逻辑低电平(0),用于通知接收端数据的开始。
- 数据位(Data Bits):实际传输的数据,通常为5到9位,可以根据应用需求进行配置。
- 奇偶校验位(Parity Bit, 可选):用于错误检测,通过计算传输数据位的奇偶性来检测是否发生数据传输错误。
- 停止位(Stop Bit):标识数据帧的结束,通常为1到2位逻辑高电平(1)。
一个典型的USART异步通信帧结构如图所示:
| 起始位 | 数据位 | 校验位 | 停止位 | | 0 | D0-D7 | P | 1 |
波特率(Baud Rate)
波特率是指每秒钟传输的比特数,是串口通信中最重要的参数之一。USART通信双方必须使用相同的波特率,以确保数据正确接收和解码。波特率的选择取决于应用场景:较低的波特率适合长距离通信,而较高的波特率则用于高速数据传输。
常用的波特率有:
- 9600:常用于低速通信设备。
- 115200:常用于较高速的数据传输,如无线模块与微控制器之间的通信。
以STM32微控制器为例,通常使用如下公式计算波特率:
B a u d R a t e = f P C L K 16 ∗ U S A R T D I V BaudRate = \frac{f_{PCLK}}{16 *{USARTDIV}} BaudRate=16∗USARTDIVfPCLK
其中, f P C L K f_{PCLK} fPCLK 是外设时钟频率,USARTDIV 是波特率分频系数。通过选择适当的分频系数,可以设置不同的波特率。
通信模式
USART 可以工作在两种通信模式:异步模式和同步模式。
-
异步模式
异步模式是USART的默认通信模式。在这种模式下,通信双方无需共享时钟信号,而是通过设定相同的波特率来进行同步。异步模式的优势在于线路简单,只需发送(TX)和接收(RX)两条线就可以完成数据通信。
异步模式的典型应用场景包括微控制器与PC之间的串口通信,特别是在调试和数据传输中广泛使用。使用异步模式时,数据帧的起始位和停止位会在接收端用来同步采样时序,从而确保数据的正确传输。 -
同步模式
在同步模式下,USART通信双方通过一个额外的时钟线(SCK)同步数据传输。这种模式下没有起始位和停止位,因为数据的发送和接收是通过时钟脉冲严格同步的。由于同步传输减少了用于同步的数据开销,因此同步模式传输速率更快,适合高速数据传输的场景。
同步模式的典型应用包括与高速传感器或其他要求高数据吞吐量的外设之间的通信。
1.2 UART 串口通信的配置
(1)GPIO配置:
配置相应的GPIO端口,将UART传输线的TX和RX引脚连接到外部设备。
查看 STM32G431 的数据手册或开发板资料,根据 STM32G431 的引脚分配确定使用的串口引脚连接。通过设置GPIO的模式和引脚配置,确保UART模块与外部设备正确连接。
(2)UART时钟配置:
UART模块需要一个时钟源来进行工作。通过RCC寄存器配置,选择合适的时钟源,并设置UART的波特率(Baud Rate),以确保UART传输符合通信要求。
以STM32微控制器为例,按照上文的公式计算波特率,通过调整USARTDIV的值,可以获得9600、115200 等不同的波特率。
(3)UART模块配置:
选择合适的UART模式,例如全双工(Full Duplex)模式或半双工(Half Duplex)模式。然后,配置UART的工作模式、数据位数、停止位数、校验位类型以及流控制等参数。
- 数据位长度:USART支持配置数据位长度,常用的有8位和9位数据位。8位数据位适用于大多数通信场景,9位数据位适用于传输数据量较大、精度高的场景。
- 校验位:校验位用于数据错误检测。常见的校验方式包括奇校验和偶校验。
- 停止位:停止位标识数据帧的结束,通常为1位或2位。
(4)中断与 DMA 模式:
USART可以配置为使用中断或DMA(Direct Memory Access)模式来处理数据的接收和发送。
-
中断模式:当数据接收或发送完成后,会触发中断。通过中断机制可以避免CPU忙等待,节省处理时间。
如果需要使用中断来处理UART接收和发送的数据,可以配置相应的中断使能和优先级。通过中断处理函数来完成接收和发送数据的处理。 -
DMA模式:当需要传输大量数据时,DMA模式可以直接在内存和USART之间传输数据,极大提高了数据传输效率,适合高速数据传输的场景。
2. 在 STM32G431 使用 UART 串口通信的示例
STM32G4 有 3个串口。如图所示,以串口 1为例,发送引脚是PA9,接收引脚是PA10。
2.1 初始化串口
在使用UART串口之前,需要进行串口的初始化配置,包括波特率、数据位、停止位、校验位等参数的设置。这些参数需要与通信对端设备匹配才能正确通信。
通常使用STM32Cube库进行初始化配置。生成的初始化 USART1 串口的示例代码如下:
/*** @brief USART1 Initialization Function* @param None* @retval None*/
static void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}
上述代码使用了STM32 HAL库的函数来初始化UART。通过HAL_UART_Init
函数,设置了串口1 (USART1) 的波特率为115200,数据位数为8位,停止位为1位,无校验位,使能了发送和接收模式。
2.2 发送数据
发送数据可以使用查询方式或中断方式。使用查询方式时,可以使用HAL_UART_Transmit
函数发送数据;使用中断方式时,可以使用HAL_UART_Transmit_IT
函数发送数据。
使用查询方式发送数据的示例代码如下:
uint8_t data[] = "Hello, World!";HAL_UART_Transmit(&huart1, data, sizeof(data), HAL_MAX_DELAY);
上述代码通过HAL_UART_Transmit
函数发送了一个字符串 “Hello, World!”,sizeof(data)
参数表示要发送的数据长度,HAL_MAX_DELAY
表示发送数据时不设置超时。
2.3 接收数据
接收数据也可以使用查询方式或中断方式。使用查询方式时,可以使用HAL_UART_Receive
函数接收数据;使用中断方式时,可以使用HAL_UART_Receive_IT
函数接收数据。
使用查询方式接收数据的示例代码如下:
uint8_t buffer[32];HAL_UART_Receive(&huart1, buffer, sizeof(buffer), HAL_MAX_DELAY);
上述代码通过HAL_UART_Receive
函数接收数据,并将接收到的数据存储在buffer
数组中。sizeof(buffer)
表示要接收的数据长度,HAL_MAX_DELAY
表示接收数据时不设置超时。
2.4 中断处理
如果使用中断方式进行数据的发送和接收,需要实现相应的中断处理函数。HAL库提供了针对UART串口的中断回调函数,可以在中断发生时执行相应的处理。
接收中断回调函数的示例代码如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){// 在此处添加你的代码}
}
上述代码使用了HAL库提供的UART接收完成回调函数HAL_UART_RxCpltCallback
,在其中可以处理接收到的数据。
通过以上步骤,我们可以在STM32微控制器上配置和使用UART串口通信。通过STM32Cube库提供的函数,可以方便地进行串口初始化、发送和接收数据。
3. 使用 CubeMX 创建新项目
3.1 使用 CubeMX 创建新项目
使用 CubeMX 创建新项目,具体操作步骤如下:
-
打开 STM32CubeMX。
-
选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。
- 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。
-
点击 “Start Project” 建立项目,自动转入 CubeMX 的 Pinout Configuration 视图。
-
IO 引脚的配置
(1) 配置 PA5 管脚为 GPIO_Output。 -
UART 串口配置
(1)点击 Connectivity,选中 USART1;
(2)在 USART1 Mode and Configuration 设置为异步模式(Asynchronous),
(3)在 NVIC Interrupt Table 勾选 “USART1 global interrupt/USART1 wake-up interrupt through EXTI line 25” 的 Enabled 选框,使能中断。
(4)在 Parameter Settings – Basic Parameters 设置通讯参数为:
Baud Rate: 115200 Bits/s
Word Length: 8 Bits(including Parity)
Parity: None
Stop Bits: 1
- 代码生成。
点击菜单 “Project Manager” 按钮,进入工程配置界面,如下图所示。
- 输入项目名称,选择项目的保存路径。(注意不要与之前的项目名称相同)
- 将Toolchain / IDE 设定为 STM32CubeIDE
- 点击右上角 “GENERATE CODE” 生成代码
- 加载完毕后,弹出代码生成提示窗口,点击“ OPEN PROJECT”,进入 STM32CubeIDE。
3.2 使用 CubeIDE 编程
-
代码生成后,(自动)进入 STM32CubeIDE,并打开创建的项目 STM32G4_UART。从 Scr 目录打开程序文件 main.c。
-
编写程序代码。
(1) 引用头文件:在用户代码引用区包含需要的头文件。
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
/* USER CODE END Includes */
(2) 变量定义:在用户代码区定义变量,用于存储接收到的字符串。当字符串超出存储长度 256时,返回字符串 “more than 256”。
/* USER CODE BEGIN PV */
uint8_t aRxBuffer;
uint8_t Uart1_RxBuff[256];
uint8_t Uart1_Rx_Cnt=0;
uint8_t cAlmStr[]="more than 256\r\n";
/* USER CODE END PV */
(3) 串口初始化:在用户代码区,增加串口初始化代码。
/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1);/* USER CODE END 2 */
(4) 发送功能函数:在用户代码区,增加函数 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),实现发送功能。
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(Uart1_Rx_Cnt >= 255) // 溢出判断{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);}else{Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer; // 接收数据转存// 判断结束位if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)){// 将收到的数据发送出去HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF);Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); // 清空数组}}
- 程序编译与调试
- 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
- 点击工具栏中 “Build Debug” 按键对程序代码进行编译。
- 点击工具栏中 “Debug” 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
- 点击工具栏中 “Resume” 按键 或 F8 快捷键,运行程序。
- 运行程序。
(1)连接串口。本例以 PC 与 NUCLEO-G431RB 开发板通信为例,用 USB连接线连接 PC与开发板。
(2)在 PC 端打开串口调试工具(推荐使用微软 串口调试助手,或 VOFA+)
(3)在串口调试工具中,按照 CubeMX Parameter Settings – Basic Parameters 设置通讯参数如下:
波特率 (Baud Rate): 115200 Bits/s
数据位 (Word Length): 8 Bits(including Parity)
校验位 (Parity): None
停止位 (Stop Bits): 1
- 实验结果如图所示:在串口通信工具发送一个字符串 “youcans 20250110”,在接收区返回一个相同的字符串。
如果使用 VOFA+ 串口调试工具,运行结果是相同的,如下图所示。
- 关闭项目,关闭 STM32CubeIDE 。
4. UART 常用函数
4.1 串口句柄
STM32CubeMX 定义一个结构体类型全局变量huart,为 UART_HandleTypeDef 结构体指针类型,即串口句柄:
UART_HandleTypeDef huart1;
串口的初始化函数里面就是对该结构体成员变量进行初始化。
Instance 是 USART_TypeDef 结构体指针类型变量,它是执行寄存器基地址,实际上这个基地址 HAL 库已经定义好了,如果是串口 1,取值为 USART1 即可。
Init 是 UART_InitTypeDef 结构体类型变量,它是用来设置串口的各个参数,包括波特率,停止位等
typedef struct
{uint32_t BaudRate; //波特率uint32_t WordLength; //字长uint32_t StopBits; //停止位uint32_t Parity; //奇偶校验uint32_t Mode; //收/发模式设置uint32_t HwFlowCtl; //硬件流设置uint32_t OverSampling; //过采样设置
}UART_InitTypeDef
变量 pTxBuffPtr,TxXferSize 和 TxXferCount 分别是用来设置串口发送的数据缓存指针、发送的数据量和还剩余的要发送的数据量。
变量 pRxBuffPtr, RxXferSize 和RxXferCount 分别是用来设置接收的数据缓存指针、接收的最大数据量以及还剩余的要接收的数据量。
变量 hdmatx 和 hdmarx 是串口 DMA 相关的变量,指向 DMA 句柄。
4.2 HAL_UART_Transmit
通过函数 HAL_UART_Transmit 向串口寄存器 USART_DR 写入一个数据,当向该寄存器写数据的时候,串口就会自动发送。
函数原型为:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
其中:huart 为串口句柄,pData 为发送数据的地址,Size 为发送数据的大小,Timeout 为超时时间。
例程如下:
void Usart_Proc(void)
{if((uwTick - uwTick_Usart_Set_Point) < 500) return;uwTick_Usart_Set_Point = uwTick;sprintf(str,"%4d : Hello,World.\r\n",counter);HAL_UART_Transmit(&huart1,(unsigned char *)str,strlen(str),50);if(++counter == 10000)counter = 0;
}
4.3 HAL_UART_Receive_IT
函数 HAL_UART_Receive_IT 的作用是开启接收中断,同时设置接收的缓存区以及接收的数据量,并进入回调函数。
函数原型为:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
其中:第一个参数是 USART 句柄类型变量,第二个参数是接收区缓冲区,第三个是接收数目。
在使能 USART 接收中断之后,STM32 在每次接收到一个字节数据之后,就会自动运行USART1_IRQHandler 函数一次,但不会每次都运行 HAL_UART_RxCpltCallback 函数。只有当接收到数据字节数与在 HAL_UART_Receive_IT 函数设定的接收数目相等时才会运行一次接收完成回调函数。
4.4 HAL_UART_RxCpltCallback
函数 USART1_IRQHandler 是 USART1 的中断服务函数,只要产生 USART1 中断就会运行一次该函数。该函数一般存放在 stm32f1xx_it.c 文件中,函数中调用 HAL_UART_IRQHandler。
函数 HAL_UART_IRQHandler 是 HAL 库函数定义在 stm32f4xx_hal_uart.c 文件中,该函数会判断到底是产生哪种串口中断:串口接收、串口发送或串口发送完成。
判断接到串口数据,且数据数目达到设定值时,就会调用接收完成回调函数 HAL_UART_RxCpltCallback。这样我们在回调函数中实现我们的应用程序。
当 CPU 向串口发送数据,会产生接收中断,然后进入中断服务函数,调用回调函数进行中断处理。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{LED_Display(0xff);// 进入接收中断,led灯电平变化一次HAL_Delay(200);LED_Display(0x00);HAL_UART_Receive_IT(&huart1, &rx_buffer,1);LCD_DisplayStringLine(Line9,&rx_buffer);LCD_DisplayStringLine(Line8,"122");
}
参考资料:
- P-NUCLEO-IHM03 STM32电机控制套件
- UM2505 - STM32G4 Nucleo-64 boards (MB1367), STMicroelectronics/意法半导体, 2021
- UM2538 - STM32 motor-control pack using the FOC algorithm for three-phase, low-voltage, and low‑current motor evaluationl, STMicroelectronics/意法半导体, 2023
- 许少伦等,STM32G4入门与电机控制实战,电子工业出版社,2023
版权声明:
【动手学电机驱动】是 youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/145090013)
Copyright@youcans 2025
Crated:2025-01
相关文章:
【动手学电机驱动】STM32-FOC(4)STM32之UART 串口通信
STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)STM32之UART 串口通信 STM32-FOC(6&am…...
RabbitMQ 高可用方案:原理、构建与运维全解析
文章目录 前言:1 集群方案的原理2 RabbitMQ高可用集群相关概念2.1 设计集群的目的2.2 集群配置方式2.3 节点类型 3 集群架构3.1 为什么使用集群3.2 集群的特点3.3 集群异常处理3.4 普通集群模式3.5 镜像集群模式 前言: 在实际生产中,RabbitM…...
Center Loss 和 ArcFace Loss 笔记
一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度,通过约束样本特征与其类别中心之间的距离,提高类内特征的聚合性。 2. 公式 对于样本 xi 和其类别yi,Center Loss 的公式为: xi: 当前样本的特征向量&…...
深度解读微软Speech服务:让语音识别走进现实
大家好,今天我们来探讨一个激动人心的技术话题:微软的语音识别服务如何为我们提供强大的语音识别解决方案,特别是在电话录音中识别出不同的说话人。 场景描绘 想象一下,你有一段电话录音,并需要将其中的多个说话人区分…...
第21篇 基于ARM A9处理器用汇编语言实现中断<三>
Q:怎样编写ARM A9处理器汇编语言代码配置按键端口产生中断? A:使用Intel Monitor Program创建中断程序时,Linker Section Presets下拉菜单中需选择Exceptions。主程序在.vectors代码段为ARM处理器设置异常向量表,在…...
专题 - STM32
基础 基础知识 STM所有产品线(列举型号): STM产品的3内核架构(列举ARM芯片架构): STM32的3开发方式: STM32的5开发工具和套件: 若要在电脑上直接硬件级调试STM32设备,则…...
极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案
作者:卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…...
【C++指南】模板 深度解析
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 1. 引言 2. 模板的基本概念 3. 函数模板 3.1 定义和语法 3.2 函数模板实例化 3.3 隐式实例化 …...
【traefik】forwadAuth中间件跨namespace请求的问题
前情提要 - fowardAuth鉴权中间件的使用: 【traefik】使用forwardAuth中间件做网关层的全局鉴权 1. 问题 我的 traefik-ingress-controller 所在 namespace: traefik 业务服务所在 namespace: apps 路由与 forwardAuth 中间件配置如下: # 路由 apiV…...
【25考研】西南交通大学软件工程复试攻略!
一、复试内容 复试对考生的既往学业情况、外语听说交流能力、专业素质和科研创新能力,以及综合素质和一贯表现等进行全面考查,主要考核内容包括思想政治素质和道德品质、外语听说能力、专业素质和能力,综合素质及能力。考核由上机考试和面试两部分组成&a…...
在 Safari 浏览器中,快速将页面恢复到 100% 缩放(也就是默认尺寸)Command (⌘) + 0 (零)
在 Safari 浏览器中,没有一个专门的快捷键可以将页面恢复到默认的缩放比例。 但是,你可以使用以下两种方法快速将页面恢复到 100% 缩放(也就是默认尺寸): 方法一:使用快捷键 (最常用) Command (⌘) 0 (零…...
linux的大内核锁与顺序锁
大内核锁 Linux大内核锁(Big Kernel Lock,BKL)是Linux内核中的一种锁机制,用于保护内核资源,以下是关于它的详细介绍: 概念与作用 大内核锁是一种全局的互斥锁,在同一时刻只允许一个进程访问…...
CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞
漏洞描述 GiveWP 插件中发现了一个严重漏洞,该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777,CVSS 评分为 9.8,表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装,为全球无数捐赠平…...
牛客周赛 Round 76题解
小红出题 思路:我们发现,每七天可以获得15元,那么我们可以对7取模,看能有多少7的倍数,然后剩下的就是看是否超过5,超过5就直接15,否则加上天数*3 #include<bits/stdc.h> using namespace…...
【ARM】MDK如何将变量存储到指定内存地址
1、 文档目标 通过MDK的工程配置,将指定的变量存储到指定的内存地址上。 2、 问题场景 在项目工程的开发过程中,对于flash要进行分区,需要规划出一个特定的内存区域来存储变量。 3、软硬件环境 1)、软件版本:MDK 5.…...
解决在arm架构下的欧拉操作系统mysql8.4.2源码安装
目标:在欧拉的22.03 (LTS-SP4)版本操作系统,cpu的架构为ARM,源码安装mysql-8.4.2。 1.查看操作系统 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP4)"# uname -i aarch642.mysql下载地址 mysql的下载…...
SpringAop
SpringAop aop定义核心概念aop基础实现执行流程 aop进阶通知类型切入点表达式的抽取通知的执行顺序切入点表达式execution方式实现annotation注解方式实现示例 笔记链接 aop定义 AOP:Aspect Oriented Programming(面向切面编程、面向方面编程)…...
C++内存泄露排查
内存泄漏是指程序动态分配的内存未能及时释放,导致系统内存逐渐耗尽,最终可能造成程序崩溃或性能下降。在C中,内存泄漏通常发生在使用new或malloc等分配内存的操作时,但没有正确地使用delete或free来释放这块内存。 在日常开发过程…...
Cesium小知识:pointPrimitive collection 详解
Cesium.PointPrimitiveCollection 是 Cesium 中用于高效管理和渲染大量点(points)的一个类。它允许你创建和管理大量的 PointPrimitive 实例,这些实例可以用来表示地理空间中的点数据,如传感器位置、车辆位置、兴趣点等。与直接使用 Cesium.Entity 相比,PointPrimitiveCol…...
从 Conda 到 Pip-tools:Python 依赖管理全景探索20250113
从 Conda 到 Pip-tools:Python 依赖管理全景探索 引言 在 Python 开发中,依赖管理是一个"常见但复杂"的问题:一次简单的版本冲突可能让团队调试数小时;一次不受控的依赖升级可能让生产环境瘫痪。随着项目规模的增加和…...
浅谈云计算01 | 云计算服务的特点
在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…...
2025年,华为认证HCIA、HCIP、HCIE 该如何选择?
眼看都到 2025 年啦,华为认证还吃香不? 把这问题摆在每个网络工程师跟前,答案可没那么容易说清楚。 到底考不考它值当不值当,重点在于您自己的职业规划,还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…...
使用Selenium进行网页自动化测试
在使用Selenium进行网页自动化测试时,获取网络请求数据(即network数据)并不直接由Selenium库提供。Selenium主要用于与网页内容进行交互(如点击、输入文本、获取页面元素等),但它本身不拦截或记录网络请求。…...
Linux 下 mtrace 的详细介绍
在 Linux 系统中,内存管理是操作系统的一项重要任务,而内存泄漏(Memory Leak)是开发过程中常见且棘手的问题之一。为了帮助开发者追踪和调试内存泄漏问题,mtrace 提供了一种有效的方式来检测和分析内存的分配与释放情况…...
【DB-GPT】开启数据库交互新篇章的技术探索与实践
一、引言:AI原生数据应用开发的挑战与机遇 在数字化转型的浪潮中,企业对于智能化应用的需求日益增长。然而,传统的数据应用开发方式面临着诸多挑战,如技术栈复杂、开发周期长、成本高昂、难以维护等。这些问题限制了智能化应用的…...
深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比
众所周知,不管是什么框架,在前端 UI 渲染时,都会有构造出一套相关的渲染树,并且在 UI 更新时,为了尽可能提高性能,一般都只会进行「差异化」更新,而不是对整个 UI Tree 进行刷新,所以…...
Android 网络层相关介绍
关注 Android 默认支持的网络管理行为,默认支持的网络服务功能。 功能术语 术语缩写全称释义DHCPv6Dynamic Host Configuration Protocol for IPv6动态主机配置协议的第六版,用于在IPv6网络中动态分配IP地址和其他网络配置参数。DNS Domain Name System域名系统。LLALink-Loc…...
ThreeJs开发环境安装与首个DEMO
安装开发环境 我这边使用的JetBrain的WebStorm,咨询过很多其他开发从业者,普遍使用vscode的比较多。但是考虑到vscode涉及到不少插件安装和IDE配置,作为傻瓜式入门,我这边采用WebStorm。 下载地址: WebStorm: The J…...
【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起,正向定位到当前行的首个字符 b2 从光标位置起,反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…...
js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值
问: 现在tabData.value 接收到了后端返回的数据, [{text:人力,percentage:‘90’},{text:物品,percentage:‘20’},{text:物理,percentage:‘50’},{text:服务,percentageÿ…...
线形回归与小批量梯度下降实例
1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…...
【数学】概率论与数理统计(三)
文章目录 [toc] 随机变量的概念随机事件数量化随机变量 离散型随机变量及其概率分布随机变量的分类离散型随机变量离散型随机变量的常见分布两点分布二项分布泊松分布泊松定理证明 泊松分布 超几何分布几何分布 连续型随机变量及其概率分布连续型随机变量零概率事件几乎必然发生…...
如何在 Linux、MacOS 以及 Windows 中打开控制面板
控制面板不仅仅是一系列图标和菜单的集合;它是通往优化个人计算体验的大门。通过它,用户可以轻松调整从外观到性能的各种参数,确保他们的电脑能够完美地适应自己的需求。无论是想要提升系统安全性、管理硬件设备,还是简单地改变桌…...
《AI赋能鸿蒙Next,开启智能关卡设计新时代》
在游戏开发领域,关卡设计是至关重要的一环,它直接影响着玩家的游戏体验和沉浸感。而随着人工智能技术的飞速发展,结合鸿蒙Next系统的强大功能,为游戏的智能关卡设计带来了全新的思路和方法。 利用AI学习玩家行为模式 在鸿蒙Next…...
Safari浏览器上ico图标显示不出来,怎么解决?
Safari浏览器上ico图标显示不出来,怎么解决? 如果Safari浏览器上ico图标显示不出来了,如下图,该图标显示为灰色。 可以关闭Safari浏览器,并清除历史记录,就可以解决啦。 另外,如果多个网站这…...
Java Bean Validation 不适用Spring的情况下自定义validation注解
Java Bean Validation(也称为 JSR 380,为 Bean Validation 2.0 规范)提供了一套基本的注解,用于定义和验证 Java Bean 的属性。例如: NotNull:属性不能为空 Size:字符串、集合或数组的大小有约…...
【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)
测试题目:AcWing 868. 筛质数 埃氏筛(Sieve of Eratosthenes) 如果 i i i是素数,每次把 i i i的倍数都筛掉,存在重复筛选,时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) n⋅log(logn)。 #includ…...
风控业务——评分模型
本文主要讲述了金融机构风控模型的重要性及其应用。首先,开头概述了风控模型的整体建模流程,包括特征工程和建模方法。接着,本文强调了贷前、贷中、贷后三个阶段中风控模型的应用,如信用评分、行为评分和催收评分。同时还提到了信…...
jupyter notebook练手项目:线性回归——学习时间与成绩的关系
线性回归——学习时间与学习成绩的关系 第1步:导入工具库 pandas——数据分析库,提供了数据结构(如DataFrame和Series)和数据操作方法,方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库,p…...
DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…...
《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统
目录 基于 ESKF 的松耦合 LIO 系统 1 坐标系说明 2 松耦合 LIO 系统的运动和观测方程 3 松耦合 LIO 系统的数据准备 3.1 CloudConvert 类 3.2 MessageSync 类 4 松耦合 LIO 系统的主要流程 4.1 IMU 静止初始化 4.2 ESKF 之 运动过程——使用 IMU 预测 4.3 使用 IMU 预测位姿进…...
day07_Spark SQL
文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义(掌握)1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…...
【LC】2270. 分割数组的方案数
题目描述: 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 : 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素,也就是…...
Docker 容器通信的网络模式详解
Docker 的网络模式是容器化技术中非常重要的一部分,它决定了容器之间以及容器与外部世界如何通信。Docker 提供了多种网络模式,每种模式都有其特定的使用场景和优势。本文将深入探讨 Docker 的网络模式,包括桥接模式、主机模式、覆盖网络模式…...
Apache和PHP:构建动态网站的黄金组合
在当今的互联网世界,网站已经成为了企业、个人和机构展示自己、与用户互动的重要平台。而在这些动态网站的背后,Apache和PHP无疑是最受开发者青睐的技术组合之一。这一组合提供了高效、灵活且可扩展的解决方案,帮助您快速搭建出强大的网站&am…...
一个简单的html5导航页面
一个简单的 HTML5 导航页面的示例代码: html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…...
积木仪表盘 出现 “没有权限,请联系管理员分配权限“ 解决方法
目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 原先写过报表的错误!但错误解决方式不一样:jmreport测试数据库出现 权限不足,此功能需要分配角色 解决方法 1. 问题所示 出现 没有权限,请联系管理员分配权限 的…...
C++语言的循环实现
C语言中的循环实现 引言 在程序设计中,循环是一个至关重要的概念。它允许我们在满足某种条件时重复执行某段代码,从而实现复杂的逻辑和算法。C作为一种强大的编程语言,提供了多种循环结构来满足不同的需求。本文将深入探讨C中的循环实现&am…...
高级java每日一道面试题-2025年01月13日-框架篇[Spring篇]-Spring 是怎么解决循环依赖的?
如果有遗漏,评论区告诉我进行补充 面试官: Spring 是怎么解决循环依赖的? 我回答: 在Java高级面试中,Spring框架如何解决循环依赖是一个重要且常见的问题。以下是对Spring解决循环依赖的详细解释: 循环依赖的定义与类型 循环依赖是指两个或多个Bea…...
.Net Core Record 类型
public class Person { public string id {get;init;} public string code {get;init;} public string name {get;init;} } //Person 属性不可单独赋值,相当于使用record定义 public record Person string id,string code,string name) //record类…...