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

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据


  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
  • 🔰说明:本人没有开通打赏功能,谨防上当受骗!
  • 📍DS1307 HAL外设驱动文件 https://github.com/lamik/DS1307_RTC_STM32_HAL

🎉基于STM32CubeMX配置工程,当然不局限与STM32其他型号的芯片的使用,只要是stm32芯片都可以使用该源文件,在任意一款STM32型号的单片机上进行驱动移植使用,方便项目移植,减少不必要的重复开发工作。

  • 🔖DS1307时钟模块
    在这里插入图片描述

  • 📜串口打印信息:
    在这里插入图片描述

📓功能说明

由于工程默认配置的外部中断引脚,没有配置上下拉,中断引脚输出浮空状态,浮空状态认为是处于高电平一直处于触发状态,个人使用的话可以配置为上下拉状态,以及通过外部上下拉电阻,将中断引脚至于一个确定电平状态,然后通过上升沿或下降沿触发中断,调用 I2C DMA数据接收,这种用于主动方式来获取时间。

📓STM32CubeMX配置

  • 🌿使能I2C接口
    在这里插入图片描述
  • 🌿开启DMA传输功能
    在这里插入图片描述
  • 🍁具体参数配置:
    在这里插入图片描述
    在这里插入图片描述

🔧GPIO引脚EXTI 配置

  • 🌿引脚可以根据个人需求任意指定。
    在这里插入图片描述

✅串口配置用于调试信息输出(非必须项)

  • ✨如果只是读取DS1307数据作为其他时基来源,可以不配置串口,这里是用来查看读取ds1307数据,所以启用串口功能。
    在这里插入图片描述

🎉以上配置可以根据个人需求进行引脚切换,以及外设选择。

🛠KEIL工程配置

  • 🔧usart.c文件中添加printf重映射,并在Keil设置中勾选MicroLib选项。
#include "stdio.h"
/*可调用printf*/
int fputc(int ch,FILE *f)
{/*&huart1指的是串口1,如果用别的串口就修改数字*/HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 1000);return ch;
}

📑DS1307驱动文件

  • 🌿DS1307.c文件
