STM32-RTC实时时钟

目录

RTC实时时钟

功能框图

UNIX时间戳

初始化结构体

RTC时间结构体

RTC日期结构体

RTC闹钟结构体

进入和退出配置函数

实验环节1:显示日历

常规配置

RTC配置

测试环节

实验现象

实验环节2:闹钟

常规配置

RTC配置

测试环节

实验现象


RTC实时时钟

STM32的RTC外设,实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设,可以计时和触发中断。

掉电指的是电源VDD断开时为了RTC外设掉电继续运行,必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有效时由VDD给RTC外设供电,当CDD掉电后,由Vbat给RTC外设供电。但无论由什么电源供电,RTC的数据都保存在属于RTC的备份域中,若主电源VDD和Vbat都掉电,则备份域保存的所有数据将丢失。备份域除了RTC模块的寄存器,还有42个16位的寄存器可以在VDD掉电时保存用户程序的数据,系统复位或电源复位时,数据也不会清空。

从RTC的定时器特性来说,是一个32位的递增计数器。时钟源有三种:HSE/128、LSI和LSE。

使用LSI或HSE/8时钟源,在主电源VDD掉电时,这两个时钟来源都会受到影响,因此无法保证RTC正常工作。因此RTC一般使用LSE。在设计中,频率通常为32.768kHz

在主电源VDD有效并处于待机模式时,RTC还可以配置闹钟事件时STM32退出待机模式

功能框图

浅灰色部分属于备份域,VDD掉电时可在Vbat的驱动下继续运行。包括了RTC分频器、计数器、闹钟控制器。

若VDD电源有效,RTC可以触发RTC_Second(秒中断)、RTC_Overflow(溢出事件)和RTC_Alarm(闹钟中断)。从结构图可以分析出,定时器溢出中断无法被配置为中断。

若STM32处于待机模式,可由闹钟事件或WKUP事件(外部唤醒事件,属于EXTI模块,不属于RTC)退出待机模式。

闹钟事件在计数器RTC_CNT的值等于闹钟寄存器RTC_ALR的值时触发。

在备份域中所有寄存器都是16位的,RTC控制相关的寄存器也不例外。它的计数器RTC_CNT的32位由RTC_CNTL和RTC_CNTH这两个寄存器组成。

在配置RTC模块的时钟时,通常把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK = RTCCLK / 32768 =1Hz,计数周期为1s,计数器在TR_CLK的驱动下计数,即每秒计数器RTC_CNT的值+1。

由于备份域的存在,使得RTC核具有了完全独立于APB1接口的特性,也因此对RTC寄存器的访问要遵守一定的规则。

系统复位后,默认禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问:

        设置RCC_APB1ENR:PWREN、BKPEN位来使能电源和后备接口时钟。

        设置PWR_CR:DBP位使能对后备寄存器和RTC的访问。

设置后备寄存器为可写访问后,在第一次通过APB1接口访问RTC时,因为时钟频率的差异,所以必须等待APB1和RTC外设同步,确保被读取出来的RTC寄存器值是正确的。若在同步后,一直没有关闭APB1的RTC外设接口,就不需要再次同步了。

如果内核要对RTC寄存器进行任何写操作,在内核写出写指令后,RTC模块在3个RTCCLK时钟后才开始正式的写RTC寄存器操作。由于RTCCLK的频率比内核主频低得多,所以每次操作后都必须检查RTC关闭操作标志位RTOFF,当这个标志位被置1,写操作才正式完成。

当然,以上操作都具有对应的库函数,不需要具体的查阅寄存器。 

UNIX时间戳

RTC_CNT是32位寄存器,可存储的最大值为2^32-1,即约等于136年。

如某个时刻读取计数器的值为2天的秒数,以2011.1.1 0:0:0时间置0计数器的,则可以算出是2011.1.3 0:0:0时间,计数器会在2011+136年左右溢出。定时器被置0的时间为计数元年,相对计时元年的秒数为时间戳(计数器的值)。

