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

stm32之BKP备份寄存器和RTC时钟

目录

  • 1.时间戳
    • 1.1 Unix时间戳
    • 1.2 UTC/GMT
    • 1.3 时间戳转换
      • **1.** `time_t time(time_t*)`
      • **2.** `struct tm* gmtime(const time_t*)`
      • **3.** `struct tm* localtime(const time_t*)`
      • **4.** `time_t mktime(struct tm*)`
      • **5.** `char* ctime(const time_t*)`
      • **6.** `char* asctime(const struct tm*)`
      • **7.** `size_t strftime(char*, size_t, const char*, const struct tm*)`
  • 2.BKP
    • 2.1 简介
        • **寄存器资源**
        • **PC13 引脚功能**
    • 2.2 基本结构
  • 3.RTC时钟
    • 3.1 简介
      • **3.1.1 RTC 的主要特性**
      • **3.1.2 访问 RTC 的流程**
      • **3.1.3 RTC 的典型应用**
      • **3.1.4 RTC 的优势**
    • 3.2 框图(详细结构)
    • 3.3 RTC 的基本结构
    • 3.4 硬件电路
    • 3.5 使用注意事项
      • **3.5.1 使能对 BKP 和 RTC 的访问**
      • **3.5.2 同步寄存器(RSF)状态**
      • **3.5.3 进入 RTC 配置模式**
      • **3.5.4 写操作完成前必须等待**
      • **3.5.5 概括**
        • **关键操作流程**
        • **可能的错误操作**
        • **优化建议**
  • 4.实验
  • 5.扩展

img

1.时间戳

1.1 Unix时间戳

Unix 时间戳定义为从 UTC 时间的 1970 年 1 月 1 日 0 点 0 分 0 秒(称为 Unix 纪元时间,Epoch Time)开始,所经过的总秒数,不考虑闰秒的影响。

时间戳是通过一个整数型变量存储的,常见的位宽是 32 位 或 64 位:

  • 32 位整数:能够记录约 136 年(正负 68 年)。
  • 64 位整数:可记录的时间范围非常宽,基本可以覆盖所有时间需求。

秒计数器记录的是 UTC 时间,与不同的时区无关。

全世界所有地区的秒计数器值相同,但通过添加偏移量(时区)可以换算成当地时间。

  • UTC 的 1970 年 1 月 1 日 0:0:0 对应秒计数器为 0。
  • 北京时间(UTC+8)的 1970 年 1 月 1 日 8:0:0 对应的秒计数器值仍为 0。

img

  • 计数器值为 0 时:

    • UTC 时间:1970-1-1 0:0:0
    • 北京时间:1970-1-1 8:0:0
  • 秒计数器值为 10,000,000,000

    • UTC 时间:2001-9-9 1:46:40
    • 北京时间:2001-9-9 9:46:40
  • 秒计数器值为 1,672,588,795

    • UTC 时间:2023-1-1 15:59:55
    • 北京时间:2023-1-1 23:59:55

1.2 UTC/GMT

  1. GMT(Greenwich Mean Time,格林尼治标准时间)
    • GMT 是一种基于地球自转的时间计量系统。
    • 地球每自转一周被划分为 24 小时,时间间隔是均匀的,用来作为时间标准。
    • GMT 主要用于历史上的时间定义,现代已经逐渐被更精准的 UTC 替代。
  1. UTC(Universal Time Coordinated,协调世界时)
    • UTC 是一种基于原子钟的时间计量系统,是目前全球通用的时间标准。
    • UTC 的定义:
      • 1 秒被精确定义为:铯 133 原子基态的两个超精细能级间在零磁场下辐射 9,192,631,770 周持续的时间。
    • UTC 的调整机制:
      • 地球自转的时间并非完全均匀,地球自转一天的时间与 UTC 之间的差异可能会超过 0.9 秒。
      • 为了保持协调一致,UTC 会通过闰秒来调整时间,使其与地球自转周期保持同步。
  1. 两者的区别
    • GMT 基于地球自转,时间间隔固定,但相对不够精确。
    • UTC 基于原子钟,精准度更高,可以通过调整闰秒与地球自转周期保持一致。

1.3 时间戳转换

语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换

函数作用
time_t time(time_t*);获取系统时钟
struct tm* gmtime(const time_t*);秒计数器转换为日期时间(格林尼治时间)
struct tm* localtime(const time_t*);秒计数器转换为日期时间(当地时间)
time_t mktime(struct tm*);日期时间转换为秒计数器(当地时间)
char* ctime(const time_t*);秒计数器转换为字符串(默认格式)
char* asctime(const struct tm*);日期时间转换为字符串(默认格式)
size_t strftime(char*, size_t, const char*, const struct tm*);日期时间转换为字符串(自定义格式)

img

1. time_t time(time_t*)

获取系统当前时间的秒计数器值(Unix 时间戳)。

#include <stdio.h>
#include <time.h>int main() {time_t current_time;current_time = time(NULL); // 获取当前时间戳printf("当前时间的时间戳是:%ld\n", current_time);return 0;
}

输出示例:

当前时间的时间戳是:1672588795

2. struct tm* gmtime(const time_t*)

将秒计数器转换为 UTC 格式的日期时间。

#include <stdio.h>
#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间戳struct tm *utc_time = gmtime(&current_time); // 转换为 UTC 时间printf("UTC 时间是:%d-%02d-%02d %02d:%02d:%02d\n",utc_time->tm_year + 1900, // 年从 1900 开始utc_time->tm_mon + 1,     // 月从 0 开始utc_time->tm_mday,utc_time->tm_hour,utc_time->tm_min,utc_time->tm_sec);return 0;
}

输出示例:

UTC 时间是:2023-01-01 16:59:55

3. struct tm* localtime(const time_t*)

将秒计数器转换为本地时间(根据时区调整)。

#include <stdio.h>
#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间戳struct tm *local_time = localtime(&current_time); // 转换为本地时间printf("本地时间是:%d-%02d-%02d %02d:%02d:%02d\n",local_time->tm_year + 1900,local_time->tm_mon + 1,local_time->tm_mday,local_time->tm_hour,local_time->tm_min,local_time->tm_sec);return 0;
}

输出示例:

本地时间是:2023-01-01 23:59:55

4. time_t mktime(struct tm*)

将本地时间结构转换为秒计数器。

