【STM32】HAL库中的实现(四):RTC (实时时钟)

🕒HAL库中的实现:RTC(Real-Time Clock)实时时钟

RTC 是 STM32 的低功耗实时时钟模块,常用于:

  • 实时时间维护(年月日时分秒)
  • 定时唤醒
  • 日志时间戳
  • 闹钟功能

RTC(实时时钟)模块 提供了 三个中断源用于在不同时间条件下触发事件。这些中断在 低功耗唤醒、定时任务、系统监控等场景下使用。

🕒 RTC 的三个中断源
中断类型含义用途HAL支持情况
秒中断(Second Interrupt)每秒触发一次定时刷新、节拍事件❌ HAL 默认未封装,需裸机配置
闹钟中断(Alarm Interrupt)到指定时间触发一次定时唤醒、事件提醒✅ HAL 封装完整
溢出中断(Overflow Interrupt)RTC 计数器溢出时触发长时间周期事件(如每86400秒)❌ HAL 默认未封装,需裸机配置

CubeMX配置:
在这里插入图片描述
在这里插入图片描述

RTC时钟秒更新中断流程:
在这里插入图片描述

🧾 业务代码配置( RTC 秒中断功能)

配置流程:

步骤状态说明
RTC 初始化使用 MX_RTC_Init() 初始化
启用秒中断__HAL_RTC_SECOND_ENABLE_IT(&hrtc, RTC_IT_SEC);
中断向量启用RTC_IRQn 已在中断向量表中启用
回调函数实现HAL_RTCEx_RTCEventCallback() 已实现
中断函数转发RTC_IRQHandler() 中调用了 HAL_RTCEx_RTCIRQHandler()
时钟源配置使用 LSI,稳定性较好
获取时间每秒打印当前时间
+------------------+
| RTC 每秒更新     |
+--------+---------+|v
+-------------------------+
| RTC_IRQn 中断触发      |
+-------------------------+|v
+-------------------------+
| HAL_RTCEx_RTCIRQHandler |
+-------------------------+|v
+-----------------------------+
| HAL_RTCEx_RTCEventCallback |
| (打印函数)           |
+-----------------------------+
完整代码(中断的方式获取时间)

📄 stm32f1xx_it.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    stm32f1xx_it.c* @brief   Interrupt Service Routines.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
#include "iwdg.h"
#include "rtc.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD *//* USER CODE END TD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//* External variables --------------------------------------------------------*/
extern RTC_HandleTypeDef hrtc;
extern TIM_HandleTypeDef htim3;
extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN EV *//* USER CODE END EV *//******************************************************************************/
/*           Cortex-M3 Processor Interruption and Exception Handlers          */
/******************************************************************************/
/*** @brief This function handles Non maskable interrupt.*/
void NMI_Handler(void)
{/* USER CODE BEGIN NonMaskableInt_IRQn 0 *//* USER CODE END NonMaskableInt_IRQn 0 *//* USER CODE BEGIN NonMaskableInt_IRQn 1 */while (1){}/* USER CODE END NonMaskableInt_IRQn 1 */
}/*** @brief This function handles Hard fault interrupt.*/
void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}/*** @brief This function handles Memory management fault.*/
void MemManage_Handler(void)
{/* USER CODE BEGIN MemoryManagement_IRQn 0 *//* USER CODE END MemoryManagement_IRQn 0 */while (1){/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 *//* USER CODE END W1_MemoryManagement_IRQn 0 */}
}/*** @brief This function handles Prefetch fault, memory access fault.*/
void BusFault_Handler(void)
{/* USER CODE BEGIN BusFault_IRQn 0 *//* USER CODE END BusFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_BusFault_IRQn 0 *//* USER CODE END W1_BusFault_IRQn 0 */}
}/*** @brief This function handles Undefined instruction or illegal state.*/
void UsageFault_Handler(void)
{/* USER CODE BEGIN UsageFault_IRQn 0 *//* USER CODE END UsageFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_UsageFault_IRQn 0 *//* USER CODE END W1_UsageFault_IRQn 0 */}
}/*** @brief This function handles System service call via SWI instruction.*/
void SVC_Handler(void)
{/* USER CODE BEGIN SVCall_IRQn 0 *//* USER CODE END SVCall_IRQn 0 *//* USER CODE BEGIN SVCall_IRQn 1 *//* USER CODE END SVCall_IRQn 1 */
}/*** @brief This function handles Debug monitor.*/
void DebugMon_Handler(void)
{/* USER CODE BEGIN DebugMonitor_IRQn 0 *//* USER CODE END DebugMonitor_IRQn 0 *//* USER CODE BEGIN DebugMonitor_IRQn 1 *//* USER CODE END DebugMonitor_IRQn 1 */
}/*** @brief This function handles Pendable request for system service.*/
void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}/*** @brief This function handles System tick timer.*/
void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */
}/******************************************************************************/
/* STM32F1xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f1xx.s).                    */
/******************************************************************************//*** @brief This function handles RTC global interrupt.*/
void RTC_IRQHandler(void)
{/* USER CODE BEGIN RTC_IRQn 0 *//* USER CODE END RTC_IRQn 0 */HAL_RTCEx_RTCIRQHandler(&hrtc);/* USER CODE BEGIN RTC_IRQn 1 *//* USER CODE END RTC_IRQn 1 */
}/*** @brief This function handles EXTI line0 interrupt.*/
void EXTI0_IRQHandler(void)
{/* USER CODE BEGIN EXTI0_IRQn 0 *//* USER CODE END EXTI0_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(PA0_Key_Pin);/* USER CODE BEGIN EXTI0_IRQn 1 *//* USER CODE END EXTI0_IRQn 1 */
}/*** @brief This function handles TIM3 global interrupt.*/
void TIM3_IRQHandler(void)
{/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&htim3);/* USER CODE BEGIN TIM3_IRQn 1 *//* USER CODE END TIM3_IRQn 1 */
}/*** @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}/* USER CODE BEGIN 1 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == PA0_Key_Pin){if( HAL_GPIO_ReadPin(PA0_Key_GPIO_Port, PA0_Key_Pin) == GPIO_PIN_RESET){HAL_GPIO_TogglePin(GPIOC, LED_G_Pin);	//红灯的状态翻转
//			HAL_IWDG_Refresh(&hiwdg);		//进行喂狗
//			printf("Iwdg Count = %d \r\n", Count++);}}
}void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{U1RxLen = Size;HAL_UARTEx_ReceiveToIdle_IT(&huart1, U1RxData, U1RxDataSize);	//启动串口空闲中断的接收U1RxFlag = 1;
}//TIM的中断回调函数 控制LED灯的闪烁
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//	static uint32_t Count = 0;if(htim->Instance == TIM3)	//判断产生中断的哪一个中断回调函数{HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);	//绿灯的状态翻转HAL_IWDG_Refresh(&hiwdg);		//进行喂狗
//		printf("Iwdg Count = %d \r\n", Count++);}
}RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);printf("TimeDate -> %d:%d:%d[%d] | %d:%d:%d	\r\n", sDate.Year,sDate.Month,sDate.Date,sDate.WeekDay,sTime.Hours,sTime.Minutes,sTime.Seconds);HAL_Delay(100);
}/* USER CODE END 1 */