大多数操作系统都是利用时间戳和计时元年来计算当前时间的,有个标准:UNIX时间戳和UNIX计时元年。

UNIX计时元年被设置为格林威治时间1970.1.1 0:0:0时间。

在这个计时系统上,使用的是有符号的32位整形变量来保存UNIX时间戳,因此最高位表示符号,时间戳能显示的范围更小了,会在2038.1.19 3:14:07时间溢出。

网页上可搜:UNIX时间戳。可实时查看。

初始化结构体

STM32 HAL库对RTC控制提供了完善的函数。

typedef struct {
     uint32_t AsynchPrediv;    /* 配置RTC_CLK的异步分频因子(0x00~0x7F ) ,具体由RTC_PRER:PREDIV_A[6:0]配置 */
     uint32_t OutPut;          /* RTCEx输出通道设置,指定哪一路信号作为RTC的输出,禁止输出/闹钟A输出/闹钟B输出/唤醒输出 */
 } RTC_InitTypeDef;

RTC时间结构体

用来设置初始时间,配置的是RTC时间寄存器RTC_TR。

 typedef struct {
     uint8_t Hours;    /* 小时设置。12小时制式时,0~11;24小时制式时,0~23 */
     uint8_t Minutes;  /* 分钟设置,0~59 */
     uint8_t Seconds;  /* 秒设置,0~59 */
 } RTC_TimeTypeDef;

RTC日期结构体

用来设置初始日期,配置的是RTC日期寄存器RTC_DR。

typedef struct {
     uint8_t WeekDay; /* 星期几设置,1~7 */
     uint8_t Month;   /* 月份设置,1~12 */
     uint8_t Date;    /* 日期设置,1~31 */
     uint8_t Year;    /* 年份设置,0~99 */
 } RTC_DateTypeDef;

RTC闹钟结构体

用来设置闹钟时间,设置的格式为[星期/日期]-[时]-[分]-[秒],4个字段,每个字段可以设置为有效或无效(MASK)。如果MASK掉[星期/日期]字段,则每天闹钟都会响。

typedef struct {
     RTC_TimeTypeDef AlarmTime;     /* 设定RTC时间寄存器的值:时/分/秒 */
     uint32_t Alarm;                /* RTC 闹钟选择:闹钟A、闹钟B */
 } RTC_AlarmTypeDef;

进入和退出配置函数

/**
 * @brief  进入 RTC 配置模式 .
 * @param  None
 * @retval None
 */
 void RTC_EnterConfigMode(void)
 {
     /* 设置 CNF 位进入配置模式 */
     RTC->CRL |= RTC_CRL_CNF;
 }

/*
 * @brief  退出 RTC 配置模式 .
 * @param  None
 * @retval None
 */
 void RTC_ExitConfigMode(void)
 {
     /* 清空  CNF 位退出配置模式 */
     RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF);
 }

实验环节1:显示日历

常规配置

USART1:带中断,支持printf输出。

RTC配置

RTC_HandleTypeDef hrtc;

/* RTC init function */
void MX_RTC_Init(void)
{
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef DateToUpdate = {0};

    /* USER CODE BEGIN RTC_Init 1 */
    /* 判断是否首次上电 */
    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5050)
    {
        HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5050);	// 插入BKP数值判断
        /* USER CODE END RTC_Init 1 */

        /** Initialize RTC Only
        */
        hrtc.Instance = RTC;
        hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
        hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
        if (HAL_RTC_Init(&hrtc) != HAL_OK)
        {
            Error_Handler();
        }

        /** Initialize RTC and set the Time and Date
        */
        sTime.Hours = 0x0;
        sTime.Minutes = 0x0;
        sTime.Seconds = 0x0;
        if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
        {
            Error_Handler();
        }

        DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
        DateToUpdate.Month = RTC_MONTH_JANUARY;
        DateToUpdate.Date = 0x1;
        DateToUpdate.Year = 0x0;
        if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
        {
            Error_Handler();
        }

    /* USER CODE BEGIN RTC_Init 2 */
    }
    /* USER CODE END RTC_Init 2 */
}

