当前位置: 首页 > news >正文

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习

摘要

本文旨在为初学者提供一个关于STM32F407微控制器HAL(Hardware Abstraction Layer)库框架设计的详细学习教程。通过本文,读者将从零开始,逐步掌握STM32F407的基本知识、HAL库的配置步骤、HAL库函数的使用方法,并通过配套的例程和代码注释加深理解。本文内容涵盖基础知识、配置步骤、HAL库函数详解、配套例程和总结,并附有思维导图以帮助读者更好地理解知识结构。


初学者重要提示

在开始学习STM32F407和HAL库之前,请注意以下几点:

  1. 硬件准备
    • 确保你拥有STM32F407开发板,并熟悉其硬件结构。
    • 准备好调试工具,如ST-Link或类似设备。
  2. 软件安装
    • 安装STM32CubeMX和STM32CubeIDE。
    • 安装STM32Cube_FW_F4固件库。
  3. 开发环境配置
    • 确保STM32CubeMX和STM32CubeIDE已正确配置,并能够生成和编译项目。
  4. 学习资源
    • 熟悉STM32F407的数据手册和HAL库参考手册。
    • 参考STM32CubeMX和STM32CubeIDE的用户指南。
  5. 编程基础
    • 熟悉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库之前,需要先搭建开发环境。以下是搭建开发环境的步骤:

  1. 安装STM32CubeMX:STM32CubeMX是一个图形化配置工具,用于配置STM32微控制器的外设和时钟。
  2. 安装STM32CubeIDE:STM32CubeIDE是基于Eclipse的集成开发环境,用于STM32项目的开发和调试。
  3. 安装STM32Cube_FW_F4:这是STM32F4系列的HAL库和底层固件库,包含HAL库的源代码和头文件。

2. 配置步骤

2.1 使用STM32CubeMX配置STM32F407

  1. 打开STM32CubeMX,选择STM32F407VG芯片。
  2. 配置时钟:在“Clock Configuration”选项卡中,配置系统时钟为168MHz。
  3. 配置GPIO:在“Pinout & Configuration”选项卡中,配置GPIO引脚的功能。例如,配置GPIOA的第5引脚为LED输出。
  4. 配置其他外设:根据需要配置其他外设,如UART、SPI、I2C等。
  5. 生成代码:完成配置后,点击“Generate Code”按钮,选择保存路径,生成初始化代码。

2.2 在STM32CubeIDE中配置项目

  1. 导入生成的代码:在STM32CubeIDE中,选择“File” -> “Import” -> “STM32CubeMX Project” -> “Existing STM32CubeMX Project”,导入生成的代码。
  2. 配置项目:在“Project Explorer”中,右键点击项目,选择“Properties”,配置项目属性,如调试配置、编译选项等。
  3. 构建项目:点击“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库的配置步骤…...

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ??微服务带来的挑战 二.微服务解决方案SpringCloud ??SpringCloud的版本 ??SpringCloud和SpringBoot的关系 ??SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ??Spring Cloud 实现对比 在入门Spring Cloud 之前&…...

基于ssm的校园跑腿管理系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…...

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…...

docker通用技术介绍

docker通用技术介绍 1.docker介绍 1.1 基本概念 docker是一个开源的容器化平台&#xff0c;用于快速构建、打包、部署和运行应用程序。它通过容器化技术将应用及其依赖环境&#xff08;如代码、库、系统工具等&#xff09;打包成一个标准化、轻量级的独立单元&#xff0c;实…...

#渗透测试#批量漏洞挖掘#某图创图书馆集群管理系统updOpuserPw SQL注入(CVE-2021-44321)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

智能合约安全 | 合约无效化攻击

目录&#xff1a; 智能合约安全 合约无效化攻击 合约自毁函数 selfdestruct 攻击实现 漏洞防御 总结 智能合约安全 合约无效化攻击 合约无效化攻击类同于web安全中的逻辑漏洞中的一种 我们这里拿一个典型的例子来讲解 有这样一份智能合约, 每个人可以向其中发送1 eth 第七个…...

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…...