#include <stdio.h>
#include <time.h>int main() {struct tm time_info = {0};// 设置一个本地时间:2023-01-01 12:00:00time_info.tm_year = 2023 - 1900; // 年份从 1900 开始time_info.tm_mon = 0;            // 月份从 0 开始time_info.tm_mday = 1;time_info.tm_hour = 12;time_info.tm_min = 0;time_info.tm_sec = 0;time_t timestamp = mktime(&time_info); // 转换为时间戳printf("2023-01-01 12:00:00 的时间戳是:%ld\n", timestamp);return 0;
}

输出示例:

2023-01-01 12:00:00 的时间戳是:1672545600

5. char* ctime(const time_t*)

将时间戳转换为默认格式的字符串(含换行符)。

#include <stdio.h>
#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间戳char *time_string = ctime(&current_time); // 转换为字符串printf("当前时间是:%s", time_string); // 输出字符串(带换行符)return 0;
}

输出示例:

当前时间是:Sun Jan  1 23:59:55 2023

6. char* asctime(const struct tm*)

将日期时间结构转换为默认格式的字符串(含换行符)。

#include <stdio.h>
#include <time.h>int main() {struct tm time_info = {0};// 设置一个时间结构time_info.tm_year = 2023 - 1900;time_info.tm_mon = 0;time_info.tm_mday = 1;time_info.tm_hour = 12;time_info.tm_min = 0;time_info.tm_sec = 0;char *time_string = asctime(&time_info); // 转换为字符串printf("时间是:%s", time_string); // 输出字符串(带换行符)return 0;
}

输出示例:

时间是:Sun Jan  1 12:00:00 2023

7. size_t strftime(char*, size_t, const char*, const struct tm*)

将日期时间结构转换为自定义格式的字符串。

#include <stdio.h>
#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间戳struct tm *local_time = localtime(&current_time); // 转换为本地时间char buffer[100];// 自定义格式化:年-月-日 小时:分钟:秒strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("当前本地时间是:%s\n", buffer);return 0;
}

输出示例:

当前本地时间是:2023-01-01 23:59:55

2.BKP

2.1 简介

BKP 的基本功能:

  1. 存储用户数据
    • BKP 提供了一组独立的寄存器,能够存储应用程序的重要数据,例如系统状态、传感器校准参数等。
    • 在大容量和互联型产品中,BKP 提供了 42 个 16 位寄存器,可存储 84 字节数据
    • 在中容量和小容量产品中,BKP 仅提供 20 字节数据寄存器
  1. 掉电保护
    • BKP 工作在备份域(Backup Domain)中,由 VBAT 供电。
    • 即使主电源 VDD 被切断,BKP 寄存器的数据仍然不会丢失。
    • 这种特性非常适合存储掉电后仍需保存的数据,例如:
      • 实时时钟(RTC)配置。
      • 防篡改事件标志。
      • 系统重要的用户数据。
  1. 复位保护
    • 当系统处于待机模式被唤醒时,或者发生 系统复位电源复位 时,备份寄存器的数据仍然保持不变。
    • 只有特定的备份域复位操作(通过设置 RCC_BDCR 寄存器的 BDRST 位)才能清除 BKP 数据。

BKP 控制寄存器:

备份寄存器的控制寄存器(BKP_CR)用于管理以下功能:

  1. 防篡改检测
    • BKP 控制寄存器支持 防篡改检测(Tamper Detection) 功能。
    • 当检测到未授权的访问或数据篡改时,可以触发中断以通知系统。
    • 具体防篡改功能包括:
      • 数据被篡改时产生中断。
      • 清除备份寄存器数据。
  1. RTC 校准功能
    • BKP 控制寄存器可以配合 RTC 校准功能使用。
    • 用于存储 RTC 校验值、调节 RTC 校准值,并提供时钟输出到 PC13 引脚。
  1. 支持多种输出功能
    • BKP 控制寄存器能够控制在 PC13 引脚上输出不同信号:
      • RTC 校准时钟。
      • RTC 闹钟脉冲。
      • RTC 秒脉冲。

如何访问 BKP 寄存器:

默认情况下,备份域和备份寄存器被保护,无法直接访问。以下是访问流程:

  1. 使能时钟
    • 设置 RCC_APB1ENR 寄存器的 PWREN 位BKPEN 位,打开电源和后备接口的时钟。
  1. 解除写保护
    • 设置电源控制寄存器(PWR_CR)的 DBP 位(Disable Backup Domain Write Protection)。
    • 只有在该位被置位后,才能对备份寄存器和 RTC 进行写操作。
  1. 备份域复位(可选):
    • 如果需要清空备份域的数据(包括 RTC 和 BKP 寄存器),可以设置 RCC_BDCR 寄存器的 BDRST 位

BKP 的应用场景:

BKP 寄存器的主要应用场景如下:

  1. 存储关键数据
    • 可以存储掉电后需要保留的重要数据,例如:
      • RTC 时间。
      • 校准参数。
      • 加密密钥。
      • 系统配置。
  1. 防篡改检测
    • 用于检测是否存在未授权的数据访问或修改。
    • 一旦检测到篡改,可以通过中断通知系统,同时清除备份寄存器中的数据。
  1. RTC 校准
    • 配合 RTC 使用,用于存储 RTC 校验值,并在 PC13 引脚输出校准信号、闹钟脉冲或秒脉冲。
  1. 数据备份
    • 当系统进入低功耗或待机模式时,BKP 是一种可靠的数据存储方案。

BKP 的硬件资源:

寄存器资源

在大容量和互联型产品中,BKP 包括:

  • 42 个 16 位的备份寄存器(BKP_DR1 到 BKP_DR42),每个寄存器可以存储 2 字节,共计 84 字节。
  • BKP 控制寄存器,用于配置防篡改检测和 RTC 校准功能。
PC13 引脚功能

PC13 引脚在 BKP 配置中支持输出以下信号:

  • RTC 校准时钟(RTC_CALIB_CLK)
  • RTC 闹钟脉冲(RTC_ALARM)
  • RTC 秒脉冲(RTC_SECOND)