📄 main.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "iwdg.h"
#include "rtc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t U1SendData[] = {"hello world!"};
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint16_t pwmVal = 0;	//占空比/* 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_USART1_UART_Init();MX_IWDG_Init();MX_TIM3_Init();MX_RTC_Init();/* USER CODE BEGIN 2 */HAL_UARTEx_ReceiveToIdle_IT(&huart1, U1RxData, U1RxDataSize);	//使能空闲中断HAL_TIM_Base_Start_IT(&htim3);// 启动定时器HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);	//PWM初始化完毕之后,找到对应PWM的启动函数__HAL_RTC_SECOND_ENABLE_IT(&hrtc, RTC_IT_SEC);	//开启秒更新中断/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */HAL_UART_Transmit(&huart1, U1SendData, sizeof(U1SendData), 0xff);	//启动串口空闲中断的发送while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.LSIState = RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/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();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

🧩 代码中的核心细节说明
  1. __HAL_RTC_SECOND_ENABLE_IT() 说明

这个宏开启了 秒中断(SECIE)

#define __HAL_RTC_SECOND_ENABLE_IT(__HANDLE__, __INTERRUPT__) \((__HANDLE__)->Instance->CRH |= (__INTERRUPT__))

配合:

#define RTC_IT_SEC ((uint32_t)RTC_CRH_SECIE)

它控制的是 RTC->CRH.SECIE 位,每秒触发一次 SECF 标志位,由 HAL 库内部清除。

  1. HAL_RTCEx_RTCEventCallback() 是 HAL 提供的专用 RTC 秒中断回调函数:
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
{// 每秒触发
}

它在 HAL_RTCEx_RTCIRQHandler() 中被调用:

if(__HAL_RTC_GET_IT(hrtc, RTC_IT_SEC) != RESET)
{__HAL_RTC_CLEAR_FLAG(hrtc, RTC_FLAG_SEC);HAL_RTCEx_RTCEventCallback(hrtc);
}

打印时钟:

HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);
HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);
printf("TimeDate -> %d:%d:%d[%d] | %d:%d:%d\r\n",sDate.Year, sDate.Month, sDate.Date, sDate.WeekDay,sTime.Hours, sTime.Minutes, sTime.Seconds);