【手撕算法】K-Means聚类全解析:从数学推导到图像分割实战

摘要 聚类算法是探索数据内在结构的利器&#xff01;本文手撕K-Means核心公式&#xff0c;结合Python代码实现与图像分割案例&#xff0c;详解&#xff1a; ✅ 欧氏距离计算 ✅ 簇中心迭代更新 ✅ 肘部法则优化 目录 摘要 目录 一、算法核心思想 二、数学原理详解 2.1 …...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库…...

RabbitMQ系列(二)基本概念之Publisher

在 RabbitMQ 中&#xff0c;Publisher&#xff08;发布者&#xff09; 是负责向 RabbitMQ 服务器发送消息的客户端角色&#xff0c;通常被称为“生产者”。以下是其核心功能与工作机制的详细解析&#xff1a; 一、核心定义与作用 消息发送者 Publisher 将消息发送到 RabbitMQ 的…...

OAK相机的抗震性测试

在工业环境中&#xff0c;双目视觉相机必须具备与工作环境同等的坚固性。鉴于部分客户会将我们的相机应用于恶劣环境&#xff08;例如安装在重型机械上&#xff09;&#xff0c;我们依据EN 60068-2-6:2008标准对相机进行了振动耐受性测试。 测试涉及的相机型号包括&#xff1a…...

2025最新Nginx高频面试题

2025最新Nginx高频面试题 摘要&#xff1a;本文整理了2025年企业高频Nginx面试题&#xff0c;覆盖核心原理、配置优化、安全防护及云原生场景实战&#xff0c;助你轻松应对技术面试&#xff01; 核心原理篇 1. Nginx的Master-Worker架构优势是什么&#xff1f; 答案&#xf…...

【Kubernetes】API server 限流 之 maxinflight.go

这个文件实现了一个基于信号量(Channel)的简单限流器。 基础知识 总共有四种channel 带缓冲的channel nonMutatingChan、mutatingChan 都是带缓冲的channel &#xff0c;这类channel 的特点是&#xff1a; 这允许最多 mutatingLimit /nonMutatingLimit 个请求同时获取令牌并执…...

推荐算法工程师的技术图谱和学习路径

推荐算法工程师的技术图谱和学习路径可以从多个维度进行概述,可以总结如下: 一、技术图谱 推荐算法工程师需要掌握的技术栈主要分为以下几个方面: 数学基础: 微积分、线性代数、概率论与统计学是推荐算法的基础,用于理解模型的数学原理和优化算法。高等数学、最优化理论…...

Milvus高性能向量数据库与大模型结合

Milvus | 高性能向量数据库&#xff0c;为规模而构建Milvus 是一个为 GenAI 应用构建的开源向量数据库。使用 pip 安装&#xff0c;执行高速搜索&#xff0c;并扩展到数十亿个向量。https://milvus.io/zh Milvus 是什么&#xff1f; Milvus 是一种高性能、高扩展性的向量数据…...

轮式机器人在复杂地形中如何选择合适的全局路径规划算法?

已思考完成 收起 嗯&#xff0c;用户问的是轮式机器人在复杂地形中如何选择合适的全局路径规划算法。首先&#xff0c;我需要理解复杂地形可能带来的挑战&#xff0c;比如崎岖的路面、动态障碍物、非结构化环境等等。轮式机器人在这里的运动控制需要考虑地形通过性、稳定性&…...

Metal学习笔记九:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…...

【字符串】最长公共前缀 最长回文子串

文章目录 14. 最长公共前缀解题思路&#xff1a;模拟5. 最长回文子串解题思路一&#xff1a;动态规划解题思路二&#xff1a;中心扩散法 14. 最长公共前缀 14. 最长公共前缀 ​ 编写一个函数来查找字符串数组中的最长公共前缀。 ​ 如果不存在公共前缀&#xff0c;返回空字符…...

SH_MLCD_J:Sharp HR-TFT内存液晶驱动库详解