使用 BKP 的注意事项

  1. 写保护机制
    • 默认情况下,备份域和 BKP 寄存器是受保护的,必须按照正确的流程解锁才能进行写操作。
    • 避免意外写入或修改。
  1. VBAT 电源支持
    • 确保在主电源断电时,VBAT 能够正常供电,以保证 BKP 数据不会丢失。
  1. 防篡改检测的正确配置
    • 如果使用防篡改检测功能,应正确设置中断处理程序,以防止误报或数据丢失。
  1. 低功耗模式的应用
    • 在进入待机或低功耗模式时,可以将重要数据写入 BKP,以便唤醒后能够快速恢复状态。

2.2 基本结构

img

3.RTC时钟

3.1 简介

RTC(Real Time Clock,实时时钟)是一种独立的定时器模块,用于提供时间和日历功能。它包含一个连续计数的计数器,在适当的软件配置下,能够提供精确的时间跟踪和日期维护功能。RTC 模块特别适合需要低功耗、掉电保护的嵌入式应用场景。

RTC 是嵌入式系统(如 STM32 微控制器)中非常重要的功能模块之一,其设计允许在系统复位或待机模式唤醒后保持时间和设置不变。它在后备域(Backup Domain)内工作,利用备用电池(VBAT)维持供电,即使主电源关闭,RTC 的计时功能仍然能正常运行。


3.1.1 RTC 的主要特性

\1. 灵活的计时功能

  • RTC 模块提供一个 32 位的连续计数器,用于测量较长的时间段。
  • 通过软件可以设置和修改计数器的值,以重新定义当前的时间和日期。

\2. 可编程的预分频器

  • RTC 允许配置一个可编程的预分频系数,最高可以分频到 2^20
  • 通过调整分频系数,可以精确地设置 RTC 的时钟频率,以满足不同的时间基准需求。

\3. 独立的时钟源

RTC 模块支持以下三种时钟源,具体选择由硬件设计和应用需求决定:

  1. HSE(High-Speed External)时钟
    • 高速外部振荡器时钟(HSE)可以通过除以 128 的方式作为 RTC 时钟源。
    • 高速时钟一般供内部的应用程序和主要外设使用
  1. LSE(Low-Speed External)振荡器
    • 低速外部振荡器时钟(通常为 32.768 kHz 晶体),提供高稳定性,非常适合 RTC。
    • 低速时钟主要给看门狗和RTC时钟使用
  1. LSI(Low-Speed Internal)振荡器
    • 低速内部振荡器(内部 40 kHz 振荡器),功耗较低,但精度略逊于 LSE。

注意:RTC 的时钟频率必须低于 APB1 接口时钟(PCLK1)的四分之一。

\4. 多种复位类型

RTC 支持两种不同类型的复位:

  1. 系统复位
    • APB1 接口由系统复位控制。
  1. 后备域复位
    • RTC 核心(包括预分频器、闹钟、计数器和分频器)仅受后备域复位的影响。通过设置 RCC_BDCR 寄存器的 BDRST 位,可以复位 RTC 核心。

\5. 多种中断功能

RTC 提供 3 种专门的中断功能,能够实现丰富的时间事件管理:

  1. 闹钟中断
    • RTC 可以配置一个软件可编程的闹钟,触发闹钟中断,常用于定时唤醒或事件提醒。
  1. 秒中断
    • 可产生一个周期性中断信号,周期最长为 1 秒,适合用于定时任务。
  1. 溢出中断
    • 当 RTC 的 32 位计数器溢出(从最大值回滚到 0)时触发,指示计数器循环完成。

\6. 持久性

  • RTC 位于备份域中,由备用电池(VBAT)供电。
  • 即使主电源 VDD 断开,RTC 的计数器和设置仍能正常运行。
  • 系统复位或待机模式唤醒后,RTC 的配置和时间数据保持不变。

img

4-16 MHz HSE OSC:外部的4-16MHz高速石英晶体振荡器,也就是晶振,一般都是接8MHz。

  • 需要先进性128的分频,后续的分频器在进行适当的分频,就可以输出1Hz的频率信号给计数器