每秒中断触发后,会打印一次当前时间,非常适合作为 RTC 秒事件验证。

另外,代码中可以去除 HAL_Delay(100):这是因为在中断中使用 HAL_Delay() 不太安全,可能引发系统异常或丢中断。也可以替代为:

// 替代 HAL_Delay(100) 或者不加延时,使用定时器节奏控制打印频率。
for (volatile uint32_t i = 0; i < 100000; ++i);

还有,使用 RTC_FORMAT_BIN 更直观,这是因为BCD 格式读取后要自己解码,而使用 BIN 格式更便于直接打印和逻辑判断。

HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);

最后,RTC 时钟源也可以用 LSE(32.768kHz),目前这里使用的是:

PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;

LSI 精度较低(±10%,温漂大),建议若有外部 32.768kHz 晶振,则改为:

PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

打印中也可以添加LED闪烁:

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 每秒闪烁一次LED

串口输出验证:(使用串口工具(如 SSCOM、PuTTY)查看打印内容是否每秒刷新。如图所示,是我打印出来的时钟:)

在这里插入图片描述

以上。 这便是 STM32 HAL库 + RTC 每秒中断功能 的实现。

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

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

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

相关文章

Pauli 矩阵指数函数展开为显式矩阵 e^A -> B

要展开表达式 为普通矩阵&#xff0c;其中 是 Pauli 矩阵&#xff0c; 是单位向量&#xff0c; 是实数。以下是详细推导步骤&#xff1a;1. Pauli 矩阵的性质Pauli 矩阵定义为&#xff1a;它们满足以下关系&#xff1a;​其中 是 Kronecker delta&#xff0c;​ 是 Levi-…

【Algorithm | 0x03 搜索与图论】DFS

DFS基础知识典型例题例1&#xff1a;n皇后问题例2&#xff1a;拍照例3&#xff1a;理发基础知识 核心原理&#xff1a;一条路走到黑 示意图&#xff1a;其含义表示&#xff0c;在这个图中顶层是第0层&#xff0c;也就是后面dfs的入口&#xff0c;一般从dfs(0)开始操作。 模版&a…

Redis的数据过期策略有哪些?

Redis内部通过两种主要策略来处理过期的Key&#xff1a; 惰性删除 惰性删除&#xff1a;顾明思议并不是在TTL到期后就立刻删除&#xff0c;而是在访问一个key的时候&#xff0c;Redis会先检查这个键是否过期。如果过期&#xff0c;就删除它&#xff0c;然后返回nil。 这种方式非…

水库雨水情测报和大坝安全监测系统解决方案

一、方案背景 在全球气候变化和极端天气频发的背景下&#xff0c;水库作为重要的水利设施&#xff0c;承担着防洪、供水、灌溉、发电等多重功能。然而&#xff0c;由于水库蓄水量巨大&#xff0c;一旦发生溃坝或运行异常&#xff0c;将对下游地区造成不可估量的生命财产损失。因…

BFS 和 DFS 编程思想、框架、技巧及经典例题总结

BFS 和 DFS 编程思想、框架、技巧及经典例题总结 一、核心编程思想 BFS&#xff08;广度优先搜索&#xff09; 核心思想&#xff1a;以「层次遍历」为核心&#xff0c;从起点出发&#xff0c;优先探索距离起点最近的节点&#xff0c;逐层扩散遍历。本质&#xff1a;通过「队列」…

【面试场景题】日志去重与统计系统设计

文章目录题目场景描述要求问题考察点解答思考一、核心解决方案&#xff08;基础版&#xff0c;单节点32GB内存、10台节点&#xff09;1. 整体架构选型2. 关键步骤详解&#xff08;1&#xff09;数据分片&#xff1a;解决“数据量大&#xff0c;单节点处理不了”的问题&#xff…

【Day 16】Linux-性能查看

目录 一、Stress系统压力测试工具 二、性能查看 &#xff08;一&#xff09;查看CPU # nproc # lscpu # top # uptime # mpstat 数字1 数字2 &#xff08;二&#xff09;查看内存 # dmidecode -t memory | less # free -h # …

【ICCV2017】Deformable Convolutional Networks

一、摘要尽管卷积神经网络&#xff08;CNN&#xff09;在视觉识别任务上取得巨大成功&#xff0c;但其固有的固定几何结构&#xff08;固定卷积采样网格、固定池化窗口、固定 RoI 划分&#xff09;严重限制了对未知几何变换&#xff08;尺度、姿态、形变、视角变化&#xff09;…

echarts在前后端分离项目中的实践与应用