1. 项目概述SH_MLCD_J 是一款专为驱动 Sharp 公司 HR-TFT 系列单色内存液晶显示屏&#xff08;Monochrome Memory LCD&#xff09;设计的嵌入式底层图形库。该库被广泛应用于秋月电子等国内元器件分销商所售的 SHARP 原厂模组&#xff0c;典型型号包括 LS013B7DH03、LS027B7DH0…...

STM32智能农业大棚监控系统开发实战

1. 项目概述这个基于STM32F103C8T6的智能农业大棚监控系统&#xff0c;是我去年为一个农业科技公司开发的物联网解决方案。传统大棚管理最大的痛点就是依赖人工经验&#xff0c;农户需要频繁进出大棚检查温湿度、土壤墒情&#xff0c;不仅效率低下&#xff0c;还经常错过最佳调…...

4月3日打卡

20:20开始&#xff0c;学习90分钟...

macOS 26.4推送,新增充电上限,利好电池寿命

macOS 26.4 新增自定义充电上限&#xff0c;有效延长 Mac 电池寿命。搭配CleanMyMac电池监控功能&#xff0c;实时掌握健康度、循环次数与温度&#xff0c;软硬结合保护电池。苹果于2026年3月24日正式推送了macOS Tahoe 26.4版本更新。本次更新最受关注的变化&#xff0c;是为M…...

HTML5+CSS3静态网页设计:从零搭建丝绸之路文化展示网站(学生作业实战)

HTML5CSS3静态网页设计实战&#xff1a;丝绸之路文化展示网站开发全流程 在数字化时代&#xff0c;传统文化如何通过网页设计焕发新生&#xff1f;对于计算机专业学生而言&#xff0c;将技术能力与文化主题结合的网页设计作业&#xff0c;不仅能展现编程水平&#xff0c;更是培…...

EcomGPT-中英文-7B电商模型在Vue.js前端项目中的集成:打造实时智能客服聊天组件

EcomGPT-中英文-7B电商模型在Vue.js前端项目中的集成&#xff1a;打造实时智能客服聊天组件 最近在做一个电商后台的升级项目&#xff0c;客户提了个需求&#xff0c;希望能在用户端和管理后台都加上一个智能客服&#xff0c;能实时回答商品咨询、订单状态这些常见问题。一开始…...

Git 仓库搬家后,如何让本地仓库“认新家”?——小白也能看懂的远程地址修改指南

Git 仓库搬家后&#xff0c;如何让本地仓库“认新家”&#xff1f;——小白也能看懂的远程地址修改指南 一句话总结&#xff1a;当你的 Git 仓库迁移到新地址后&#xff0c;只需更新本地仓库的“通讯录”&#xff0c;并告诉 Git “以后默认推送到新家”&#xff0c;即可无缝切换…...

AI学习笔记二

一&#xff0c;NumPy库1&#xff0c;定义NumPy 是 Python 科学计算的核心库&#xff0c;专为多维数组&#xff08;ndarray&#xff09; 设计&#xff0c;比 Python 原生列表快 10~100 倍&#xff0c;是数据分析、机器学习、深度学习的基础。2&#xff0c;基础代码示例import nu…...

从特征多项式到行列式:揭秘矩阵特征值之积的几何意义

1. 特征多项式&#xff1a;打开矩阵奥秘的钥匙 我第一次接触特征多项式时&#xff0c;完全被这个抽象的概念搞晕了。直到有一天&#xff0c;我的导师用了一个简单的比喻&#xff1a;"特征多项式就像是矩阵的DNA检测报告&#xff0c;它能告诉我们这个矩阵最本质的特性。&qu…...

C# TCP服务端开发实战:从零构建高效网口调试工具

1. 为什么需要自建TCP调试工具&#xff1f; 做上位机开发的朋友应该都深有体会&#xff0c;网口通讯调试是绕不开的日常。市面上的调试助手要么功能简陋&#xff0c;要么收费昂贵&#xff0c;最头疼的是遇到特殊需求时根本找不到合适的工具。去年我在做一个工业设备监控项目时&…...