LSE OSC 32.768 kHz:外部的 32.768 kHz(215)的低速晶振,一般是给RTC使用的(最常用

LSI RC 40 KHz:内部的40 KHz低速RC晶振,可以提供给RTC,但一般是备用方案,给看门狗提供时钟的情况比较多

3.1.2 访问 RTC 的流程

默认情况下,RTC 和后备寄存器的访问被禁止,这是为了防止意外的写操作对关键数据造成破坏。以下步骤可以解锁 RTC 和后备寄存器的访问权限:

\1. 使能电源和后备接口时钟

通过设置 RCC_APB1ENR 寄存器的以下两位:

  • PWREN 位:使能电源模块。
  • BKPEN 位:使能后备接口时钟。

\2. 解除写保护

设置 PWR_CR 寄存器的 DBP 位(Disable Backup Domain Write Protection)

  • 解除写保护后,可以对 RTC 和后备寄存器进行读写操作。

\3. 配置 RTC 时钟源

在 RCC_BDCR 寄存器中选择 RTC 的时钟源,常见配置为:

  • 设置 RTCSEL 位 选择时钟源(LSE、LSI 或 HSE)。
  • 通过设置 RTCEN 位 启用 RTC。

\4. 后备域复位(可选)

如果需要重置 RTC 的配置,可以通过设置 RCC_BDCR 寄存器的 BDRST 位 触发后备域复位。


3.1.3 RTC 的典型应用

\1. 时间和日历功能

RTC 的主要应用是提供精确的时间和日期跟踪功能。结合 32 位计数器和软件支持,可以实现年、月、日、时、分、秒等信息的完整计算和管理。

\2. 闹钟功能

RTC 支持配置闹钟时间,当达到设定时间时,触发闹钟中断。常用于:

  • 定时唤醒嵌入式系统。
  • 提供定时提醒功能。

\3. 周期性事件管理

RTC 的秒中断功能可以生成周期性信号,适合用于:

  • 定时任务。
  • 数据采集的时间基准。

\4. 超低功耗场景

RTC 模块在主电源关闭或进入待机模式时,依然可以通过备用电池工作,适合需要长时间低功耗运行的应用场景。

\5. 数据采集和日志记录

RTC 提供稳定的时间基准,可以用于时间戳记录和数据采集。


3.1.4 RTC 的优势

  1. 低功耗:RTC 工作在低功耗模式下,可以通过 VBAT 供电,适合掉电保护应用。
  2. 独立性:RTC 独立于主系统,即使 MCU 复位或掉电,时间信息也能保持不变。
  3. 多功能性:支持时间、日历、闹钟、秒中断和周期性事件管理。
  4. 高精度:结合 LSE 或 HSE 时钟源,可以提供高精度的时间跟踪。

3.2 框图(详细结构)

img

RTC(实时时钟)模块位于 后备区域(Backup Domain) 中,依赖于备用电池(VBAT)供电,即使主电源关闭也可以保持运行。框图主要由以下几个模块组成:

  • 时钟输入与分频模块
  • RTC 可编程计数器
  • 控制寄存器与中断控制
  • 待机唤醒功能

这些模块协同工作以实现 RTC 的时间计数、闹钟、秒中断和溢出中断等功能。

(1) APB1 总线与接口

  • RTC 通过 APB1 总线(Advanced Peripheral Bus 1)连接到系统。

  • APB1 接口是 RTC 的通信接口,它允许 MCU(主控制器)通过寄存器对 RTC 进行配置和读取。

  • 注意:

    • APB1 接口的时钟频率 必须高于 RTC 时钟频率的 4 倍,确保数据通信的稳定性。

(2) RTC 时钟源(RTCCLK)

  • RTC 时钟源 RTCCLK 是 RTC 模块运行的核心时钟信号。支持三种时钟源选择:

    • HSE(高速外部时钟)/128:高精度晶振时钟。
    • LSE(低速外部振荡器):通常为 32.768 kHz 晶体,精度高、功耗低。
    • LSI(低速内部振荡器):40 kHz 内部振荡器,功耗低,但精度稍差。
  • RTC 时钟源通过 RCC 模块配置。

(3) RTC 预分频器

  • 预分频器(RTC Prescaler)是 RTC 模块的重要组成部分,用于将高频时钟(RTCCLK)分频为更低的频率,适合 RTC 计数器使用。

  • 功能:

    • 通过寄存器 RTC_PRL(重载值寄存器)RTC_DIV(分频器寄存器) 设置分频值。
    • 比如,当输入时钟为 32.768 kHz,预分频器设置为 32767 时,每秒触发一次分频输出(1 Hz)。也就是PRL设置为32767(固定的),DIV初值可以设置为0,来一个输入脉冲,DIV-1,溢出,输出一个输出脉冲,同时DIV被重载为32727;后面每来一个输入脉冲,DIV的值减1,直到减到0时,再来一个输入脉冲,DIV溢出,输出一个脉冲信号,同时DIV继续回到32767。实现每来一个32768脉冲的时钟,输出的是1脉冲的时钟,也就是32.768 kHz被分频为1Hz
    • 输出时钟作为 RTC 计数器(RTC_CNT) 的输入时钟。

(4) RTC 可编程计数器

  • RTC 计数器(RTC_CNT) 是一个 32 位的递增计数器,用于存储当前的时间值。

  • 工作原理:

    • RTC_CNT 每秒递增 1(当预分频器设置为 1 秒时基)。
    • 软件可以读取 RTC_CNT 的值来获取当前的时间戳。
    • 计数器可以被设置为任意值,以实现时间的初始化或校准。

(5) 闹钟功能

  • RTC 提供 RTC_ALR(闹钟寄存器),用户可以通过设置闹钟时间与 RTC_CNT 的值进行比较。

  • 当 RTC_CNT 的值与 RTC_ALR 相等时:

    • 触发 RTC_Alarm 中断
    • 闹钟事件可以用于唤醒系统或执行定时任务。

(6) RTC 控制寄存器(RTC_CR)

  • RTC_CR 是 RTC 的核心配置寄存器,用于控制模块功能和中断管理。

  • 主要功能:

    • RTC_Second 中断(SECF 和 SECIE)
      • 每秒触发一个中断信号,用于实现周期性任务。
    • RTC_Overflow 中断(OWF 和 OWIE)
      • 当 RTC_CNT 溢出(从最大值回到 0)时触发。但一般是不会触发的,因为这里的CNT定义的是一个32位的无符号数,到2106年的时候才会溢出(时间戳)
    • RTC_Alarm 中断(ALRF 和 ALRIE)
      • 当 RTC_CNT 等于 RTC_ALR 的值时触发。
    • 通过 NVIC 中断控制器 管理中断优先级和响应。

(7) 中断和待机模式唤醒

  • RTC 的中断信号(RTC_Alarm、RTC_Second、RTC_Overflow)可以触发系统中断,通过 NVIC 中断控制器 传递给 CPU 处理。

  • 唤醒功能:

    • RTC_Alarm 信号还可以通过 WKUP pin(唤醒引脚) 唤醒系统,从待机模式恢复到正常运行模式。
    • 在低功耗应用中,RTC 是常用的唤醒触发器。

(8) 后备区域与掉电保护

  • RTC 位于后备区域(Backup Domain),由备用电池(VBAT)供电。
  • 即使主电源关闭,RTC 的计数器和寄存器依然能正常运行。
  • 在掉电或复位后,通过 VBAT 保持 RTC 的设置和当前时间不丢失。

3.3 RTC 的基本结构

img

(1) 初始化 RTC

  1. 选择 RTC 时钟源:
    • 配置 RCC 模块,选择 RTCCLK 的来源(LSE、LSI 或 HSE/128)。
  1. 配置预分频器:
    • 设置 RTC_PRL 和 RTC_DIV,确保 RTC_CNT 每秒递增 1(或其他所需频率)。
  1. 解除写保护:
    • 通过 PWR_CR 的 DBP 位解除后备域写保护,允许修改 RTC 的配置。
  1. 启动 RTC:
    • 启用 RTC_CR 寄存器中的相关位,开始 RTC 计数。

(2) 读取时间

  • 通过 APB1 接口读取 RTC_CNT 的值,获取当前时间。

(3) 配置闹钟

  • 设置 RTC_ALR 寄存器的值为目标时间。
  • 启用 RTC_ALR 中断,等待闹钟事件触发。

(4) 响应中断

  • 当 RTC_Alarm、RTC_Second 或 RTC_Overflow 中断触发时,系统可以通过 NVIC 响应中断信号,执行相关操作。

(5) 唤醒系统

  • 在低功耗模式下,RTC_Alarm 信号可以通过 WKUP pin 唤醒系统。

3.4 硬件电路

img

img

3.5 使用注意事项

3.5.1 使能对 BKP 和 RTC 的访问

RTC 位于 后备区域(Backup Domain),默认情况下对其访问是受限制的。这是为了保护后备区域(包括 RTC 和 BKP 寄存器)数据免于意外的写操作。要使能对 RTC 和后备区域的访问,需要执行以下步骤:

  1. 使能 PWR 和 BKP 的时钟:

操作:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    • 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位
      • PWREN 位:使能电源模块(PWR)的时钟。
      • BKPEN 位:使能后备区域(BKP)的时钟。
  1. 解除后备区域的写保护:

操作:

PWR_BackupAccessCmd(ENABLE);
    • 设置 PWR_CR 寄存器的 DBP 位(Disable Backup Domain Write Protection)。
    • 在解除写保护后,允许对 RTC 和后备区域进行写操作。

3.5.2 同步寄存器(RSF)状态

在某些情况下,RTC 的 APB1 接口可能处于禁止状态(如系统启动后第一次访问 RTC),此时需要等待 RTC 同步完成,才能正常读取 RTC 寄存器的值。

  1. 检查 RTC_CRL 的 RSF 位:
    • RSF 位(寄存器同步标志位):指示 RTC 是否已经与 APB1 总线同步。
    • 如果 RSF 位未被置位(同步未完成),则软硬件操作必须等待 RSF 位被置位后才能继续。
  1. 清除 RSF 标志:

操作:

while (RTC_GetFlagStatus(RTC_FLAG_RSF) == RESET); // 等待同步完成
    • 软件必须清除 RSF 位,等待同步完成。
    • 确认同步完成后,才能读取 RTC 的计数器值。

img


3.5.3 进入 RTC 配置模式

要对 RTC 进行配置(如设置计数器、预分频器或闹钟寄存器的值),必须让 RTC 进入 配置模式(Configuration Mode)

  1. 设置 CNF 位:
    • 通过设置 RTC_CRL 寄存器的 CNF 位,进入配置模式。
    • 配置完成后,必须清除 CNF 位,退出配置模式。
  1. 可配置的寄存器:
    • RTC_PRL(预分频器寄存器):用于配置 RTC 的时钟分频值。
    • RTC_CNT(计数器寄存器):设置 RTC 的当前计数值。
    • RTC_ALR(闹钟寄存器):设置 RTC 的闹钟值。
  1. 操作流程:

示例代码:

RTC_EnterConfigMode();            // 进入配置模式
RTC_SetPrescaler(32767);          // 设置预分频器值
RTC_SetCounter(0);                // 设置计数器值
RTC_SetAlarm(3600);               // 设置闹钟值
RTC_ExitConfigMode();             // 退出配置模式
    • 进入配置模式,修改寄存器值,退出配置模式。

3.5.4 写操作完成前必须等待

RTC 的所有写操作都是异步完成的,写操作可能需要一定时间。要确保写入的值生效,必须等待上一次写操作完成后,再进行下一次写操作。

  1. 检查 RTOFF 状态:
    • RTOFF 位(写完成标志位):当 RTOFF 位为 1 时,表示 RTC 的寄存器写操作已经完成,可以进行下一次写操作。
    • 在修改任何 RTC 寄存器前,必须先检查 RTOFF 位为 1。
  1. 操作:

示例代码:

while (RTC_GetFlagStatus(RTC_FLAG_RTOFF) == RESET); // 等待写完成
    • 每次写操作完成后,检查 RTOFF 位,确保写入成功。

3.5.5 概括

关键操作流程
  1. 使能 PWR 和 BKP 的时钟。
  2. 解除写保护(设置PWR_CR的DBP,使能对BKP和RTC的访问)。
  3. 检查同步状态(RSF 位)。若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1 — 也就是RTC_WaitForSynchro函数,可以去看其定义就可以发现是对RSF标志位进行设置的
  4. 进入配置模式(设置 CNF 位)。
  5. 修改 RTC 寄存器的值:
    • RTC_PRL(预分频器寄存器)
    • RTC_CNT(计数器寄存器)
    • RTC_ALR(闹钟寄存器)
  1. 确保写操作完成(检查 RTOFF 位,仅当RTOFF状态位是1时,才可以写入RTC寄存器)。对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器 ---- 也就是RTC_WaitForLastTask函数,去看其函数定义可以发现其就是对RTOFF状态进行循环查询是否处于更新中
  2. 退出配置模式(清除 CNF 位)。
可能的错误操作
  • 未使能时钟: 如果 PWR 和 BKP 的时钟未使能,将无法访问 RTC 和后备寄存器。
  • 未解除写保护: 如果未设置 DBP 位,则无法对 RTC 和后备寄存器进行写操作。
  • 未等待同步完成: 如果 RSF 位未被置位而直接读取寄存器,可能会导致读取错误。
  • 未等待写完成: 如果在 RTOFF 位清零时修改寄存器,可能会覆盖之前的写操作。
优化建议
  • 在代码中加入足够的错误检查,确保每一步操作的状态都满足要求。
  • RTC 的配置流程较为复杂,建议封装成函数,减少出错几率。
#include "stm32f10x.h"void RTC_Init(void) {// 1. 使能 PWR 和 BKP 的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);// 2. 解除写保护PWR_BackupAccessCmd(ENABLE);// 3. 选择 LSE 作为 RTC 时钟源RCC_LSEConfig(RCC_LSE_ON);while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // 等待 LSE 就绪// while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET); // 等待 LSE 就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);// 4. 启用 RTC 时钟RCC_RTCCLKCmd(ENABLE);// 5. 等待 RTC 同步完成RTC_WaitForSynchro();RTC_WaitForLastTask();			  //等待上一次操作完成,确保写操作完成// 6. 配置 RTC// RTC_EnterConfigMode();            // 进入配置模式,其实也可以不用写,下面的RTC_SetPrescaler函数其实内部就调用了RTC_SetPrescaler(32767);          // 设置预分频器(1 秒为基准)RTC_WaitForLastTask();            // 确保写操作完成RTC_SetCounter(0);                // 设置计数器初始值为 0,根据设置的分频后的时钟,会以1s的时间间隔开始自增RTC_WaitForLastTask();            // 确保写操作完成// RTC_ExitConfigMode();             // 退出配置模式,和RTC_EnterConfigMode同理
}int main(void) {RTC_Init();                       // 初始化 RTCwhile (1) {uint32_t time = RTC_GetCounter(); // 获取当前时间printf("当前时间:%lu 秒\n", time);}
}

