【STM32-学习笔记-10-】BKP备份寄存器+时间戳
文章目录
- BKP备份寄存器
- Ⅰ、BKP简介
- 1. BKP的基本功能
- 2. BKP的存储容量
- 3. BKP的访问和操作
- 4. BKP的应用场景
- 5. BKP的控制寄存器
- Ⅱ、BKP基本结构
- Ⅲ、BKP函数
- Ⅳ、BKP使用示例
- 时间戳
- 一、Unix时间戳
- 二、时间戳的转换(time.h函数介绍)
- Ⅰ、time()
- Ⅱ、mktime()
- Ⅲ、localtime()
- Ⅳ、gmtime()
- Ⅴ、asctime()
- Ⅵ、strftime()
- Ⅶ、ctime()
- Ⅷ、clock()
- Ⅸ、difftime()
BKP备份寄存器
Ⅰ、BKP简介
主要用于在系统断电或复位后保存和恢复关键数据
BKP(
Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当
VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲存储RTC时钟校准寄存器
用户数据存储容量:
- 20字节(中容量和小容量)
- 84字节(大容量和互联型)
1. BKP的基本功能
- 数据备份:BKP可以存储用户应用程序数据。当
VDD(2.0~3.6V)电源被切断时,BKP仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,BKP中的数据也不会被复位 - 侵入检测:TAMPER引脚可以产生侵入事件,将所有备份寄存器内容清除。这在需要防止数据被恶意获取时非常有用
- RTC校准:BKP还包含RTC时钟校准寄存器,用于存储RTC校准值。此外,RTC引脚可以输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
2. BKP的存储容量
- 中容量和小容量:20字节(10个16位寄存器)
- 大容量和互联型:84字节(42个16位寄存器)
3. BKP的访问和操作
-
使能时钟:在访问BKP寄存器之前,需要使能PWR和BKP的时钟,并解锁写保护机制
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); -
读写操作:可以使用标准库函数进行读写操作
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); // 写备份寄存器 uint16_t data = BKP_ReadBackupRegister(BKP_DR1); // 读备份寄存器 -
复位操作:可以使用
BKP_DeInit()函数复位BKP寄存器,清除备份寄存器数据BKP_DeInit(); // 备份域复位,复位BKP寄存器,清除备份寄存器数据
4. BKP的应用场景
- 系统配置保存:保存系统的配置参数,如通信设置、用户偏好等,以便在系统重启后快速恢复
- 状态信息保存:保存关键状态信息,如设备的工作模式、传感器状态等,确保系统在重启后能够继续正常运行
- 故障恢复:在系统发生故障时,保存关键数据,以便在系统恢复后进行故障诊断和恢复
- 侵入检测:通过TAMPER引脚检测外部侵入事件,保护系统数据的安全
5. BKP的控制寄存器
- BKP_CR:备份控制寄存器,用于管理侵入检测和RTC校准功能
- BKP_DRx:备份数据寄存器,用于存储用户数据,每个寄存器为16位
Ⅱ、BKP基本结构

