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

MCU开发学习记录17* - RTC学习与实践(HAL库) - 日历、闹钟、RTC备份寄存器 -STM32CubeMX

名词解释:

RTC:Real-Time Clock

统一文章结构(数字后加*):

        第一部分: 阐述外设工作原理;第二部分:芯片参考手册对应外设的学习;第三部分:使用STM32CubeMX进行外设初始化;第四部分:添加应用代码;第五部分:附上本篇文章的工程代码的下载地址。

        本文将介绍RTC的相关概念以及STM32CubeMX生成RTC的配置函数,实现日历与闹钟功能,同时使用备份寄存器存放时间数据,保证上电后以备份寄存器存放时间数据进行运行。

一、什么是RTC?

1.1 ​RTC简介

1.1.1 RTC功能介绍

1.2 RTC硬件框图介绍

1.2.1 时钟源

RTC 时钟源—RTCCLK 可以从 LSELSI HSE_RTC 这三者中得到。其中使用最多的是 LSE, LSE 由一个外部的 32.768KHZ6PF 负载)的晶振提供,精度高,稳定,RTC 首选。LSI 是芯片内部的 30KHZ 晶体,精度较低,会有温漂,一般不建议使用。HSE_RTC HSE 分频得到,最高是 4M,使用的也较少。

1.2.2 预分频器

        预分频器 PRER 由7位的异步预分频器PREDIV_A和15位的同步预分频器PREDIV_S组成。
        要使用频率为 32.768 kHz 的 LSE
获得频率为 1 Hz 的内部时钟 (ck_spre),需要将异步预分 频系数设置为 128,并将同步预分频系数设置为 256

        异步预分频器时钟 CK_APRE 用于为二进制 RTC_SSR 亚秒递减计数器提供时钟
        异步预分频器时钟 f_CK_APRE = f_RTC_CLK/(PREDIV_A+1)
        当 RTC_SSR
寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S。而PREDIV_S 一般为 255,这样,我们得到亚秒时间的精度是:1/256 秒,即 3.9ms 左右,有了这个亚秒寄存器 RTC_SSR,就可以得到更加精确的时间数据。

        同步预分频器时钟 CK_SPRE 用于更新日历,也可以用作 16 位唤醒自动重载定时器的时基。
        同步预分频器时钟 f_CK_SPRE = f_RTC_CLK/((PREDIV_S+1) * (PREDIV_A+1))

1.2.3 实时时钟和日历

        实时时钟一般是这样表示的:///亚秒

· RTC_SSR对应于亚秒

        亚秒值 = ( PREDIV_S - SS ) / ( PREDIV_S + 1 )

        

        

· RTC_TR 对应于时间

         

· RTC_DR对应于日期

        RTC_CLK 经过预分频器后,有一个 512HZ CK_APRE 1 1HZ CK_SPRE,这两个时钟可以成为校准的时钟输出 RTC_CALIBRTC_CALIB 最终要输出则需映射到 RTC_AF1 引脚,即PC13 输出,用来对外部提供时钟。

        

1.2.4 可编程闹钟

        STM32F407 提供两个可编程闹钟:闹钟 A(ALARM_A)和闹钟 B(ALARM_B)。通过RTC_CR 寄存器的 ALRAE 和 ALRBE 位置 1 来使能闹钟。当亚秒、秒、分、小时、日期分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/RTC_ALRMBR 中的值匹配 时,则可以产生闹钟。

        RTC 有两个闹钟,闹钟 A 和闹钟 B,,当 RTC 运行的时间跟预设的闹钟时间相同的时候,相应的标志位 ALRAF(在 RTC_ISR 寄存器中)和 ALRBF 会置 1。利用这个闹钟我们可以做一些备忘提醒功能。

        如果使能了闹钟输出(由 RTC_CR 的 OSEL[0:1] 位控制),则 ALRAF 和 ALRBF 会连接到闹钟输出引脚 RTC_ALARM,RTC_ALARM 最终连接到 RTC 的外部引脚 RTC_AF1(即PC13),输出的极性由 RTC_CR 寄存器的 POL 位配置,可以是高电平或者低电平。