4.实验

4.1 BKP

📎12-1 读写备份寄存器.zip

img

hardware:

  • 📎Key.c📎Key.h📎OLED.c📎OLED.h📎OLED_Font.h

User

  • 📎main.c ---- 主要看该文件中的函数使用

4.2 RTC

📎12-2 实时时钟.zip

img

Hardware:

  • 📎OLED.c📎OLED.h📎OLED_Font.h

User:

  • 📎main.c

System:

  • 📎MyRTC.c📎MyRTC.h

具体的函数去看函数手册中的:

  • img
  • img

5.扩展

STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。

  • HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
  • HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时 钟源,频率范围为4MHz~16MHz。
  • LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG
  • LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC
  • PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

系统时钟SYSCLK可来源于三个时钟源:

  • HSI振荡器时钟
  • HSE振荡器时钟
  • PLL时钟

重要的时钟有:

  • SYSCLK(系统时钟)
  • AHB总线时钟
  • APB1总线时钟(低速): 速度最高36MHz
  • APB2总线时钟(高速): 速度最高72MHz
  • PLL时钟

相关文章:

stm32之BKP备份寄存器和RTC时钟

目录 1.时间戳1.1 Unix时间戳1.2 UTC/GMT1.3 时间戳转换**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…...

OSCP - Hack The Box - Sau