/** DS1307.c**	The MIT License.*  Created on: 4.09.2019*      Author: Mateusz Salamon*		Contact: mateusz@msalamon.pl**      Website: https://msalamon.pl/dalsze-zmagania-z-rtc-ds1307-i-pcf8563-na-stm32/*      GitHub: https://github.com/lamik/DS1307_RTC_STM32_HAL*/#include "DS1307.h"I2C_HandleTypeDef *hi2c_ds1307;uint8_t Ds1307Buffer[7];void DS1307_SetControlRegister(uint8_t Value)
{Value &= 0x93;// Put zeros where zero is needed 0b10010011HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_CONTROL, 1, &Value, 1, DS1307_I2C_TIMEOUT);
}void DS1307_GetControlRegister(uint8_t *Value)
{HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_CONTROL, 1, Value, 1, DS1307_I2C_TIMEOUT);
}void WriteBitToControlRegister(uint8_t BitNumber, uint8_t Value)
{uint8_t tmp;if(Value>1) Value = 1;DS1307_GetControlRegister(&tmp);tmp &= ~(1<<BitNumber);tmp |= (Value<<BitNumber);DS1307_SetControlRegister(tmp);
}
void DS1307_SQWEnable(uint8_t Enable)
{WriteBitToControlRegister(DS1307_CONTROL_SQUARE_WAVE_ENABLE, Enable);
}void DS1307_SQWRateSelect(uint8_t Rate)
{uint8_t tmp;if(Rate>3) Rate = 3;DS1307_GetControlRegister(&tmp);tmp &= ~(3<<DS1307_CONTROL_RATE_SELECT_0);tmp |= (Rate<<DS1307_CONTROL_RATE_SELECT_0);DS1307_SetControlRegister(tmp);
}void DS1307_OutputControl(uint8_t Enable)
{WriteBitToControlRegister(DS1307_CONTROL_OUTPUT_CONTROL, Enable);
}void DS1307_ClockHalt(uint8_t Enable)
{uint8_t tmp;if(Enable>1) Enable = 1;HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_SECONDS, 1, &tmp, 1, DS1307_I2C_TIMEOUT);tmp &= ~(1<<7);tmp |= (Enable<<7);HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_SECONDS, 1, &tmp, 1, DS1307_I2C_TIMEOUT);
}uint8_t bcd2dec(uint8_t BCD)
{return (((BCD & 0xF0)>>4) *10) + (BCD & 0xF);
}uint8_t dec2bcd(uint8_t DEC)
{return ((DEC / 10)<<4) + (DEC % 10);
}int dayofweek(int Day, int Month, int Year)
{int Y, C, M, N, D;M = 1 + (9 + Month) % 12;Y = Year - (M > 10);C = Y / 100;D = Y % 100;N = ((13 * M - 1) / 5 + D + D / 4 + 6 * C + Day + 5) % 7;return (7 + N) % 7;
}void DS1307_SetDateTime(RTCDateTime *DateTime)
{uint8_t tmp[7];if(DateTime->Second > 59) DateTime->Second = 59;if(DateTime->Minute > 59) DateTime->Minute = 59;if(DateTime->Hour > 23) DateTime->Hour = 23;if(DateTime->Day > 31) DateTime->Day = 31;if(DateTime->Month > 12) DateTime->Month = 12;if(DateTime->Year> 2099) DateTime->Year = 2099;tmp[0] = dec2bcd(DateTime->Second);tmp[1] = dec2bcd(DateTime->Minute);tmp[2] = dec2bcd(DateTime->Hour);tmp[3] = dayofweek(DateTime->Day, DateTime->Month, DateTime->Year) + 1;tmp[4] = dec2bcd(DateTime->Day);tmp[5] = dec2bcd(DateTime->Month);tmp[6] = dec2bcd(DateTime->Year - 2000);HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, tmp, 7, DS1307_I2C_TIMEOUT);
}void DS1307_CalculateDateTime(RTCDateTime *DateTime)
{DateTime->Second = bcd2dec(Ds1307Buffer[0]);DateTime->Minute = bcd2dec(Ds1307Buffer[1]);DateTime->Hour = bcd2dec(Ds1307Buffer[2] & 0x3F);DateTime->DayOfWeek = Ds1307Buffer[3];DateTime->Day = bcd2dec(Ds1307Buffer[4]);DateTime->Month = bcd2dec(Ds1307Buffer[5] & 0x1F);DateTime->Year = 2000 + bcd2dec(Ds1307Buffer[6]);
}#ifdef DS1307_USE_DMA
void DS1307_ReceiveDateTimeDMA(void)
{HAL_I2C_Mem_Read_DMA(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, Ds1307Buffer, 7);
}
#else
void DS1307_GetDateTime(RTCDateTime *DateTime)
{HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, Ds1307Buffer, 7, DS1307_I2C_TIMEOUT);DS1307_CalculateDateTime(DateTime);
}
#endifvoid DS1307_ReadRAM(uint8_t Address, uint8_t *Value, uint8_t Length)
{if((Address < DS1307_REG_RAM_START) || (Address > DS1307_REG_RAM_END)) return;if((Address + Length + DS1307_REG_RAM_START) > DS1307_REG_RAM_END) return;HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, Address, 1, Value, Length, DS1307_I2C_TIMEOUT);
}void DS1307_WriteRAM(uint8_t Address, uint8_t *Value, uint8_t Length)
{if((Address < DS1307_REG_RAM_START) || (Address > DS1307_REG_RAM_END)) return;if((Address + Length + DS1307_REG_RAM_START) > DS1307_REG_RAM_END) return;HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, Address, 1, Value, Length, DS1307_I2C_TIMEOUT);
}void DS1307_Init(I2C_HandleTypeDef *hi2c)
{hi2c_ds1307 = hi2c;DS1307_SQWRateSelect(SQW_RATE_1HZ);DS1307_SQWEnable(1);DS1307_ClockHalt(0);
//	Ds1307Buffer[0] = 0x00; // 初始化为写入ds1307的起始地址
//  Ds1307Buffer[1] = 0x80; // 控制寄存器,启用时钟输出
//  HAL_I2C_Master_Transmit_DMA(hi2c_ds1307, DS1307_ADDRESS, Ds1307Buffer, 2);
//  HAL_Delay(10); // 等待数据传输完成
}
void DS1307_ReadTime(I2C_HandleTypeDef *hi2c,uint8_t *time_data)
{hi2c_ds1307 = hi2c;Ds1307Buffer[0] = 0x00; // 读取ds1307的起始地址HAL_I2C_Master_Transmit_DMA(hi2c_ds1307, DS1307_ADDRESS, Ds1307Buffer, 1);HAL_I2C_Master_Receive_DMA(hi2c_ds1307, DS1307_ADDRESS, time_data, 7);HAL_Delay(10); // 等待数据传输完成
}
  • DS1307.h文件