1.2.5 时间戳

        时间戳即时间点的意思,就是某一个时刻的时间。时间戳复用功能 (RTC_TS) 可映射到 RTC_AF1或 RTC_AF2,当发生外部的入侵事件时,即发生时间戳事件时,RTC_ISR 寄存器中的时间戳标志位 (TSF) 将置 1,日历会保存到时间戳寄存器(RTC_TSSSR、RTC_TSTR 和 RTC_TSDR)中。时间戳往往用来记录危及时刻的时间,以供事后排查问题时查询。

1.2.6 周期性自动唤醒

        STM32F407 的 RTC 不带秒钟中断了,但是多了一个周期性自动唤醒功能。周期性唤醒功能,由一个 16 位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。 我们可以通过 RTC_CR 寄存器中的 WUTE 位设置使能此唤醒功能。

        唤醒定时器的时钟输入可以是:2、4、8 或 16 分频的 RTC 时钟(RTCCLK),也可以是 ck_spre 时钟(一般为 1Hz)。

        当选择 RTCCLK(假定 LSE 是:32.768 kHz)作为输入时钟时,可配置的唤醒中断周期介于122us(因为 RTCCLK/2 时,RTC_WUTR 不能设置为 0)和 32 s 之间,分辨率最低为:61us。

        当选择 ck_spre(1Hz)作为输入时钟时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1秒。并且这个 1s~36h 的可编程时间范围分为两部分:
                当 WUCKSEL[2:1]=10 时为:1s 到 18h。
                当 WUCKSEL[2:1]=11 时约为:18h 到 36h。

        在后一种情况下,会将 2^16 添加到 16 位计数器当前值(即扩展到 17 位,相当于最高位用WUCKSEL [1]代替)。

        初始化完成后,定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)自动重载,之后必须用软件清零 WUTF 标志。

        通过将 RTC_CR 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,可以使 STM32 退出低功耗模式。系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响,它仍然可以正常工作,故唤醒定时器,可以用于周期性唤醒 STM32。

1.3 RTC的低功耗、中断

1.3.1 RTC的低功耗

        

1.3.2 RTC的中断(所有 RTC 中断均与 EXTI 控制器相连)

要使能 RTC 闹钟中断,需按照以下顺序操作:

        1. 将 EXTI 线 17 配置为中断模式并将其使能,然后选择上升沿有效。
        2. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。
        3. 配置 RTC 以生成 RTC 闹钟(闹钟
A 或闹钟 B)。

要使能 RTC 唤醒中断,需按照以下顺序操作:

        1. 将 EXTI 线 22 配置为中断模式并将其使能,然后选择上升沿有效。
        2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。
        3. 配置 RTC 以生成 RTC
唤醒定时器事件。

要使能 RTC 入侵中断,需按照以下顺序操作:

        1. 将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。
        2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。
        3. 配置 RTC 以检测 RTC
入侵事件。

要使能 RTC 时间戳中断,需按照以下顺序操作:

        1. 将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。
        2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。
        3. 配置 RTC 以检测 RTC
时间戳事件。

        

        

1.4 读取(RTC_SSR、RTC_TR、RTC_DR)注意点

STM32的RTC模块通过 ​高阶日历影子寄存器​(RTC_SSR、RTC_TR、RTC_DR)实现时间/日期数据的原子性读取。其核心规则如下:

  1. 影子寄存器锁定​:

    • 当读取 ​RTC_SSR(亚秒)​​ 或 ​RTC_TR(时间)​​ 时,硬件会立即锁定当前影子寄存器的值,直到 ​RTC_DR(日期)​​ 被读取后,影子寄存器才会更新。
    • 目的​:确保读取的时间、日期、亚秒数据来自同一时刻,避免因寄存器更新导致数据不一致(例如读取时间后日期突变)。
  2. 同步标志(RSF)​​:

    • RSF位(位于 ​RTC_ISR​ 寄存器的Bit 5)指示影子寄存器的更新状态:
      • RSF=1​:影子寄存器已与真实计数器同步,可安全读取。
      • RSF=0​:影子寄存器正在更新或未同步,读取可能不准确。