void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
{
    if (rtcHandle->Instance == RTC)
    {
        HAL_PWR_EnableBkUpAccess();	// 取消BKP区域写保护,才能进行时间保存和计时
        /* Enable BKP CLK enable for backup registers */
        __HAL_RCC_BKP_CLK_ENABLE();	// 开启BKP时钟
        /* RTC clock enable */
        __HAL_RCC_RTC_ENABLE();
    }
}

void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle)
{
    if (rtcHandle->Instance == RTC)
    {
        __HAL_RCC_RTC_DISABLE();
    }
}

测试环节

#include "string.h"

uint8_t RxBuffer[20];

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
    {
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
    {
		// A5 5A 00 01 01 00 00 00
		if(RxBuffer[0]==0xA5 && RxBuffer[1]==0x5A)
		{
			RTC_DateTypeDef RtcDate;
			RTC_TimeTypeDef RtcTime;
		
			RtcTime.Hours = RxBuffer[5];
			RtcTime.Minutes = RxBuffer[6];
			RtcTime.Seconds = RxBuffer[7];
			
			if (HAL_RTC_SetTime(&hrtc, &RtcTime, RTC_FORMAT_BCD) != HAL_OK)
			{
				Error_Handler();
			}
			
			// 星期内部自动校正
			RtcDate.WeekDay = RTC_WEEKDAY_MONDAY;
			RtcDate.Month = RxBuffer[3];
			RtcDate.Date = RxBuffer[4];
			RtcDate.Year = RxBuffer[2];
			
			if (HAL_RTC_SetDate(&hrtc, &RtcDate, RTC_FORMAT_BCD) != HAL_OK)
			{
				Error_Handler();
			}

			memset(RxBuffer, 0, sizeof(RxBuffer));
			HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);
		}
    }	
}

void test(void)
{
	RTC_DateTypeDef RtcDate;
	RTC_TimeTypeDef RtcTime;
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);
	while(1)
	{
		HAL_RTC_GetTime(&hrtc, &RtcTime,  RTC_FORMAT_BIN);	// 读出时间值
		HAL_RTC_GetDate(&hrtc, &RtcDate,  RTC_FORMAT_BIN);	// 一定要先读时间后读日期,这样才能校正星期参数
		printf("实时时间:%04d-%02d-%02d  %02d:%02d:%02d 星期:%2d\r\n", 2000+RtcDate.Year, RtcDate.Month, 
			RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间
		HAL_Delay(1000);
	}
}

实验现象

实验环节2:闹钟

常规配置

USART1:带中断,支持printf输出。

蜂鸣器配置。

RTC配置

RTC_HandleTypeDef hrtc;

void MX_RTC_Init(void)
{
    RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef DateToUpdate = {0};
    RTC_AlarmTypeDef sAlarm = {0};

    /* USER CODE BEGIN RTC_Init 1 */
    /* 判断是否首次上电 */
    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5050)
    {
        HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5050);	// 插入BKP数值判断
    /* USER CODE END RTC_Init 1 */

        /** Initialize RTC Only
        */
        hrtc.Instance = RTC;
        hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
        hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
        if (HAL_RTC_Init(&hrtc) != HAL_OK)
        {
            Error_Handler();
        }

        /** Initialize RTC and set the Time and Date
        */
        sTime.Hours = 0x0;
        sTime.Minutes = 0x0;
        sTime.Seconds = 0x0;
        if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
        {
            Error_Handler();
        }

        DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
        DateToUpdate.Month = RTC_MONTH_JANUARY;
        DateToUpdate.Date = 0x1;
        DateToUpdate.Year = 0x0;
        if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
        {
            Error_Handler();
        }

        /** Enable the Alarm A
        */
        sAlarm.AlarmTime.Hours = 0x0;
        sAlarm.AlarmTime.Minutes = 0x1;
        sAlarm.AlarmTime.Seconds = 0x0;
        sAlarm.Alarm = RTC_ALARM_A;
        if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
        {
            Error_Handler();
        }

    /* USER CODE BEGIN RTC_Init 2 */
    }

    /* USER CODE END RTC_Init 2 */
}