/** DS1307.h** 	The MIT License.*  Created on: 4.09.2019*      Author: Mateusz Salamon*		Contact: mateusz@msalamon.pl**      Website: https://msalamon.pl/dalsze-zmagania-z-rtc-ds1307-i-pcf8563-na-stm32/*      GitHub: https://github.com/lamik/DS1307_RTC_STM32_HAL*/
#ifndef __DS1307_H__
#define __DS1307_H__//	Uncomment when you are using DMA reading
#include "main.h"#define DS1307_USE_DMA	#define DS1307_ADDRESS      (0x68<<1) //ds1307设备地址
#define DS1307_I2C_TIMEOUT			100#define DS1307_REG_TIME             0x00#define DS1307_REG_SECONDS          0x00
#define DS1307_REG_MINUTES          0x01
#define DS1307_REG_HOURS          	0x02
#define DS1307_REG_DAY              0x03
#define DS1307_REG_DATE             0x04
#define DS1307_REG_MONTH            0x05
#define DS1307_REG_YEAR             0x06
#define DS1307_REG_CONTROL          0x07
#define DS1307_REG_RAM_START        0x08
#define DS1307_REG_RAM_END     		0x3F//
//	Controll register 0x07
//
#define DS1307_CONTROL_OUTPUT_CONTROL			7
#define DS1307_CONTROL_SQUARE_WAVE_ENABLE		4
#define DS1307_CONTROL_RATE_SELECT_1			1
#define DS1307_CONTROL_RATE_SELECT_0			0typedef enum
{SQW_RATE_1HZ 		= 0,SQW_RATE_4096HZ 	= 1,SQW_RATE_8192HZ 	= 2,SQW_RATE_32768HZ 	= 3
}SQW_Rate;typedef struct
{uint16_t 	Year;uint8_t  	Month;uint8_t		Day;uint8_t		Hour;uint8_t		Minute;uint8_t		Second;uint8_t		DayOfWeek;
}RTCDateTime;void DS1307_SQWEnable(uint8_t Enable);
void DS1307_SQWRateSelect(uint8_t Rate);
void DS1307_OutputControl(uint8_t Enable);
void DS1307_ClockHalt(uint8_t Enable);void DS1307_ReadRAM(uint8_t Address, uint8_t *Value, uint8_t Length);
void DS1307_WriteRAM(uint8_t Address, uint8_t *Value, uint8_t Length);void DS1307_SetDateTime(RTCDateTime *DateTime);
#ifdef DS1307_USE_DMA
void DS1307_ReceiveDateTimeDMA(void);	// Use in DS1307 Interrupt handler
void DS1307_CalculateDateTime(RTCDateTime *DateTime);	// Use in DMA Complete Receive interrupt
#else
void DS1307_GetDateTime(RTCDateTime *DateTime);	// Use in blocking/interrupt mode in DS1307_INT EXTI handler
#endif
void DS1307_Init(I2C_HandleTypeDef *hi2c);#endif