1.5 RTC 备份寄存器

        备份寄存器 (RTC_BKPxR) 包括20 32 位寄存器,用于存储 80 字节的用户应用数据。这些寄存器在备份域中实现,可在 VDD 电源关闭时通过 VBAT 保持上电状态。备份寄存器不会在系统复位或电源复位时复位,也不会在器件从待机模式唤醒时复位。

        TAMPER1 备用功能 (RTC_TAMP1) 可映射到 RTC_AF1(PC13) 或 RTC_AF2 (PI8),具体取决于 RTC_TAFCR 寄存器中 TAMP1INSEL 位的值(请参见第 23.6.17 节:RTC 入侵和复用功能配置寄存器 (RTC_TAFCR))。修改 TAMP1INSEL 后必须将 TAMPE 位清零,以避免将TAMPF 意外置 1。

二、RTC相关配置函数

2.1 RTC相关结构体

2.1.1 RTC_HandleTypeDef 

功能:RTC模块的 ​核心句柄,用于管理RTC实例的配置、状态及数据。

        1)Instance:指向 RTC 寄存器基地址。
        2)Init
:是真正的 RTC 初始化结构体

typedef struct
{RTC_TypeDef                 *Instance; /* 寄存器基地址 */RTC_InitTypeDef             Init; /* RTC 配置结构体 */HAL_LockTypeDef             Lock; /* RTC 锁定对象 */__IO HAL_RTCStateTypeDef     State; /* RTC 设备访问状态 */
}RTC_HandleTypeDef;

2.1.2 RTC_InitTypeDef 

功能:定义RTC模块的 ​初始化参数,用于配置时钟源、分频系数等。

typedef struct
{uint32_t HourFormat; /* 小时格式 */uint32_t AsynchPrediv; /* 异步预分频系数 */uint32_t SynchPrediv; /* 同步预分频系数 */ uint32_t OutPut; /* 选择连接到 RTC_ALARM 输出的标志 */ uint32_t OutPutPolarity; /* 设置 RTC_ALARM 的输出极性 */uint32_t OutPutType; /* 设置 RTC_ALARM 的输出类型为开漏输出还是推挽输出 */ 
}RTC_InitTypeDef;

2.1.3 RTC_TimeTypeDef

功能:存储和操作 ​时间信息​(时、分、秒、亚秒)。

typedef struct
{uint8_t Hours;            /*!< 指定 RTC 时间的小时。如果选择了 RTC_HourFormat_12,此参数必须是 Min_Data = 0 到 Max_Data = 12 之间的数字。如果选择了 RTC_HourFormat_24,此参数必须是 Min_Data = 0 到 Max_Data = 23 之间的数字。 */// 表示小时,范围根据12小时制 (0-12) 或24小时制 (0-23) 变化。uint8_t Minutes;          /*!< 指定 RTC 时间的分钟。此参数必须是 Min_Data = 0 到 Max_Data = 59 之间的数字。 */// 表示分钟,范围为0到59。uint8_t Seconds;          /*!< 指定 RTC 时间的秒。此参数必须是 Min_Data = 0 到 Max_Data = 59 之间的数字。 */// 表示秒,范围为0到59。uint8_t TimeFormat;       /*!< 指定 RTC 的 AM/PM 时间。此参数可以是 @ref RTC_AM_PM_Definitions 中的一个值。 */// 在12小时制下指定上午 (AM) 或下午 (PM),具体值参考 RTC_AM_PM_Definitions 定义。uint32_t SubSeconds;      /*!< 指定 RTC_SSR RTC 子秒寄存器的内容。此参数对应于时间单位范围在 [0-1] 秒之间,粒度为 [1 秒 / SecondFraction +1]。 */// 表示子秒 (小于1秒的部分),粒度由 SecondFraction 决定。uint32_t SecondFraction;  /*!< 指定与同步预分频器因子值 (PREDIV_S) 对应的子秒寄存器内容的范围或粒度。此参数对应于时间单位范围在 [0-1] 秒之间,粒度为 [1 秒 / SecondFraction +1]。此字段仅由 HAL_RTC_GetTime 函数使用。 */// 定义子秒的粒度,与预分频器相关,仅用于 HAL_RTC_GetTime 函数。uint32_t DayLightSaving;  /*!< 此接口已弃用。要管理夏令时,请使用 HAL_RTC_DST_xxx 函数。 */// 已弃用,用于夏令时管理,现推荐使用 HAL_RTC_DST_xxx 函数。uint32_t StoreOperation;  /*!< 此接口已弃用。要管理夏令时,请使用 HAL_RTC_DST_xxx 函数。 */// 已弃用,与夏令时相关,现推荐使用 HAL_RTC_DST_xxx 函数。
} RTC_TimeTypeDef;