void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
{
    if (rtcHandle->Instance == RTC)
    {
        HAL_PWR_EnableBkUpAccess();
        /* Enable BKP CLK enable for backup registers */
        __HAL_RCC_BKP_CLK_ENABLE();
        /* RTC clock enable */
        __HAL_RCC_RTC_ENABLE();

        /* RTC interrupt Init */
        HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
    }
}

void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle)
{
    if (rtcHandle->Instance == RTC)
    {
        __HAL_RCC_RTC_DISABLE();

        /* RTC interrupt Deinit */
        HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);
    }
}

测试环节

#include "string.h"

uint8_t RxBuffer[20];

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
    {
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
    {
		// A5 5A 00 01 01 00 00 00
		if(RxBuffer[0]==0xA5 && RxBuffer[1]==0x5A)
		{
			RTC_DateTypeDef RtcDate;
			RTC_TimeTypeDef RtcTime;
			RTC_AlarmTypeDef RtcAlarm;
			
			RtcTime.Hours = RxBuffer[5];
			RtcTime.Minutes = RxBuffer[6];
			RtcTime.Seconds = RxBuffer[7];
			
			if (HAL_RTC_SetTime(&hrtc, &RtcTime, RTC_FORMAT_BCD) != HAL_OK)
			{
				Error_Handler();
			}
			
			// 星期内部自动校正
			RtcDate.WeekDay = RTC_WEEKDAY_MONDAY;
			RtcDate.Month = RxBuffer[3];
			RtcDate.Date = RxBuffer[4];
			RtcDate.Year = RxBuffer[2];
			
			if (HAL_RTC_SetDate(&hrtc, &RtcDate, RTC_FORMAT_BCD) != HAL_OK)
			{
				Error_Handler();
			}

			
			RtcAlarm.AlarmTime.Hours = RxBuffer[5];
			RtcAlarm.AlarmTime.Minutes = RxBuffer[6];
			RtcAlarm.AlarmTime.Seconds = RxBuffer[7] + 0x10;
			RtcAlarm.Alarm = RTC_ALARM_A;
			if (HAL_RTC_SetAlarm_IT(&hrtc, &RtcAlarm, RTC_FORMAT_BCD) != HAL_OK)
			{
				Error_Handler();
			}
  
			memset(RxBuffer, 0, sizeof(RxBuffer));
			HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);
		}
    }	
}

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);
}

void test(void)
{
	RTC_DateTypeDef RtcDate;
	RTC_TimeTypeDef RtcTime;
	
	初始化
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);
	while(1)
	{
		HAL_RTC_GetTime(&hrtc, &RtcTime,  RTC_FORMAT_BIN);	// 读出时间值
		HAL_RTC_GetDate(&hrtc, &RtcDate,  RTC_FORMAT_BIN);	// 一定要先读时间后读日期,这样才能校正星期参数
		printf("实时时间:%04d-%02d-%02d  %02d:%02d:%02d 星期:%2d\r\n", 2000+RtcDate.Year, RtcDate.Month, 
			RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间
		HAL_Delay(1000);
	}
}

实验现象

上电运行,LED默认灭。一分钟后LED亮绿灯。

通过串口调试助手发送A55A231101000000,10秒后LED灭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】仿函数

函数调用运算符 () 也可以重载由于重载后使用的方式非常像函数的调用&#xff0c;因此称为仿函数仿函数没有固定写法&#xff0c;非常灵活 示例&#xff1a; #include <iostream> #include <string> using namespace std;class MyPrint { public://重载的运算符是…