主要知识点 CVE-2023-27163漏洞利用systemd提权 具体步骤 执行nmap扫描&#xff0c;可以先看一下55555端口 Nmap scan report for 10.10.11.224 Host is up (0.58s latency). Not shown: 65531 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp o…...

C++色彩博弈的史诗:红黑树

文章目录 1.红黑树的概念2.红黑树的结构3.红黑树的插入4.红黑树的删除5.红黑树与AVL树的比较6.红黑树的验证希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 红黑树是一种自平衡二叉查找树&#xff0c;每个节点都带有颜色属性&#xff0c;颜色或为…...

14.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing_interleaved

本实例主要讲解内容 这个Three.js示例展示了如何结合使用索引几何体、GPU实例化和交错缓冲区来高效渲染大量相同模型的不同实例。通过这种技术组合&#xff0c;我们可以在保持较低内存占用的同时渲染数千个独立变换的对象。 核心技术包括&#xff1a; 索引几何体的实例化渲染…...

「华为」人形机器人赛道投资首秀!

温馨提示&#xff1a;运营团队2025年最新原创报告&#xff08;共210页&#xff09; —— 正文&#xff1a; 近日&#xff0c;【华为】完成具身智能赛道投资首秀&#xff0c;继续加码人形机器人赛道布局。 2025年3月31日&#xff0c;具身智能机器人头部创企【千寻智能&#x…...