2.1.4 RTC_DateTypeDef

功能​:存储和操作 ​日期信息​(年、月、日、星期)。

typedef struct
{uint8_t WeekDay;  /*!< 指定 RTC 日期的星期。此参数可以是 @ref RTC_WeekDay_Definitions 中的一个值 */// 表示星期几,具体值由 RTC_WeekDay_Definitions 定义提供。uint8_t Month;    /*!< 指定 RTC 日期的月份(BCD 格式)。此参数可以是 @ref RTC_Month_Date_Definitions 中的一个值 */// 表示月份,采用 BCD 格式(二进制编码的十进制),具体值由 RTC_Month_Date_Definitions 定义。uint8_t Date;     /*!< 指定 RTC 日期。此参数必须是 Min_Data = 1 到 Max_Data = 31 之间的数字 */// 表示日期,范围为1到31。uint8_t Year;     /*!< 指定 RTC 日期的年份。此参数必须是 Min_Data = 0 到 Max_Data = 99 之间的数字 */// 表示年份,范围为0到99。
} RTC_DateTypeDef;

2.2 RTC驱动配置步骤

2.2.1 RTC 初始化

  hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 255;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}sTime.Hours = 21;sTime.Minutes = 13;sTime.Seconds = 0;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}sDate.WeekDay = RTC_WEEKDAY_SATURDAY;sDate.Month = RTC_MONTH_MAY;sDate.Date = 17;sDate.Year = 25;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}//相关中断使能
/** Enable the Alarm A*/sAlarm.AlarmTime.Hours = 22;sAlarm.AlarmTime.Minutes = 14;sAlarm.AlarmTime.Seconds = 30;sAlarm.AlarmTime.SubSeconds = 0;sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS;sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDateWeekDay = 1;sAlarm.Alarm = RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}/** Enable the Alarm B*/sAlarm.AlarmTime.Hours = 15;sAlarm.AlarmTime.Minutes = 50;sAlarm.AlarmTime.Seconds = 50;sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES;sAlarm.Alarm = RTC_ALARM_B;if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}/** Enable the WakeUp*/if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK){Error_Handler();}/** Enable the RTC Tamper 1*/sTamper.Tamper = RTC_TAMPER_1;sTamper.PinSelection = RTC_TAMPERPIN_DEFAULT;sTamper.Trigger = RTC_TAMPERTRIGGER_LOWLEVEL;sTamper.Filter = RTC_TAMPERFILTER_4SAMPLE;sTamper.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV512;sTamper.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_2RTCCLK;sTamper.TamperPullUp = RTC_TAMPER_PULLUP_ENABLE;sTamper.TimeStampOnTamperDetection = RTC_TIMESTAMPONTAMPERDETECTION_ENABLE;if (HAL_RTCEx_SetTamper_IT(&hrtc, &sTamper) != HAL_OK){Error_Handler();}