目录 一、ECharts简介 二、后端数据接口设计 三、数据结构设计 1. 柱状图数据结构 2. 饼图数据结构 四、后端实现要点 五、前端ECharts配置解析 1. 柱状图配置 2. 饼图配置 六、最佳实践建议 七、总结 一、ECharts简介 ECharts是百度开源的一个基于JavaScript的可视…

SQL 四大语言分类详解:DDL、DML、DCL、DQL

SQL&#xff08;结构化查询语言&#xff09;通常被分为四种主要类型&#xff0c;每种类型负责不同的数据库操作。下面我将详细介绍这四类SQL语言的语法和用途。一、DDL (Data Definition Language) 数据定义语言功能&#xff1a;定义和管理数据库对象结构&#xff08;表、视图、…

ESP-idf框架下的HTTP服务器\HTML 485温湿度采集并长传

项目描述:本项目采用485采集温湿度以及电压电流等,485模块分别为下图,串口转485模块采用自动收发模块,ESP32工作在AP热点模式,通过手机连接esp32的热点来和esp进行数据通讯,使用esp32作为HTTP服务器缺陷:项目的最终HTML页面代码可发给AI让其写注释#include "freertos/Free…

雅江工程解锁墨脱秘境:基础条件全展示(区位、地震、景点、天气)

目录 前言 一、区位信息 1、空间位置 2、区位介绍 二、地震信息 1、历史地震信息 2、5.0级以上大地震 三、景点信息 1、景点列表分布 2、4A级以上景点 四、天气信息 1、天气实况 2、天气应对挑战 五、总结 前言 相信最近大家对雅江电站的超级大工程项目应该有所耳…

​​机器学习贝叶斯算法

​​一、引言​​在当今机器学习领域&#xff0c;贝叶斯算法犹如一颗璀璨的明星。你是否想过&#xff0c;垃圾邮件过滤系统是如何准确判断一封邮件是否为垃圾邮件的呢&#xff1f;这背后可能就有贝叶斯算法的功劳。今天&#xff0c;我们就一同走进贝叶斯算法的世界&#xff0c;…

Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)

以【5 Stage pipeline CPU】搜索图片&#xff0c;选取5幅有代表性的图列举如下&#xff0c;并结合Chisel代码进行理解和点评。 图1&#xff1a;原文链接如下 https://acsweb.ucsd.edu/~dol031/posts/update/2023/04/10/5stage-cpu-pipeline.html 点评&#xff1a;黑色的部分…

Docker容器中文PDF生成解决方案

在Docker容器中生成包含中文内容的PDF文件时&#xff0c;经常遇到中文字符显示为方块或乱码的问题。本文将详细介绍如何在Docker环境中配置中文字体支持&#xff0c;实现完美的中文PDF生成。 问题现象 当使用wkhtmltopdf、Puppeteer或其他PDF生成工具时&#xff1a; 中文字符…

2.java集合,线程面试题(已实践,目前已找到工作)

1线程的创建方式 继承Thread类实现Runnable接口实现Callable接口 2.这三种方式在项目中的使用有哪些&#xff0c;一般都是怎么用的 继承thread类实现线程的方式通过实现run方法来实现线程&#xff0c;通过run进行线程的启用实现runnable方法实现run方法&#xff0c;然后通过thr…

站在前端的角度,看鸿蒙页面布局

从Web前端转向鸿蒙&#xff08;HarmonyOS&#xff09;开发时&#xff0c;理解其页面布局的相似与差异是快速上手的核心。鸿蒙的ArkUI框架在布局理念上与Web前端有诸多相通之处&#xff0c;但也存在关键区别。以下从五个维度系统分析&#xff1a; &#x1f4e6; 一、盒子模型&a…

JavaWeb遗传算法、TSP、模拟退火、ACO算法等实战应用

Java Web中实现遗传算法的应用 以下是关于Java Web中实现遗传算法的应用场景和实例的整理,涵盖不同领域的解决方案和实现方法: 遗传算法基础结构 在Java Web中实现遗传算法通常需要以下核心组件: 种群初始化:随机生成初始解集。 适应度函数:评估个体优劣。 选择操作:轮…

【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南

一、项目背景与需求 视频介绍 【图像算法 - 09】基于深度学习的烟雾检测&#xff1a;从算法原理到工程实现&#xff0c;完整实战指南今天我们使用深度学习来训练一个烟雾明火检测系统。这次我们使用了大概一万五千张图片的数据集训练了这次的基于深度学习的烟雾明火检测模型&a…

间接制冷技术概念及特征

1、基本概念 (1)间接制冷技术即二次制冷技术。常规做法:二次冷却液储液罐增加放置于制冷系统管路,促使冷量再快捷的传递给载冷剂,继而载冷剂冷量促使冷库达到制冷效果。间接制冷技术:通过常压的二次冷却介质进行大循环传送冷量,在直接制冷剂不易应用的位置或者不可运用直…