GitHub 趋势日报 (2025年05月11日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型&#xff0c;一键生成高清短视频使用…...

MySQL查询优化100条军规

概述 以下是MySQL查询优化的关键军规&#xff0c;分为不同类别&#xff0c;帮助您系统化提升数据库性能资料已经分类整理好&#xff0c;喜欢的朋友自取&#xff1a;https://pan.quark.cn/s/f52968c518d3 一、索引优化 为WHERE、JOIN、ORDER BY字段建索引联合索引遵循最左前缀…...

WEBSTORM前端 —— 第3章:移动 Web —— 第1节:平面转换、渐变

目录 一.平面转换 二.平面转换 – 平移 ①属性 ②取值 ③技巧 三.平移实现居中效果 四.案例——双开门效果 五.平面转换 – 旋转 ①属性 ②技巧 六.平面转换 – 改变转换原点 ①属性 ②取值 七.案例-时钟 八.平面转换 – 多重转换 九.平面转换 – 缩放 ①属性 …...

1.10-数据传输格式

1.10-数据传输格式 在对网站进行渗透测试时&#xff0c;使用目标服务器规定的数据传输格式来进行 payload 测试非常关键 如果不按规定格式发送数据&#xff0c;服务器可能直接拒绝请求或返回错误响应&#xff0c;比如&#xff1a; 接口要求 JSON 格式&#xff0c;而你用的是…...

Python制作Dashboard【待续】

运行环境&#xff1a;jupyter notebook (python 3.12.7)...

物理:海市蜃楼是宇宙背景辐射吗?

宇宙背景辐射(特别是宇宙微波背景辐射,CMB)与海市蜃楼是两种完全不同的现象,它们的物理机制、来源和科学意义截然不同。以下是详细的解释: 1. 宇宙微波背景辐射(CMB)的本质 起源:CMB是大爆炸理论的关键证据之一。它形成于宇宙诞生后约38万年(即“最后散射时期”),当…...

联想 SR550 服务器,配置 RAID 5教程!

今天的任务&#xff0c;是帮客户的一台联想Lenovo thinksystem x SR550 服务器&#xff0c;配置RAID 5&#xff0c;并安装windows server 2019操作系统。那么依然是按照我的个人传统&#xff0c;顺便做一个教程&#xff0c;分享给有需要的粉丝们。 第一步&#xff0c;服务器开机…...

Docker-配置私有仓库(Harbor)

配置私有仓库&#xff08;Harbor&#xff09; 一、环境准备安装 Docker 三、安装docker-compose四、准备Harbor五、配置证书六、部署配置Harbor七、配置启动服务八、定制本地仓库九、测试本地仓库 Harbor(港湾)&#xff0c;是一个用于 存储 和 分发 Docker 镜像的企业级 Regi…...

1.5 连续性与导数

一、连续性的底层逻辑&#xff08;前因&#xff09; 为什么需要研究连续性&#xff1f; 数学家在研究函数图像时发现两类现象&#xff1a;有些函数能用一笔画完不断开&#xff08;如抛物线&#xff09;&#xff0c;有些则会出现"断崖"“跳跃"或"无底洞”&a…...

Day22打卡-复习

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号人员生还预测https://www.kaggle.com/competitions/titanic/overview K…...

配置Hadoop集群环境准备

&#xff08;一&#xff09;Hadoop的运行模式 一共有三种&#xff1a; 本地运行。伪分布式完全分布式 &#xff08;二&#xff09;Hadoop的完全分布式运行 要模拟这个功能&#xff0c;我们需要做好如下的准备。 1&#xff09;准备3台客户机&#xff08;关闭防火墙、静态IP、…...

HTTPS全解析:从证书签发到TLS握手优化

HTTPS&#xff08;超文本传输安全协议 本质上是HTTP的安全版本。标准的HTTP协议仅规范了客户端与服务器之间的通信格式&#xff0c;但所有数据传输都是明文的&#xff0c;容易被中间人窃听和篡改。HTTPS通过加密传输数据解决了这一安全问题。 HTTPS可以理解为"HTTPTLS/SS…...

#将一个 .c 文件转变为可直接运行的文件过程及原理

将一个 .c 文件&#xff08;C语言源代码&#xff09;转变为可直接运行的可执行文件&#xff0c;涉及从源代码到机器码的编译和链接过程。以下是详细的过程与原理&#xff0c;分为步骤说明&#xff1a; 一、总体流程 .c 文件到可执行文件的过程通常包括以下几个阶段&#xff1a…...

【软件学习】GeneMiner 2:系统发育基因组学的一体化全流程分析工具

【软件学习】GeneMiner 2—— 系统发育基因组学的一体化全流程分析工具 文章目录 【软件学习】GeneMiner 2—— 系统发育基因组学的一体化全流程分析工具前言一、软件了解二、软件安装三、软件使用示例演示3.1 快速掌握使用方法3.2 获取质体基因组和质体基因3.3 单拷贝基因建树…...

聊一聊AI对接口测试的潜在影响有哪些?

目录 一、 自动化测试用例生成 二、 缺陷预测与根因分析 三、自适应测试维护 四、实时监控与自适应优化 五、 性能与安全测试增强 六、测试结果分析与报告 七、持续测试与DevOps集成 八、挑战与局限性 九、未来趋势 使用AI可以自动化测试用例生成、异常检测、结果分析…...

wordcount在mapreduce的例子

1.启动集群 2.创建项目 项目结构为&#xff1a; 3.pom.xml文件为 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://mave…...

CSS3 遮罩

在网页设计中&#xff0c;我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3 遮罩&#xff08;mask&#xff09;允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解 CSS3 遮罩的功能和应用。 什么是 CSS3 遮罩&#xff1f; CSS3 遮罩是一种…...

HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(一)

一.HTTP协议 我们上篇文章已经提到了对于自定义协议的序列化与反序列化。那么有没有什么比较成熟的&#xff0c;大佬们写的应用层协议&#xff0c;供我们参考使用呢?HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c; HTTP&#xff08;HyperText Transfer Prot…...

Matlab 234-锂电池充放电仿真

1、内容简介 Matlab 234-锂电池充放电仿真 可以交流、咨询、答疑 2、内容说明 略 锂离子电池已经广泛应用于我国目前电子产品市场&#xff0c;当下手机市场和新能源市场对于锂离子电池的大量需求&#xff0c;推动了锂离子电池的发展&#xff0c;我国已经成为世界上锂离子电池…...

std::move 和 std::forward

关联点 都是执行转换(cast)的函数&#xff08;函数模板&#xff09;&#xff0c;不产生任何可执行代码。且都可以把实参转换成右值。 std::move无条件将实参&#xff08;const除外 &#xff09;转换成右值引用&#xff0c;std::forward 条件返回右值引用 _EXPORT_STD template…...

工业协议跨界实录:零基础玩转PROFINET转EtherCAT主站智能网关

工业自动化领域的金字塔就是工业通信行业&#xff0c;用的最多的便是协议转换模块&#xff0c;通俗来说&#xff0c;网关就像一个“语言翻译器”&#xff0c;能把一种通信语言转换成另一种&#xff0c;满足实际通信需求&#xff0c;还能保护投资。PROFINET 转EtherCAT 网关WL-P…...

开源链动2+1模式AI智能名片S2B2C商城小程序赋能新微商服务能力升级研究

摘要&#xff1a;本文聚焦新微商服务能力升级路径&#xff0c;探讨开源链动21模式、AI智能名片与S2B2C商城小程序在重构培训体系、激励机制及用户服务中的协同作用。研究显示&#xff0c;新微商通过“技术赋能-机制创新-服务深化”三维变革&#xff0c;将传统微商的“产品压货”…...

vue3配置element-ui的使用

今天阐述一下如何在vue中进行配置使用element-ui&#xff1b; 一&#xff0c;配置下载Element 1.首页在电脑上下载好vue&#xff0c;以及npm&#xff0c;可以去相关的官方进行下载。 2.进行配置命令 npm install element-plus --save如报错&#xff1a; npm error code ERE…...

39-绘制渐变的文字

39-绘制渐变的文字_哔哩哔哩_bilibili39-绘制渐变的文字是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第40集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bilibi…...

HBase进阶之路:从原理到实战的深度探索

目录 一、HBase 核心概念再梳理 1.1 RowKey 1.2 Column Family 1.3 Region 二、架构与运行机制剖析 2.1 架构组件详解 2.1.1 Client 2.1.2 Zookeeper 2.1.3 Master 2.1.4 RegionServer 2.1.5 HDFS 2.2 数据读写流程深度解析 2.2.1 数据写入流程 2.2.2 数据读取流…...

使用 AddressSanitizer 检测栈内存越界错误

一、概述 在 C/C 编程中&#xff0c;栈内存越界 是一种常见而危险的内存错误&#xff0c;通常发生在局部变量数组被访问时索引越界。由于栈空间的结构特点&#xff0c;越界写入可能覆盖返回地址或其他局部变量&#xff0c;导致不可预测的行为甚至程序崩溃。传统的调试手段难以定…...

【技巧】离线安装docker镜像的方法

回到目录 【技巧】离线安装docker镜像的方法 0. 为什么需要离线安装&#xff1f; 第一、 由于docker hub被墙&#xff0c;所以 拉取镜像需要配置国内镜像源 第二、有一些特殊行业服务器无法接入互联网&#xff0c;需要手工安装镜像 1. 可以正常拉取镜像服务器操作 服务器…...

vue实现与后台springboot传递数据【传值/取值 Axios 】

vue实现与后台springboot传递数据【传值/取值】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…...

Git日志信息

Git日志信息 1. log log 命令用于查看 git 的各种日志信息&#xff0c;在使用 log 后&#xff0c;git 会进入 vim 模式&#xff0c;此时退出日志模式需要按下 q 键。可以通过小箭头来浏览未显示出来的内容。 1.1 查看日志信息 git log git log --prettyoneline #美观输出日…...

Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载

Linux操作系统从入门到实战&#xff08;六&#xff09;Linux开发工具&#xff08;上&#xff09;详细介绍什么是软件包管理器&#xff0c;Linux下如何进行软件和软件包的安装、升级与卸载 前言一、 软件包管理器1.1 传统安装方式的麻烦&#xff1a;从源代码说起1.2 软件包&…...

Java中的​​策略模式​​和​​模板方法模式

文章目录 1. 策略模式&#xff08;Strategy Pattern&#xff09;案例&#xff1a;支付方式选择 2. 模板方法模式&#xff08;Template Method Pattern&#xff09;案例&#xff1a;制作饮料流程 3. 策略模式 vs 模板方法模式4.总结 在Java中&#xff0c;策略模式和模板方法模式…...

C#里WPF使用触发器实现鼠标点击响应

在WPF里创建了一个自定义的用户控件, 要想在这个控件里实现鼠标的点击事件响应, 就需要添加事件触发器交互定义,如下代码: <ListView x:Name="ListViewMenu" ItemsSource="{Binding Path=SubItems}" Foreground="White" ScrollViewer.Ho…...

tensorflow-cpu

python3.8~3.12安装tensorflow-cpu 准备 创建并进入目录 mkdir tf-cpu cd tf-cpu编写测试代码 test_tensorflow.py import tensorflow as tf# 检查TensorFlow版本 print("\nTensorFlow version:", tf.__version__,end\n\n)# 创建一个简单的计算图并运行它 tensor …...

【AI提示词】PEST分析

提示说明 市场分析师专注于为企业、产品或国家提供PEST分析支持&#xff0c;以制定精准的市场战略。 提示词 # Role: PEST分析## Profile - language: 中文 - description: 市场分析师专注于为企业、产品或国家提供PEST分析支持&#xff0c;以制定精准的市场战略 - backgrou…...

42、在.NET 中能够将⾮静态的⽅法覆写成静态⽅法吗?

在.NET中&#xff0c;不能将非静态方法&#xff08;实例方法&#xff09;直接覆写&#xff08;Override&#xff09;为静态方法&#xff08;Static Method&#xff09;。以下是关键原因和解释&#xff1a; 1. 方法绑定的本质区别 实例方法&#xff1a;属于对象的实例&#xf…...

【嵌入式系统设计师(软考中级)】第三章:嵌入式系统软件基础知识——①软件及操作系统基础

文章目录 1. 嵌入式系统软件基础知识1.1 嵌入式软件分类1.2 嵌入式系统初始化1.3 无操作系统支持的嵌入式软件体系结构1.4 有操作系统支持的嵌入式软件体系结构1.5 嵌入式支撑软件 2. 嵌入式操作系统基础知识2.1 嵌入式操作系统基本概念2.2 处理器管理2.2.1 多道程序2.2.2 分区…...

cs224w课程学习笔记-第11课

cs224w课程学习笔记-第11课 知识图谱嵌入 前言一、知识图谱1、知识图谱特点2、关系类型 二、知识图谱嵌入1、嵌入核心思想2、嵌入模型2.1 嵌入模型transE1)、核心思想2)、训练步骤3)、模型表征能力 2.2 嵌入模型TransR2.3 DistMult嵌入模型1)、核心思想2)、表征能力 2.4 complE…...