三、基于HAL库实现RTC实验

3.1 基于STM32CubeMX配置RTC实验

3.2 实验的应用代码

3.2.1 日历与时间读取函数

3.2.2 闹钟回调函数

3.2.3 读写RTC备份寄存器

3.2.4 使用RTC备份寄存器重新加载时间

3.2.5 查看上次启动

3.2.6 修改stm32cubemx代码

3.3 实验备份寄存器无法正常读写的问题

如果发现备份寄存器无法正常读写。可能和RTC_AF1有关。有三个解决方法:

        

1. __HAL_RTC_TAMPER_CLEAR_FLAG(&hrtc, RTC_FLAG_TAMP1F);
        这个不太好使。

2. 可以尝试将 RTC_AF1(PC13)引脚连接 高电平 or 低电平。

3. 禁用TAMPE位

// 清除TAMPE位(禁用TAMP1入侵检测)
CLEAR_BIT(RTC->TAMPCR, RTC_TAMPCR_TAMP1E);

        

四、本文的工程文件下载链接

工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
(国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32

相关文章:

MCU开发学习记录17* - RTC学习与实践(HAL库) - 日历、闹钟、RTC备份寄存器 -STM32CubeMX

名词解释&#xff1a; RTC&#xff1a;Real-Time Clock​ 统一文章结构&#xff08;数字后加*&#xff09;&#xff1a; 第一部分&#xff1a; 阐述外设工作原理&#xff1b;第二部分&#xff1a;芯片参考手册对应外设的学习&#xff1b;第三部分&#xff1a;使用STM32CubeMX进…...

C++中的四种强制转换

static_cast 原型&#xff1a;static_cast<type-id>(expression) type-id表示目标类型&#xff0c;expression表示要转换的表达式 static_cast用于非多态类型的转换&#xff08;静态转换&#xff09;&#xff0c;编译器隐式执行的任何类型转换都可用static_c…...

YOLOv2目标检测算法:速度与精度的平衡之道

一、YOLOv2的核心改进&#xff1a;从V1到V2的蜕变 YOLOv2作为YOLO系列的第二代算法&#xff0c;在继承V1端到端、单阶段检测的基础上&#xff0c;针对V1存在的小目标检测弱、定位精度低等问题进行了全方位升级&#xff0c;成为目标检测领域的重要里程碑。 &#xff08;一&am…...

Quic如何实现udp可靠传输

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是由 Google 设计并被 IETF 标准化的传输层协议&#xff0c;它基于 UDP 实现&#xff0c;但提供了类似 TCP 的可靠性和更高级的功能&#xff08;如多路复用、0-RTT 握手、TLS 加密等&#xff09;。 尽管 UDP 是不可…...

利用腾讯云MCP提升跨平台协作效率的实践与探索

一、场景痛点 在当今这个数字化快速发展的时代&#xff0c;跨平台协作成为了许多企业和团队面临的一个重大挑战。随着企业业务的不断拓展&#xff0c;团队成员往往需要利用多种工具和平台进行沟通、协作和管理。这些平台包括但不限于电子邮件、即时通讯工具、项目管理软件、文…...

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器&#xff08;监视器&#xff09; 1.作用&#xff1a; 2.语法&#xff1a; 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 &#x1f4ac; 欢迎讨论&#…...

Python高级特性深度解析:从熟练到精通的跃迁之路

Python高级特性深度解析&#xff1a;从熟练到精通的跃迁之路 引言 对于已经掌握Python基础语法的开发者而言&#xff0c;如何突破瓶颈进入高手行列&#xff1f;本文将从Python的高级特性入手&#xff0c;深入剖析那些能让代码更优雅、效率更高的技术点&#xff0c;助你完成从…...

OGGMA 21c 微服务 (MySQL) 安装避坑指南

前言 这两天在写 100 天实战课程 的 OGG 微服务课程&#xff1a; 在 Oracle Linux 8.10 上安装 OGGMA 21c MySQL 遇到了一点问题&#xff0c;分享给大家一起避坑&#xff01; 环境信息 环境信息&#xff1a; 主机版本主机名实例名MySQL 版本IP 地址数据库字符集Goldengate …...

Linux面试题集合(4)

现有压缩文件:a.tar.gz存在于etc目录&#xff0c;如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…...

iOS Safari调试教程

iOS Safari调试 本教程将指导您如何使用WebDebugX调试iOS设备上的Safari浏览器。通过本教程&#xff0c;您将学习如何连接iOS设备、调试Safari中的网页、分析性能问题以及解决常见的调试挑战。 准备工作 在开始调试iOS Safari之前&#xff0c;请确保您已经&#xff1a; 安装…...

基于互联网和LabVIEW的多通道数据采集系统仿真设计

标题:基于互联网和LabVIEW的多通道数据采集系统仿真设计 内容:1.摘要 在当今科技飞速发展的背景下&#xff0c;多通道数据采集在众多领域有着广泛需求。本研究的目的是设计一个基于互联网和LabVIEW的多通道数据采集系统仿真方案。采用互联网技术实现数据的远程传输与共享&…...

ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法

今天遇到奇怪的问题&#xff0c;老是报 Unable to parse option value Error applying option original_size to filter subtitles: Invalid argument 踩坑很长时间&#xff0c;记录下 因subtitles需要指定绝对路径&#xff0c; 注意点&#xff1a; 外面要用单引号 不能…...

Android Studio 安装与配置完全指南

文章目录 第一部分&#xff1a;Android Studio 简介与安装准备1.1 Android Studio 概述1.2 系统要求Windows 系统&#xff1a;macOS 系统&#xff1a;Linux 系统&#xff1a; 1.3 下载 Android Studio 第二部分&#xff1a;安装 Android Studio2.1 Windows 系统安装步骤2.2 mac…...

级联与端到端对话系统架构解析:以Moshi为例

一、对话系统架构对比 1.1 级联对话系统&#xff08;Cascaded Dialogue Systems&#xff09; 传统级联系统采用多阶段处理流程&#xff1a; 语音识别&#xff08;ASR&#xff09;&#xff1a;将24kHz音频信号通过卷积神经网络&#xff08;CNN&#xff09;和Transformer转换为…...

基于 Zookeeper 部署 Kafka 集群

文章目录 1、前期准备2、安装 JDK 83、搭建 Zookeeper 集群3.1、下载3.2、调整配置3.3、标记节点3.4、启动集群 4、搭建 Kafka 集群4.1、下载4.2、调整配置4.3、启动集群 1、前期准备 本次集群搭建使用&#xff1a;3 Zookeeper 3 Kafka&#xff0c;所以我在阿里云租了3台ECS用…...

经典卷积神经网络

目录 经典卷积神经网络 一、卷积神经网络基础回顾 二、LeNet&#xff1a;开启 CNN 先河 三、AlexNet&#xff1a;突破性进展 四、ZFNet&#xff1a;继承与优化 五、GoogLeNet&#xff1a;引入 Inception 模块 六、VggNet&#xff1a;深度与简单结构的融合 七、ResNet&a…...

IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 LiteOS Studio + GCC + JLink

文章目录 概述LiteOS Studio不推荐&#xff1f;安装和使用手册呢?HCIP实验的源码呢&#xff1f; 软件和依赖安装软件下载软件安装插件安装依赖工具-方案2依赖工具-方案1 工程配置打开或新建工程板卡配置组件配置编译器配置-gcc工具链编译器配置-Makefile脚本其他配置编译完成 …...

算法加训之最短路 上(dijkstra算法)

目录 P4779 【模板】单源最短路径&#xff08;标准版&#xff09;&#xff08;洛谷&#xff09; 思路 743. 网络延迟时间&#xff08;力扣&#xff09; 思路 1514.概率最大路径&#xff08;力扣&#xff09; 思路 1631.最小体力消耗路径 思路 1976. 到达目的地的方案数 …...

java连数据库

一、准备工作 ​​安装MySQL数据库​​ 确保已安装MySQL服务器并启动服务 ​​下载JDBC驱动​​ 官方驱动&#xff1a;MySQL Connector/JMaven依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactI…...

QT+Opencv 卡尺工具找直线

QTOpencv 卡尺工具找直线 自己将别的项目中&#xff0c;单独整理出来的。实现了一个找直线的工具类。 功能如下&#xff1a;1.添加图片 2.添加卡尺工具 3.鼠标可任意拖动图片和卡尺工具 4.可调整卡尺参数和直线拟合参数 5.程序中包含了接口函数&#xff0c;其他cpp文件传入相…...

GraphPad Prism简介、安装与工作界面

《2025GraphPad Prism操作教程书籍 GraphPad Prism图表可视化与统计数据分析视频教学版GraphPad Prism科技绘图与数据分析学术图表 GraphPadPrism图表》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 1.1 GraphPad Prism简介 GraphP…...

当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强

原论文&#xff1a;s1: Simple test-time scaling 作者&#xff1a;Niklas Muennighoff, Zitong Yang, Weijia Shi等&#xff08;斯坦福大学、华盛顿大学、Allen AI研究所、Contextual AI&#xff09; 论文链接&#xff1a;arXiv:2501.19393 代码仓库&#xff1a;GitHub - simp…...

esp32课设记录(一)按键的短按、长按与双击

课程用的esp32的板子上只有一个按键&#xff0c;引脚几乎都被我用光了&#xff0c;很难再外置按键。怎么控制屏幕的gui呢&#xff1f;这就得充分利用按键了&#xff0c;比如说短按、长按与双击&#xff0c;实现不同的功能。 咱们先从短按入手讲起。 通过查看原理图&#xff0c;…...

使用AI 生成PPT 最佳实践方案对比

文章大纲 一、专业AI生成工具(推荐新手)**1. 推荐工具详解****2. 操作流程优化****3. 优势与局限**二、代码生成方案(开发者推荐)**1. Python-pptx进阶用法****2. GitHub推荐**三、混合工作流(平衡效率与定制)**1. 工具链升级****2. 示例Markdown结构**四、网页转换方案(…...

React19源码系列之 API(react-dom)

API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示&#xff0c;告诉它应该打开到给定服务器的连接。如果浏览器选择这样做&#xff0c;则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…...

supervisorctl守护进程

supervisorctl守护进程 1 安装 # ubuntu安装&#xff1a; sudo apt-get install supervisor 完成后可以在/etc/supervisor文件夹&#xff0c;找到supervisor.conf。 如果没有的话可以用如下命令创建配置文件&#xff08;注意必须存在/etc/supervisor这个文件夹&#xff09; s…...

下载的旧版的jenkins,为什么没有旧版的插件

下载的旧版的jenkins&#xff0c;为什么没有旧版的插件&#xff0c;别急 我的jenkins版本&#xff1a; 然后我去找对应的插件 https://updates.jenkins.io/download/plugins/ 1、Maven Integration plugin&#xff1a; Maven 集成管理插件。 然后点击及下载成功 然后 注意&…...

【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读&#xff0c;我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部&#xff0c;欢迎大家在评论区友好互动。 在上篇…...

出现 Uncaught ReferenceError: process is not defined 错误

在浏览器环境中&#xff0c;process 对象是 Node.js 环境特有的&#xff0c;因此当你在浏览器中运行代码时&#xff0c;会出现 Uncaught ReferenceError: process is not defined 错误。这个错误是因为代码里使用了 process.env.BASE_URL&#xff0c;而浏览器环境下并没有 proc…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-A. PostgreSQL常用函数速查表

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL常用函数速查表:从数据清洗到分析的全场景工具集引言一、字符串处理函数1.1 基础操作函数1.2 模式匹配函数(正则表达式)二、数值计算函数2.1 基础运算函数2.2 统计相关函数三、日期与时间函…...