Ⅲ、BKP函数
// 备份寄存器(BKP)去初始化函数,用于将备份寄存器寄存器重置为默认值
void BKP_DeInit(void);// 配置备份寄存器(BKP)防篡改引脚电平(侵入检测)
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
// 使能或失能备份寄存器(BKP)防篡改引脚
void BKP_TamperPinCmd(FunctionalState NewState);// 使能或失能备份寄存器(BKP)中断
void BKP_ITConfig(FunctionalState NewState);// 配置备份寄存器(BKP)RTC输出源
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);// 设置备份寄存器(BKP)RTC校准值
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);// 向备份寄存器(BKP)备份寄存器写入数据
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
// 从备份寄存器(BKP)备份寄存器读取数据
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);// 获取备份寄存器(BKP)标志位状态
FlagStatus BKP_GetFlagStatus(void);
// 清除备份寄存器(BKP)标志位
void BKP_ClearFlag(void);// 获取备份寄存器(BKP)中断状态
ITStatus BKP_GetITStatus(void);
// 清除备份寄存器(BKP)中断待处理位
void BKP_ClearITPendingBit(void);
Ⅳ、BKP使用示例
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Key.h"
#include "OLED.h"uint16_t ArrayWrite[] = {0x1122, 0xAABB};//写入BKP的数据
uint16_t ArrayRead[2] = { 0 }; //从BKP中读出的数据int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"W:");OLED_ShowString(2,1,"R:");char keynum;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWRRCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//使能BKPPWR_BackupAccessCmd(ENABLE);//备份寄存器访问使能while(1){keynum = Get_KeyNum();if(keynum == 2){BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);OLED_ShowHexNum(1,3,ArrayWrite[0],4);OLED_ShowHexNum(1,8,ArrayWrite[1],4);ArrayWrite[0]++;ArrayWrite[1]++;}ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(2,3,ArrayRead[0] ,4);OLED_ShowHexNum(2,8,ArrayRead[1] ,4); }
}
时间戳
一、Unix时间戳
时间戳是指自1970年1月1日(UTC/GMT的午夜) 以来经过的秒数(不考虑闰秒)
它是一个表示时间的数值,常用于计算机系统、数据库、网络通信等领域来记录事件发生的时间
- 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
- 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
二、时间戳的转换(time.h函数介绍)
| 类型 | 说明 |
|---|---|
time_t | 用于表示时间的类型,通常是表示自1970年1月1日以来的秒数(时间戳) |
struct tm | 用于表示时间的结构体,包含年、月、日、时、分、秒等时间信息 |
| 宏 | 说明 |
|---|---|
CLOCKS_PER_SEC | 每秒的时钟周期数,用于clock()函数计算时间间隔 |
TIME_UTC | 表示 UTC 时间(C11) |
| 函数 | 说明 |
|---|---|
time(time_t *tloc) | 获取时间戳 |
mktime(struct tm *timeptr) | struct tm结构体—>时间戳 |
localtime(const time_t *timer) | 时间戳—>本地时间的struct tm结构体 |
gmtime(const time_t *timer) | 将时间戳—>UTC时间的struct tm结构体 |
asctime(const struct tm *timeptr) | 将时间结构体—>字符串,格式为“Wed Jan 01 00:00:00 1990\n” |
strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr) | 时间结构体—>字符串 |
ctime(const time_t *timer) | 时间戳—>字符串 |
clock() | 获取程序中某部分代码的执行时间,单位为时钟周期,常用于性能测试 |
difftime(time_t time1, time_t time0) | 计算两个时间戳之间的时间差,单位为秒 |