Antlr4学习笔记

背景 在阅读shardingjdbc-4.1.1代码时&#xff0c;发现一段sql解析的逻辑&#xff0c;好奇它的实现&#xff0c;查阅相关资料发现解析引擎基于Antlr4实现&#xff0c;便有了此文 官方文档中也描述了解析引擎的迭代过程 SQL解析作为分库分表类产品的核心&#xff0c;其性能和兼…

VSCode 如何设置背景图片

VSCode 设置背景图片 1.打开应用商店&#xff0c;搜索 background &#xff0c;选择第一个&#xff0c;点击安装。 2. 安装完成后点击设置&#xff0c;点击扩展设置。 3.点击在 settings.json 中编辑。 4.将原代码注释后&#xff0c;加入以下代码。 // { // "workben…

第4章_运算符

文章目录 1. 算术运算符1.1 加法与减法运算符1.2 乘法与除法运算符1.3 求模运算符 2. 比较运算符2.1 等号运算符2.2 安全等于运算符2.3 不等于运算符2.4 空运算符2.5 非空运算符2.6 最小值运算符2.7 最大值运算符2.8 BETWEEN AND运算符2.9 IN运算符2.10 NOT IN运算符2.11 LIKE运…

Mysql用sql查询数字四舍五入小数点后两位并且第二位如果没有数用0填补

表中数据小数点后几位好长&#xff0c;直接上图 核心sql REPLACE(FORMAT(ROUND(d2.jiner, 2), 2), ,, ) ROUND函数处理数字四舍五入 FORMAT处理小数点后面必须跟进两位&#xff0c;也就是第二位没数字的话用0填补 REPLACE处理将逗号全部去除&#xff0c;因为FORMAT会导致数字…

苹果相机怎么磨皮 苹果手机怎么磨皮

相信使用苹果相机的小伙伴都有这样的疑惑&#xff0c;苹果相机怎么磨皮&#xff1f;其实可以通过相机的参数进行设置从而达到磨皮的效果&#xff0c;如果觉得相机自带的设置磨皮效果不够好&#xff0c;可以下载磨皮软件来对照片磨皮。今天的文章就来给大家介绍苹果相机怎么磨皮…

【嵌入式项目应用】__cJSON基础介绍与代码测试

目录 前言 一、JSON是什么&#xff1f; 1. JSON 基本语法 2. JSON值(value)的类型 3. 逻辑值&#xff08;true 或 false&#xff09; 4. null 5. NUMBER 数字&#xff08;整数或浮点数&#xff09; 6. STRING 字符串&#xff08;在双引号""中&#xff09; 7…

在NestJS应用程序中使用 Unleash 实现功能切换的指南

前言 近年来&#xff0c;软件开发行业迅速发展&#xff0c;功能开关&#xff08;Feature Toggle&#xff09;成为了一种常见的开发实践。通过功能开关&#xff0c;可以在运行时动态地启用或禁用应用程序的特定功能&#xff0c;以提供更灵活的软件交付和配置管理。对于使用 Nes…

手把手教你使用Vue2.0实现动态路由展示

文章目录 VUE2相关组件版本原始菜单数据数据库数据树形数据 前端项目配置静态路由配置路由守卫左侧路由回显代码 使用Vue2实现动态路由展示 思路&#xff1a; 后端返回树形数据根据数据渲染左侧菜单根据数据组装路由数据 注意&#xff1a;本文主要目的讲解是一种思路&#xff0…

阿里云推出AI编程工具“通义灵码“;生成式 AI 入门教程 2

&#x1f989; AI新闻 &#x1f680; 阿里云推出AI编程工具"通义灵码"&#xff0c;支持多种语言及实时续写功能 摘要&#xff1a;阿里云推出了一款名为"通义灵码"的AI编程工具&#xff0c;支持多种主流编程语言&#xff0c;包括Java、Python、Go等。该工…