📝主程序代码

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2023 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 "dma.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "DS1307.h"
#include "stdio.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* 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 */
RTCDateTime r;      // Date and Time variable
uint8_t Message[32]; // UART message
uint8_t MessageSize;
/* 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 */
//    RTCDateTime *tm;/* 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_DMA_Init();MX_USART1_UART_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */DS1307_Init(&hi2c1);uint32_t TimerUART = HAL_GetTick();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if ((HAL_GetTick() - TimerUART) > 1000){MessageSize = sprintf(Message, "%02d:%02d:%02d\n\r", r.Hour, r.Minute, r.Second);
//           MessageSize = sprintf(Message, "%02d:%02d:%02d\n\r", tm->Hour, tm->Minute, tm->Second);HAL_UART_Transmit(&huart1, Message, MessageSize, 1000);
//					printf("Time:%s \r\n",time_data);TimerUART = HAL_GetTick();HAL_GPIO_TogglePin(GPIOE, LED_Pin);}}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_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();}
}/* USER CODE BEGIN 4 */
#ifdef DS1307_USE_DMA
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == DS1307_INT_Pin){DS1307_ReceiveDateTimeDMA();}
}void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{DS1307_CalculateDateTime(&r);
}
#else
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == DS1307_INT_Pin){DS1307_GetDateTime(&r);printf("EXTI trigger! \r\n");}
}
#endif
/* 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 */

📚程序源码

  • 🎉工程基于STM32F103VE,可以根据个人适配到stm32任意一款型号的单片机上使用。
  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
    • 🔰说明:本人没有开通打赏功能,也没有接受任何第三方自助,谨防上当受骗!
链接: https://pan.baidu.com/s/192KP5ozCzGFGhtzUAyuUhQ
提取码: p7j7

相关文章:

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据

STM32基于STM32CubeMX DMA EXTI读取DS1307数据✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取&#xff0c;请多多尊重和支持原创!&#x1f341;对于文中所提供的相关资源链接将作不定期更换。&a…...

C#中的枚举器和迭代器

目录 一、可枚举类型和枚举器 1. 枚举器 2. 可枚举类 3. 使用 IEnumerable 和 IEnumerator 案例 4. 泛型枚举接口 二、迭代器 1. 使用迭代器创建枚举器 2. 使用迭代器创建可枚举类 3. 常见的迭代器模式 4. 产生多个枚举类型 5. 将迭代器作为属性 6. 迭代器的实质 一…...

中山大学人工智能学院——考研上岸经验贴

文章目录初试个人基本情况408数学英语政治复试初试 首先是初试成绩&#xff0c;中山大学在2.21号就公布了成绩和排名&#xff0c;这点很不错&#xff0c;有很多学校只公布成绩而没有排名。我的初试总分386&#xff0c;总排名第二&#xff0c;各个科目还是比较平均的&#xff1…...

ThreeJS-圣诞节表白3D贺卡(三十)

素材分享&#xff1a; 链接: https://pan.baidu.com/s/1l0mZWfkiLaXJfdvZ7XoY8w 提取码: i69h 提前预知&#xff1a; 向下滚动鼠标滑轮切换视角 关键代码&#xff1a; //初始化渲染器 const render new THREE.WebGLRenderer({ //设置抗锯齿&#xff0c;防失真 antialis: …...

040:cesium加载World Terrain地形图

第040个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载世界地形图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共64行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozh…...

逻辑运算和位移指令

逻辑运算指令 AND OR NOT XOR TEST 逻辑位移指令 SHL SHR 算术位移指令 SAL SAR 小循环位移指令 ROL ROR 大循环位移指令 RCL RCR AND 逻辑与指令 汇编格式&#xff1a;AND 目的操作数&#xff0c;源操作数 执行操作&#xff1a;&#xff08;目的操作数&#xff09;&…...

大家现在都去做Linux运维了吗?

运维自互联网出现以来&#xff0c;都是以基础技术部门的形式出现在各个互联网公司或者其他需要网络设备的公司里面&#xff0c;职位由来已久&#xff0c;也是多次徘徊在被淘汰的边缘。很多运维人都是靠着自己良好乐观的心态坚持到现在&#xff0c;接受新技术并学习新技术&#…...

Webpack的编译流程是怎么样的?webpack是如何工作的?

Webpack是一款非常流行的前端构建工具&#xff0c;用于将多个模块打包成一个或多个静态资源。它的工作原理是将模块的依赖关系图转化为最终的静态资源。Webpack的编译流程是一个非常复杂的过程&#xff0c;本文将从四个方面详细介绍Webpack的编译流程&#xff0c;分别是入口点分…...

【ZOJ 1151】Word Reversal 题解(字符串+模拟)