5.10-套接字通信 - C++

套接字通信 1.1 通信效率问题 服务器端 单线程 / 单进程 无法使用&#xff0c;不支持多客户端 多线程 / 多进程 写程序优先考虑多线程&#xff1a;什么时候考虑多进程&#xff1f; 启动了一个可执行程序 A &#xff0c;要在 A 中启动一个可执行程序 B 支持多客户端连接 IO 多…...

【Linux】Linux内核的网络协议之socket理解

1. Socket&#xff08;套接字&#xff09; 的本质 它是应用程序与网络协议栈之间的编程接口&#xff08;API&#xff09;&#xff0c;用于实现网络通信。 Socket 并不是一个物理设备&#xff0c;而是一个抽象层为应用程序提供统一的网络操作接口&#xff08;如 send()、recv()…...

仿函数和函数对象

1. 概念解读&#xff1a;什么是“函数”和“函数对象”&#xff1f; 核心概念一句话总结 仿函数&#xff08;Functor&#xff09; 函数对象&#xff08;Function Object&#xff09; 它们本质是一个对象&#xff08;Object&#xff09;&#xff0c;但可以像函数&#xff08;Fu…...

Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Django 项目的 models 目录中,__init__.py 文件的作用

在 Django 项目的models/init.py文件中&#xff0c;这些导入语句的主要作用是将各个模型类从不同的模块中导入到models包的命名空间中。这样做有以下几个目的&#xff1a; 简化导入路径 当你需要在项目的其他地方使用这些模型时&#xff0c;可以直接从models包导入&#xff0c…...

学习日志04 java

PTA上的练习复盘 java01 编程题作业感悟&#xff1a; 可以用ai指导自己怎么调试&#xff0c;但是不要把调代码这过程里面的精华交给ai&#xff0c;就是自己去修正错误不能让ai代劳&#xff01;~~~ 1 scanner.close() Scanner *** new Scanner(System.in); ***.close(); …...

vue-pdf-embed预览PDF

一、vue-pdf-embed 链接&#xff1a;Yarn 1、安装插件 npm install vue-pdf-embed 2、文件中引入&#xff08;分页效果已实现&#xff0c;样式请自行修改&#xff09; <template><div class"download-pdf-preview" style"height: 450px; border:1…...

C++GO语言微服务之Dockerfile docker-compose

目录 01 01-知识点概述 02 02-dockerfile复习 03 03-环境变量ENV的使用 04 04-WORKDIR的使用 05 05-USER和ARG的使用 06 06-ONBUILD的使用 07 07-dockerfile的缓存相关的参数 08 08-dockerfile的编写 09 09-测试-没成功-好像是网不行 01 10-docker-compose介绍 02 11…...