找到数组中出现一种/两种奇数——异或运算

找到数组中出现一种/两种奇数 题目&#xff1a;一个数组有一种数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;怎么找到并打印这个数&#xff1f; trick 因为异或运算有个特点&#xff0c;满足交换律和结合律&#xff0c;同时有两个重要的特点&#xff1a; n^n…

Xray+awvs联动扫描

首先xray开启监听 xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html --plugins sqldet,xxe,upload,brute-force,cmd-injection,struts,thinkphp 然后准备目标csv文件,每行一个url或ip然后加个逗号 接着awvs导入csv 对导进来的每个目…

沉痛悼念科研分公司

今天上班途中&#xff0c;遇到了上家公司的同事王强。他正准备去体检中心体检。几句寒暄之后&#xff0c;得知他是要入职选煤公司了。 我们所在的公司比较大&#xff0c;总公司下设有几十个分、子公司&#xff0c;我和他曾经在一家子公司——科研分公司。现在的科研分公司解散…

FIFO 位宽转换

从8位转32位 module tb_fifo();reg clk,rst; initial beginclk0;forever #4.545 clk~clk; end initial beginrst1;#9.09 rst0; endreg [31:0] cnts; always (posedge clk or posedge rst) beginif(rst)begincnts < 32d0;endelsebegincnts < cnts 1b1;end endreg […

中国电子云-隐私计算-云原生安全可信计算,物理-硬件-系统-云产品-云平台,数据安全防护

目录 联邦学习的架构思想 中国电子云-隐私计算-云原生安全 可信计算&#xff0c;物理-硬件-系统-云产品-云平台&#xff0c;数据安全防护 全栈国产信创的意义 1. 提升科技创新能力 2. 推动经济发展 3. 加强信息安全与自主可控 全栈国产信创的重要领域 1. 人工智能 2.…

硬件加速器及其深度神经网络模型的性能指标理解

前言&#xff1a; 现如今&#xff0c;深度神经网络模型和硬件加速器&#xff0c;如GPU、TPU等的关系可谓是“不分彼此”&#xff0c;随着模型参数的增加&#xff0c;硬件加速器成为了训练、推理深度神经网络不可或缺的一个工具&#xff0c;而近年来硬件加速器的发展也得益于加速…

AlphaFold更新了!AlphaFold-latest

AlphaFold又有重大更新了&#xff01;AlphaFold-latest来了&#xff01; &#x1f508;&#xff1a;号外号外&#xff01;Google DeepMind联合Isomorphic Labs在2023年10月31日发布了新一代的AlphaFold&#xff08;AlphaFold-latest&#xff09;。 AlphaFold-latest显着提高了…

论文阅读 - Detecting Social Bot on the Fly using Contrastive Learning

目录 摘要&#xff1a; 引言 3 问题定义 4 CBD 4.1 框架概述 4.2 Model Learning 4.2.1 通过 GCL 进行模型预训练 4.2.2 通过一致性损失进行模型微调 4.3 在线检测 5 实验 5.1 实验设置 5.2 性能比较 5.5 少量检测研究 6 结论 https://dl.acm.org/doi/pdf/10.1145/358…

Qt信号槽

目录 1、信号的定义 2、槽定义 3、信号和槽连接 4、信号与槽断开连接 5、伪代码展示 6、注意 Qt中的信号&#xff08;signals&#xff09;和槽&#xff08;slots&#xff09;是一种用于实现对象间通信的机制&#xff0c;广泛用于Qt应用程序中&#xff0c;特别是在图形用户…

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网&#xff0c;如图1所示&#xff0c;Router作为PPPoE客户端&#xff0c;得到PPPoE服务器的认证后获得IP地址&#xff0c;实现用户接入互联网的需求。内网网关地址&#xff08;即VLANIF1接口的IP地址&#xff09;为10.137.32.1/24。 …