问题描述 对于每个单词列表&#xff0c;在不改变单词顺序的情况下&#xff0c;将每个单词反转输出一行。 此问题包含多个测试用例&#xff01; 多重输入的第一行是整数N&#xff0c;然后是空行&#xff0c;后面跟着N个输入块。每个输入块 采用问题描述中所示的格式。输入块之间…...

Dart语言操作符?和!的用法

一.基本使用 1. ? 操作符跟在类型后面&#xff0c;表示当前变量可为null。 int a null; //这句代码在有空安全时&#xff0c;编译会提示错误如果想给一个变量赋值null要如何处理呢&#xff1f;只需要在类型 后面添加操作符&#xff1f;即可&#xff0c;eg: int? a null…...

聚类 kmeans | 机器学习

聚类 刘建平 1、算法原理&#xff1a; 是一种无监督学习算法&#xff0c;其主要目的是将数据点分为k个簇&#xff0c;距离近的样本具有更高的相似度&#xff0c;距离近的划分为一个簇&#xff0c;一共划分k个簇&#xff0c;**让簇内距离小&#xff0c;簇间距离大。**距离是样…...

求职咨询Job Information

前言 加油 原文 求职咨询常用会话 ❶ I want to apply for a job which enables me to use my major. 我想要申请一个能用到我的专业知识的职业。 ❷ I have the capability of operating the computer. 我有操作电脑的能力。 ❸ My dream is to be an excellent interpret…...

怎么去除pdf文件的水印?好用软件说明

怎么去除pdf文件的水印&#xff1f;在某些情况下&#xff0c;PDF 文件的水印可能会影响文件的可读性和美观度。为了解决这个问题&#xff0c;您可以考虑使用其他方法来标记文档&#xff0c;例如添加页眉或页脚。另一种选择是使用透明度更低的水印&#xff0c;这样它就不会太过分…...

1-ELK+ Elasticsearch+head+kibana、企业内部日志分析系统

ELK:日志收集平台 ELK由ElasticSearch、Logstash和Kibana三个开源工具组成&#xff1a; 概念图 组件介绍 1、Elasticsearch&#xff1a; ElasticSearch是一个基于Lucene的开源分布式搜索服务。只搜索和分析日志 特点&#xff1a;分布式&#xff0c;零配置&#xff0c;自…...

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…...

商品推荐Promoting Products

目录 前言原文内容:推荐常用会话商品推荐常用会话商品推荐常用会话前言 加油 原文内容: ❶ I promise that our product is superior. 我承诺我们的产品比别的家的好。 ❷ Our product is very attractive to young people. 我们的产品很吸引年轻人。 ❸ I want to buy th…...

整懵了,蚂蚁金服4面成功拿下测开offer,涨薪6k,突然觉得跳槽也不是那么难

蚂蚁的面试挺独特的&#xff0c;每轮面试都没有HR约时间&#xff0c;一般是晚上8点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其他时间。 全程4面&#xff0c;前四面技术面&#xff0c;电话面试&#xff0c;最后一面是HR面…...

《扬帆优配》个人养老金投资最新成绩出炉 七成养老FOF跑输基准

自去年底落地以来&#xff0c;个人养老金制度运转已有4个多月。运转以来&#xff0c;设置Y比例的个人养老FOF&#xff08;基金中的基金&#xff09;、个人养老金理财、个人养老储蓄、个人养老金稳妥四大产品继续扩容&#xff0c;形成了个人养老金初期的业态样貌。并且历经一季度…...

用Qt编写STM32烧录软件(ISP模式)代码

1.前言 之前写了一篇【用Qt编写STM32烧录软件&#xff08;ISP模式&#xff09;】&#xff0c;但是在文中没有具体的实现代码。 现在补上&#xff0c;各位有兴趣的同学可以参考以下。但是代码里面还有很多没有完善的&#xff0c;必定会存在一些bug&#xff0c;目前只是堪堪能用…...

Excel技能之美观排版

一个普通的Excel文件&#xff0c;想要变得好看&#xff0c;除了要掌握相关技能&#xff0c;还要用心。 美观排版&#xff0c;离不开的技能有字体、字体大小、字体颜色、背景色&#xff0c;等等。了解不同的效果用在什么样的场景&#xff0c;才能得心应手&#xff0c;融会贯通&…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...