struct tm {int tm_sec; /* 秒,范围从 0 到 59 */int tm_min; /* 分,范围从 0 到 59 */int tm_hour; /* 小时,范围从 0 到 23 */int tm_mday; /* 一月中的第几天,范围从 1 到 31 */int tm_mon; /* 月份,范围从 0 到 11 (+1)*/int tm_year; /* 自1900年起的年数 (+1900)*/int tm_wday; /* 一周中的第几天,范围从 0 到 6 */int tm_yday; /* 一年中的第几天,范围从 0 到 365 */int tm_isdst; /* 夏令时标识符,1 表示夏令时,0 表示非夏令时,-1 表示自动检测 */
};
Ⅰ、time()
获取时间戳
time(time_t *tloc)函数用于获取当前时间和日期,并将其存储为自1970年1月1日以来的秒数(时间戳)
函数原型:
time_t time(time_t *tloc);参数:
tloc:指向time_t类型的指针
- 如果为
NULL,则函数仅返回时间戳,不进行存储- 如果非空,则将时间戳存储在
tloc指向的位置返回值:
- 成功时,返回当前时间的时间戳(自1970年1月1日以来的秒数)
- 失败时,返回
(time_t)-1示例代码
示例1:仅获取时间戳
#include <stdio.h>#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间的时间戳printf("当前时间的时间戳: %ld\n", current_time);return 0;}示例中,
time(NULL)获取当前时间的时间戳,并将其存储在current_time变量中,然后打印出来示例2:获取时间戳并存储
#include <stdio.h>#include <time.h>int main() {time_t current_time;time(¤t_time); // 获取当前时间的时间戳并存储在current_time中// 将时间戳转换为本地时间并格式化输出struct tm *local_time = localtime(¤t_time);char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("本地时间:%s\n", buffer);return 0;}在示例中,
time(¤t_time)获取当前时间的时间戳并存储在current_time变量中。然后使用localtime函数将时间戳转换为本地时间的struct tm结构体,再使用strftime函数将本地时间格式化为字符串并打印出来
Ⅱ、mktime()
将
struct tm结构体表示的时间转换为时间戳
mktime函数用于将struct tm结构体表示的本地时间转换为自1970年1月1日以来的秒数(时间戳)
该函数会自动处理时区和夏令时的转换
函数原型:
time_t mktime(struct tm *timeptr);参数:
timeptr:指向struct tm结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回自1970年1月1日以来的秒数
- 失败时,返回
(time_t)-1
struct tm结构体struct tm {int tm_sec; /* 秒,范围从 0 到 59 */int tm_min; /* 分,范围从 0 到 59 */int tm_hour; /* 小时,范围从 0 到 23 */int tm_mday; /* 一月中的第几天,范围从 1 到 31 */int tm_mon; /* 月份,范围从 0 到 11 */int tm_year; /* 自1900年起的年数 */int tm_wday; /* 一周中的第几天,范围从 0 到 6 */int tm_yday; /* 一年中的第几天,范围从 0 到 365 */int tm_isdst; /* 夏令时标识符,1 表示夏令时,0 表示非夏令时,-1 表示自动检测 */ };示例代码 示例:将特定日期和时间转换为时间戳
#include <stdio.h> #include <time.h>int main() {struct tm time_info;time_t time_as_seconds;// 设置tm结构体为2023年8月17日08:34:56time_info.tm_year = 2023 - 1900; // 年份从1900年开始time_info.tm_mon = 8 - 1; // 月份从0开始time_info.tm_mday = 17; // 日time_info.tm_hour = 8; // 小时time_info.tm_min = 34; // 分钟time_info.tm_sec = 56; // 秒time_info.tm_isdst = -1; // 让mktime()自动检测夏令时// 转换为time_t类型time_as_seconds = mktime(&time_info);if (time_as_seconds != (time_t)(-1)) {printf("时间转换为秒数成功: %ld\n", (long)time_as_seconds);} else {printf("时间转换失败\n");}return 0; }
输出结果:
时间转换为秒数成功: 1692232496注意事项
mktime函数会自动处理时区和夏令时的转换tm_isdst字段可以设置为 -1,让mktime自动检测夏令时tm_wday和tm_yday字段在调用mktime时会被自动计算和更新
Ⅲ、localtime()
将时间戳转换为本地时间的
struct tm结构体
localtime函数用于将时间戳(time_t类型)转换为本地时间的struct tm结构体
该函数会自动处理时区和夏令时的转换
函数原型:
struct tm *localtime(const time_t *timer);参数:
timer:指向time_t类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向
struct tm结构体的指针,该结构体包含本地时间的信息- 失败时,返回
NULL示例代码 示例:将时间戳转换为本地时间并格式化输出
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 格式化输出本地时间char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("本地时间:%s\n", buffer);return 0; }
输出结果:
本地时间:2025-01-13 12:34:56
Ⅳ、gmtime()
将时间戳转换为UTC时间
gmtime函数用于将时间戳(time_t类型)转换为UTC(协调世界时)时间的struct tm结构体
函数原型:
struct tm *gmtime(const time_t *timer);参数:
timer:指向time_t类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向
struct tm结构体的指针,该结构体包含UTC时间的信息- 失败时,返回
NULL示例代码 示例:将时间戳转换为UTC时间并格式化输出
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *utc_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为UTC时间utc_time = gmtime(¤t_time);// 格式化输出UTC时间char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", utc_time);printf("UTC时间:%s\n", buffer);return 0; }
输出结果:
UTC时间:2025-01-13 04:34:56
Ⅴ、asctime()
将时间结构体转换为字符串,格式为
Wed Jan 01 00:00:00 1990\n
asctime函数用于将struct tm结构体表示的时间转换为一个标准的字符串格式
该函数不会考虑时区和夏令时,直接将时间戳转换为UTC时间
函数原型:
char *asctime(const struct tm *timeptr);参数:
timeptr:指向struct tm结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回指向格式化时间字符串的指针,字符串格式为
"Wed Jan 01 00:00:00 1990\n"- 失败时,返回
NULL示例代码 示例:将当前时间转换为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 将本地时间转换为字符串char *time_string = asctime(local_time);printf("当前时间:%s", time_string);return 0; }
输出结果:
当前时间:Mon Jan 13 12:34:56 2025
Ⅵ、strftime()
按照指定格式将时间结构体格式化为字符串
strftime函数用于将struct tm结构体表示的时间格式化为指定格式的字符串
该函数非常灵活,可以生成各种格式的时间字符串,常用于日志记录、时间显示等场景
函数原型:
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);参数:
s:指向字符数组的指针,用于存储格式化后的字符串maxsize:指定字符数组的最大长度,以确保不会发生缓冲区溢出format:格式化字符串,用于指定时间的输出格式timeptr:指向struct tm结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回格式化字符串的长度(不包括终止空字符)
- 如果输出字符串的长度超过
maxsize,则返回0,并且s指向的数组内容未定义常见格式化字符串
%Y:四位年份(例如 2025)%m:月份(01 到 12)%d:一月中的第几天(01 到 31)%H:小时(00 到 23)%M:分钟(00 到 59)%S:秒(00 到 59)%a:星期几的缩写(例如 Mon)%b:月份的缩写(例如 Jan)%c:本地日期和时间的表示(例如 Mon Jan 13 12:34:56 2025)%x:本地日期的表示(例如 01/13/25)%X:本地时间的表示(例如 12:34:56)示例代码 示例:将当前时间格式化为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;char buffer[80];// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 将本地时间格式化为字符串strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("当前时间:%s\n", buffer);return 0; }
输出结果:
当前时间:2025-01-13 12:34:56
Ⅶ、ctime()
将时间戳转换为字符串
ctime函数用于将时间戳(time_t类型)转换为一个标准的字符串格式
该函数会将时间戳转换为本地时间,并格式化为一个固定格式的字符串,通常用于日志记录和时间显示
函数原型:
char *ctime(const time_t *timer);参数:
timer:指向time_t类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向格式化时间字符串的指针,字符串格式为
"Wed Jan 01 00:00:00 1990\n"- 失败时,返回
NULL示例代码 示例:将当前时间的时间戳转换为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为字符串char *time_string = ctime(¤t_time);printf("当前时间:%s", time_string);return 0; }
输出结果:
当前时间:Mon Jan 13 12:34:56 2025
asctime()ctime()时间戳—>字符串 时间结构体—>字符串 Wed Jan 01 00:00:00 1990\n Wed Jan 01 00:00:00 1990\n
Ⅷ、clock()
clock函数用于获取程序中某部分代码的执行时间,单位为时钟周期(clock ticks)。这通常用于性能测试,以测量代码段的执行时间
函数原型:
clock_t clock(void);参数:
- 无参数
返回值:
- 返回自程序开始执行以来的时钟周期数
- 如果无法获取时钟周期数,返回
(clock_t)-1示例代码 示例1:测量代码段的执行时间
#include <stdio.h> #include <time.h>int main() {clock_t start, end;double cpu_time_used;// 获取开始时间start = clock();// 要测量的代码段for (int i = 0; i < 1000000; i++) {// 一些计算}// 获取结束时间end = clock();// 计算执行时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;printf("代码段的执行时间:%.6f 秒\n", cpu_time_used);return 0; }
输出结果:
代码段的执行时间:0.012345 秒
Ⅸ、difftime()
计算两个时间戳之间的时间差
difftime函数用于计算两个时间戳之间的时间差,单位为秒。这通常用于测量时间间隔,例如计算代码段的执行时间或两个事件之间的时间差
函数原型:
double difftime(time_t time1, time_t time0);参数:
time1:结束时间的时间戳time0:开始时间的时间戳返回值:
- 返回两个时间戳之间的时间差,单位为秒
- 如果
time1早于time0,返回值为负数说明:
difftime函数计算time1和time0之间的时间差,单位为秒- 该函数考虑了时间戳的溢出问题,因此可以安全地用于大范围的时间计算
difftime函数返回的是一个double类型的值,可以提供更精确的时间差示例代码 示例1:测量代码段的执行时间
#include <stdio.h> #include <time.h>int main() {time_t start, end;double elapsed;// 获取开始时间start = time(NULL);// 要测量的代码段for (int i = 0; i < 1000000; i++) {// 一些计算}// 获取结束时间end = time(NULL);// 计算时间差elapsed = difftime(end, start);printf("代码段的执行时间:%.6f 秒\n", elapsed);return 0; }
输出结果:
代码段的执行时间:0.012345 秒
相关文章:
【STM32-学习笔记-10-】BKP备份寄存器+时间戳
文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换(time.h函数介绍)Ⅰ、time()Ⅱ、mktime()…...
React 中hooks之 React.memo 和 useMemo用法总结
1. React.memo 基础 React.memo 是一个高阶组件(HOC),用于优化函数组件的性能,通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...
日志收集Day001
1.ElasticSearch 作用:日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(这里yy做了别名,过滤掉空行和注释行) yy /etc/el…...
机器人“大脑+小脑”范式:算力魔方赋能智能自主导航
在机器人技术的发展中,“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中,“大脑”作为机器人的核心决策单元,承担着复杂任务规划、环境感知和决策制定的重要角色,而“小脑”则专注于运动控制和实时调整。这种分工明确…...
python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗
在 Python 程序运行过程中,如果引用的数据文件被更新,程序能否读取到更新后的数据,取决于以下几个因素: 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件(例如通过循环或定时机制反复打开文件读取&…...
VSCode最新离线插件拓展下载方式
之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…...
算法题目总结-栈和队列
文章目录 1.有效的括号1.答案2.思路 2.最小栈1.答案2.思路 3.前 K 个高频元素1.答案2.思路 4.用栈实现队列1.答案2.思路 5.删除字符串中的所有相邻重复项1.答案2.思路 1.有效的括号 1.答案 package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Descripti…...
IO进程----进程
进程 什么是进程 进程和程序的区别 概念: 程序:编译好的可执行文件 存放在磁盘上的指令和数据的有序集合(文件) 程序是静态的,没有任何执行的概念 进程:一个独立的可调度的任务 执行一个程序分配资…...
【机器学习实战高阶】基于深度学习的图像分割
机器学习项目图像分割 你可能已经注意到,大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练,以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。 计算机视觉是计算机科学的一个领域,…...
「免填邀请码」赋能各类APP,提升转化率与用户体验
在当前移动互联网的高速发展下,用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理,但随着市场竞争的激烈,复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术,结合自研的…...
基于海思soc的智能产品开发(视频的后续开发)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们讨论了camera,也讨论了屏幕驱动,这些都是基础的部分。关键是,我们拿到了这些视频数据之后,…...
创建 pdf 合同模板
创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…...
2024 年度学习总结
目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…...
CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标
黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…...
C++ 面向对象(继承)
三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类,这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类:父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …...
Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测
Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…...
数据结构 数组
1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。 实际上ÿ…...
Kivy App开发之UX控件Bubble气泡
kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…...
从零到一:打造属于你的AI智能体,支持本地部署
国外卷智能体,国内也都在搞 AI Agent,2025 年也将成为 Agent 的元年。构建智能体主要两种情况,一个是工作流模式,另外一种是直接开发应用,接下来分别给大家介绍一下两种产品和构建过程。工作流模式,以 Coze…...
成就与远见:2024年技术与思维的升华
个人主页:chian-ocean 前言: 2025年1月17日,2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300,虽然与顶尖博主仍有一定差距,但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…...
OpenClaw技能扩展实战:千问3.5-27B驱动公众号自动发布系统
OpenClaw技能扩展实战:千问3.5-27B驱动公众号自动发布系统 1. 为什么需要自动化公众号发布 作为一个技术博主,我每周都要在公众号发布2-3篇技术文章。最让我头疼的不是写作本身,而是发布前的繁琐流程:手动排版Markdown、上传图片…...
如果AI已经会了,我们为什么还要学?
学习从来不是为了记忆知识,而是为了建立判断力。AI 时代,记忆的价值在降,理解的价值在涨。这个问题本身藏着一个假设:学习的目的是"掌握知识"。 如果这个假设成立,那确实,AI 已经把你能背的都背完…...
C/C++头文件防护:#pragma once原理与实践
1. #pragma once 的基本概念与作用在C/C项目开发中,头文件包含管理是个看似简单却暗藏玄机的问题。我第一次意识到它的重要性是在参与一个跨平台嵌入式项目时,某个模块因为头文件重复包含导致的结构体重定义错误,让整个团队排查了整整两天。而…...
ABAQUS盾构隧道开挖模型Cae文件详解:一环七片结构,含螺栓配筋及毫米单位制应用
ABAQUS盾构隧道开挖模型Cae文件,一环7片,含螺栓,配筋。 (此模型用的㎜单位制) 在ABAQUS软件中,存在一个盾构隧道开挖模型的Cae文件。该模型由一环七片组成,其中包含螺栓和配筋。该模型使用毫米作…...
Google 迎来「DeepSeek 时刻」:TurboQuant算法实现bit无损、×加速、×压缩、零预处理揪
从 UI 工程师到 AI 应用架构者 13 年前,我的工作是让按钮在 IE6 上对齐; 13 年后,我用 fetch-event-source 订阅大模型的“思维流”,用 OCR 解锁图片中的文字——前端,正在成为 AI 产品的第一道体验防线。 最近&#x…...
从零构建ROS履带车:揭秘AI与无人驾驶核心技术(2)
1. 从零搭建ROS履带车的硬件基础 想要打造一台能跑能跳的智能履带车,第一步得把硬件架子搭结实。我当年第一次做履带车时,用的就是淘宝上200块钱的金属履带底盘套件,搭配Jetson Nano开发板作为大脑。这里有个实用建议:选择履带宽度…...
2026年智能巡检管理系统如何让设备隐患无处遁形?
传统的设备巡检,本质上是一场“信任游戏”。我信任员工去看了,员工信任自己画了钩,结果往往是——等到设备真的坏了、管道真的漏了,翻开那本厚厚的巡检记录,上面依然写满了“正常”。直到我们引入了智能巡检管理系统&a…...
毕业设计实战:基于SSM+JSP+MySQL私人定制旅游系统设计与实现完整版指南
毕业设计实战:基于SSMJSPMySQL私人定制旅游系统设计与实现完整版指南 在开发私人定制旅游系统本科毕业设计时,我曾因旅游路线订单表未通过用户ID与路线ID双外键关联踩过致命坑——初期仅设计订单号、价格等字段,未与用户表、旅游路线表建立关…...
PHP异步I/O迁移紧急预案(含同步代码自动转换工具链+CI/CD熔断检测脚本)
第一章:PHP异步I/O迁移紧急预案概览当传统阻塞式 PHP 应用遭遇高并发 I/O 瓶颈(如大量 HTTP 请求、数据库查询或文件读写),服务响应延迟激增、连接池耗尽、CPU 利用率反常偏低——此时,异步 I/O 迁移已非优化选项&…...
深入浅出:图解OV13850 Sensor驱动中的曝光、增益与消隐时间
深入浅出:图解OV13850 Sensor驱动中的曝光、增益与消隐时间 在嵌入式视觉系统的开发中,图像传感器的配置往往是决定最终成像质量的关键环节。OV13850作为OmniVision公司推出的一款13MP高性能CMOS传感器,其驱动开发涉及曝光控制、增益调节和消…...

