软件STM32cubeIDE下STM32F1xx和STM32F4xx使用:备份寄存器+复位标志位-基础样例

news2025/4/7 11:02:17

软件STM32cubeIDE下STM32F1xx和STM32F4xx使用:备份寄存器+复位标志位-基础样例

  • 1、前言
  • 2 、 实验环境
  • 3、自我总结
    • (1)对于备份寄存器(BKP):
    • (2)对于复位标志位(RCC_CSR):
    • (3)==实验阶段和实际应用有区别==
  • 4、先行了解
  • 5、在STM32F1和STM32F4上进行实验
    • 实验说明
      • 1)新建工程配置
      • 2)串口打印uart1
      • 3)看门狗配置,用来造成复位
      • 4)配置备份寄存器和标志位
      • 5)配置系统时钟
      • 6)生成代码后,加入的代码段
  • 6、实验结果展示与结论
      • 1)结果情况1:
      • 2)结果情况2:
      • 3)结果情况3:
  • 7、实际应用遇到问题-实际应用
      • (1)没有纽扣电池情况下,备份寄存器的值被保存下来
      • (2)写入备份寄存器会引发其它异常
      • (3)带有boot的可能会清掉复位标志位
  • 8、代码链接
  • 9、细节部分
      • (1)通过hal库来看都有什么复位标志位
      • (2)通过hal库来看有多少个备份寄存器可以使用
      • (3)要保证外部供电完全断电
      • (4)了解原理图也是不可少的
  • 10、总结

1、前言

最近在项目上使用备份寄存器和复位标志,于是学习了一下,并使用。
用STM32也好几年了,很多像pwm和串口,也调试过很多了,但仍然认为很多东西,依旧要当自己为新手。像这次调试的这两个,之前没有调试过,也没有想到过会要用上这两个。

2 、 实验环境

  • 软件环境:STM32cubeIDE 1.8.0
  • 硬件芯片:STM32F103VET6(野火:指南者)
  • 硬件芯片:STM32F407ZET6(正点原子:探索者)
  • 其它硬件:串口转换器,下载器,有电的纽扣电池等。

3、自我总结

(1)对于备份寄存器(BKP):

你可以理解在STM32芯片中,有个地方(备份寄存器BKP)或者一块区域(备份SRAM)帮忙保存数据,当然这是有条件的:
第一个是,不能完全断电,物理意义上的不能完全断电。
第二个是,写入时是有限制的,写入时,要开使能,才允许写入,这么做是为保护,不让随意写入。

他们三个:RTC时钟、备份寄存器和备份SRAM,是有关系的,都在备份区域,所以在查BKP备份寄存器时,总能看到RTC时钟相关的内容。

(2)对于复位标志位(RCC_CSR):

复位标志位,你可以理解是软件自己检测的一种工具,打个比方,当代码出现异常,不再喂狗的时候,看门狗就会使得整个系统复位,起来后,你去读取复位标志,复位标志位,就会告诉软件,上次是因为什么而复位的。

一些复位信号的产生,会引起整个系统的产生,然后有个地方会存下是什么复位了,记录这个复位,让你好读取。软件做的只有读取和将那个地方清空一下,方便下次起来,好判定。如果不清空,那么因为本次已经置位了,下次,你可能不知道是什么复位了。

(3)实验阶段和实际应用有区别

自己使用过程中,其实分为实验验证阶段和实际应用阶段的,这点还是要注意的,我们试验阶段是要证明它可以使用,并且熟悉相应的特性,了解其原理。

而实际情况可能跟测试时会有不同:
第一个是:本次使用备份寄存器就是这样,在测试时,发现完全断电,备份寄存器确实也被复位为0了,但是实际融合项目上,发现因为整个设备比较复杂,虽然设备关机了,但是因为有其他部分存在,给备份寄存器供电了,没有电池,但相当一个电池了。而且还时灵时不灵,只有将外围设备拔除完全,才会被复位为0。

4、先行了解

对于更专业的解释,可以直接找手册,发现网上大部分知识点,在参考手册里都有,或者说,都是从手册里扒的,手册直接在网上找就可以了。
参考手册F1:STM32F10x中文参考手册.pdf
参考手册F4:STM32F4xx中文参考手册.pdf

这里放一些自己认为重要的吧。
(1)如下链接,全面简绍了一下,可以收获的两个点是:
第一个:备份寄存器等,需要很低的电,就可以将数据保存下来。
第二个:BKP和RTC之间是有关系的。
博文链接:https://blog.csdn.net/ZCShouCSDN/article/details/82896924

(2)看过一些博文后,回来看参考手册,发手册里面有些可以更好帮我们理解,这里建议多看手册吧。
在这里插入图片描述
这里告诉我们两个点是:
第一个:备份区域也是可以复位的,一种方式是通过软件的方式复位。
第二个:第二个复位方式是,完全断电,同时我们也可以理解,为啥纽扣电池要接V-BAT引脚,因为V-BAT专门连接备份区域,以保证数据存在。
在这里插入图片描述
(3)对于复位标志位,我截图以下几张,也自己认为比较重要的图,它告诉你复位标志位有哪些,分别都是什么复位。
在这里插入图片描述
(4)需要了解的库函数,实际使用过程中,要使能的定时器和一些函数这里先列举。在看资料过程中,一些博文都会提到要使能一些定时器开关的,这里因为咱们使用了IDE软件,自动生成,反而不需要关心,但是要知道有这些东西存在,移植的时候要带上。

在这里插入代码片

/* 以下都是在需要自己编写的代码 */
/* 获取某个复位标志位函数 */
  if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET)
  {
  }
/* 复位  复位标志位,就是清空标志位,让其为0 */  
__HAL_RCC_CLEAR_RESET_FLAGS();
/* 读取某个备份寄存器函数 */  
  g_nBackup_reg_value=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) ;
/* 写入某个备份寄存器函数,要开使能 */ 
  HAL_PWR_EnableBkUpAccess();
  HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x02);// Writes a data in a RTC Backup data Register 1
 HAL_PWR_DisableBkUpAccess();


/* 以下都是在生成好的代码中,之间复制过来的,知道有这些函数就可以了,软件会自动生成 */
    __HAL_RCC_AFIO_CLK_ENABLE();
    __HAL_RCC_PWR_CLK_ENABLE();  //RCC电源时钟使能
    __HAL_AFIO_REMAP_SWJ_NOJTAG();
    HAL_PWR_EnableBkUpAccess();
    __HAL_RCC_BKP_CLK_ENABLE(); /* Enable BKP CLK enable for backup registers */
    __HAL_RCC_RTC_ENABLE();  /* Peripheral clock enable */
    HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);/* RTC interrupt Init */
    HAL_NVIC_EnableIRQ(RTC_IRQn);

5、在STM32F1和STM32F4上进行实验

实验说明

(1)因为要进行复位,我们之前进行过看门狗实验,正好可以让它进行复位,看看复位标志位能不能记录。
看门狗相关文章:# 软件stm32cubeIDE下配置STM32F103的独立看门狗iwdg-学习笔记-基础样例

(2)而备份寄存器,我们需要需要完全断电和使用开发板上纽扣电池,看看断到外部电源后,会有什么情况。

(3)因为配置工程过程差不多,所以合并在一起说明了,如果对代码有疑问,可以去看代码。

1)新建工程配置

(1)基本配置:外部RCC和下载
在这里插入图片描述
在这里插入图片描述

2)串口打印uart1

配置串口,就是为显示用的,没啥特殊要求,就直接默认了。
在这里插入图片描述

3)看门狗配置,用来造成复位

如果下图,是看门狗配置,具体为啥是8秒左右,看之前文章吧,有详细说明。
在这里插入图片描述
如下图,是计算的方式
在这里插入图片描述

4)配置备份寄存器和标志位

复位标志位其实是不用配置什么的,而备份寄存器需要配置下,通过配置RTC,配置使能,没什么特别要求,默认既可以了。
在这里插入图片描述

5)配置系统时钟

STM32F1基本是72Mhz,而STM32F4基本是168M,这块配置下就行,自己使用的时候忘记配置系统时钟了,不过也不影响。
在这里插入图片描述

6)生成代码后,加入的代码段

这里主要分为三个部分的代码段,一段是读取复位标志的,一段是备份寄存器读写的,一段是看门狗的,他们都在main.c函数里。这里为了方便,我也不分开了,直接将主要的部分放在下面。


/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
//第二�??
#include "string.h"
#include "stdint.h"

uint8_t u_buf[64];

#define printf(...)  HAL_UART_Transmit((UART_HandleTypeDef * )&huart1, (uint8_t *)u_buf,\
											sprintf((char *)u_buf,__VA_ARGS__),0x200);

/
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/


/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
IWDG_HandleTypeDef hiwdg;

RTC_HandleTypeDef hrtc;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_IWDG_Init(void);
static void MX_RTC_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */
//第三步加喂狗函数
void iwdg_feeddog(void)
{
    HAL_IWDG_Refresh(&hiwdg); // feed dog
}


int main(void)
{
  /* USER CODE BEGIN 1 */
int sum=0;
uint32_t g_nBackup_reg_value=0;
  /* 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_IWDG_Init();
  MX_RTC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  复位标志/
//  //printf("RCC_FLAG_LSIRDY:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY));HAL_Delay(100);
//  printf("RCC_FLAG_PINRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST));HAL_Delay(100);
//  printf("RCC_FLAG_PORRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST));HAL_Delay(100);
//  printf("RCC_FLAG_SFTRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST));HAL_Delay(100);
//  printf("RCC_FLAG_IWDGRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST));HAL_Delay(100);
//  printf("RCC_FLAG_WWDGRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST));HAL_Delay(100);
//  printf("RCC_FLAG_LPWRRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST));HAL_Delay(100);
//
//
//  __HAL_RCC_CLEAR_RESET_FLAGS();
//  printf("=========================================================");
//  printf("RCC_FLAG_PINRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST));HAL_Delay(100);
//  printf("RCC_FLAG_PORRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST));HAL_Delay(100);
//  printf("RCC_FLAG_SFTRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST));HAL_Delay(100);
//  printf("RCC_FLAG_IWDGRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST));HAL_Delay(100);
//  printf("RCC_FLAG_WWDGRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST));HAL_Delay(100);
//  printf("RCC_FLAG_LPWRRST:%d \n\t",__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST));HAL_Delay(100);

/* 按位与在一个里
#define RCC_FLAG_LSIRDY    6
#define RCC_FLAG_PINRST    5
#define RCC_FLAG_PORRST    4
#define RCC_FLAG_SFTRST    3
#define RCC_FLAG_IWDGRST   2
#define RCC_FLAG_WWDGRST   1
#define RCC_FLAG_LPWRRST   0
  */

  //LSIRDY:内部低速振荡器就绪 (Internal low-speed oscillator ready)
  if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET)
  {
  	printf(" RCC_FLAG_LSIRDY_flag=1 ");

  }
  else
  {
	  printf(" RCC_FLAG_LSIRDY_flag=0 ");

  }
  HAL_Delay(100);
  //PINRSTF:NRST引脚复位标志 (PIN reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
  {
  	printf(" RCC_FLAG_PINRST=1  ");

  }
   else
   {
 	  printf(" RCC_FLAG_PINRST=0 ");

   }
   HAL_Delay(100);
   //PORRSTF:POR/PDR 复位标志 (POR/PDR reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
  {
  	printf(" RCC_FLAG_PORRST=1 ");

  }
   else
  {
	printf(" RCC_FLAG_PORRST=0 ");

  }
  HAL_Delay(100);

   //SFTRSTF:软件复位标�? (Software reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET)
  {
  	printf(" RCC_FLAG_SFTRST=1 ");

  }
   else
  {
	printf(" RCC_FLAG_SFTRST=0 ");

  }
  HAL_Delay(100);

  //IWDGRSTF:独立看门狗复位标志 (Independent watchdog reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) //看门狗复�?
  {
  	printf(" RCC_FLAG_IWDGRST=1 ");

  }
   else
  {
	printf(" RCC_FLAG_IWDGRST=0 ");

  }
  HAL_Delay(100);
  //WWDGRSTF:窗口看门狗复位标志 (Window watchdog reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) //看门狗复�?
  {
  	printf(" RCC_FLAG_WWDGRST=1 ");

  }
   else
  {
	printf(" RCC_FLAG_WWDGRST=0 ");

  }
  HAL_Delay(100);
   // LPWRRSTF:低功�?�复位标�? (Low-power reset flag)
   if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) //看门狗复�?
  {
  	printf(" RCC_FLAG_LPWRRST=1 ");

  }
   else
  {
	printf(" RCC_FLAG_LPWRRST=0 ");

  }
  HAL_Delay(500);
//  __HAL_RCC_CLEAR_RESET_FLAGS();
//  printf(" =========__HAL_RCC_CLEAR_RESET_FLAGS()====== ");

  备份寄存�?/

  g_nBackup_reg_value=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) ;

  printf("(1)g_nBackup_reg_value:%d  ",g_nBackup_reg_value);

  HAL_PWR_EnableBkUpAccess();
 	       // Writes a data in a RTC Backup data Register 1
  HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x02);
 HAL_PWR_DisableBkUpAccess();


 g_nBackup_reg_value=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) ;

  printf("(2)g_nBackup_reg_value:%d  ",g_nBackup_reg_value);

  printf("main start!! \t");
  HAL_Delay(1000);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

//	    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0xBEBE)
//	    {
//	       // Write Back Up Register 1 Data
//	       HAL_PWR_EnableBkUpAccess();
//	       // Writes a data in a RTC Backup data Register 1
//	       HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xBEBE);
//	       HAL_PWR_DisableBkUpAccess();
//
//
//	    }
//	    else
//	    {
//	       // data register already written so turn LED3
//
//
//	    }

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	    sum++;
	 // printf("123456");
	  printf("sum_value:%d",sum);
	  if(sum>=3)
	  {

	  }else
	  {
		  iwdg_feeddog();
	  }


	  HAL_Delay(1000);

  }
  /* USER CODE END 3 */
}



6、实验结果展示与结论

1)结果情况1:

STM32F1和STM32F4,表现基本一致,有供电情况下,备份寄存器内写入值,可以被保存起来,完全断电后,会置为为0。如下图所示
在这里插入图片描述

2)结果情况2:

复位标志位,默认上电后,每一个复位标志位,都有自己的值,不一定一定是0,需要根据情况分析,但是F1和F4两块开发板,复位情况保持一致,如下图所示。
在这里插入图片描述
我们可以看到第一次默认上电,标志位 RCC_FLAG_PINRST 和 RCC_FLAG_PORRST 都是1
,通过手册我们可以知道,一个是复位引脚的,一个是上下电的。
在这里插入图片描述

3)结果情况3:

STM32F1和STM32F4,通过相同函数__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY)读取复位标志位的值是不一样的,所以采用两种形式进行打印输出。
在这里插入图片描述
如下图所示,F1中读取反馈的值是非常大的一个数,所以使用和RESET进行比较的形式输出,只要比较是不是0,我们看REST的值,发现就是判定是0和非0.
在这里插入图片描述

而在STM32F4,这个值读回来就是1或者0,就直接打印就好。

7、实际应用遇到问题-实际应用

(1)没有纽扣电池情况下,备份寄存器的值被保存下来

这块之前也说些了,实际应用过程中,因为外部连了很多设备,虽然他们都没有电池,也不给目标芯片供电,但在整个系统加持下,形成了一个类似电池的设备,让值被保持下来,而这个电池还有时灵,有时不灵,干扰测试结果。

(2)写入备份寄存器会引发其它异常

在实际使用过程中,因为带有boot,发现写入备份寄存器,导致boot跳转满,还无法升级,这块实际使用时,多测试和注意吧。

(3)带有boot的可能会清掉复位标志位

在实际使用过程中,也用了boot,所以boot在跳转前,会清除所有标志位,包括复位标志,所以实际使用时,主要不要清除复位标志位。

8、代码链接

(1)STM32F1样例代码
代码链接:https://download.csdn.net/download/qq_22146161/87744129

(1)STM32F4样例代码
代码链接:https://download.csdn.net/download/qq_22146161/87744131

9、细节部分

(1)通过hal库来看都有什么复位标志位

我们在hal库中通过一个复位标志,就能找到其它复位标志,这样也可以知道有多少个复位标志,再去查手册,知道了每个复位都会什么情况下复位。

在这里插入图片描述

(2)通过hal库来看有多少个备份寄存器可以使用

同样道理,我们可以通过一个备份寄存器,知道本系列芯片下,可以使用多少个备份寄存器,因为不同系列这个可以的数量可能是不一样的。
在这里插入图片描述

(3)要保证外部供电完全断电

如下图,所示,在调试过程中,发现备份寄存器值被保存下拉,一查才发现,j-link插着呢,电池电源和j-link都要关闭。
在这里插入图片描述
在这里插入图片描述

(4)了解原理图也是不可少的

我们可以通过原理图,来查看,硬件有没有接电池,也就是VBAT引脚外部硬件连接情况,有没有电池给其供电。
在这里插入图片描述

10、总结

一个再小的东西,也要保持自己谦虚,谨慎对待,小心实验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【5G RRC】RSRP、RSRQ以及SINR含义、计算过程详细介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

一道经典的小学数学题,和它背后的贪心算法(35)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 这个五一小长假,你玩得怎么样? 今天,咱们先做一道经典的小学数学题,…

Enabling Fast and Universal Audio Adversarial Attack Using Generative Model

Enabling Fast and Universal Audio Adversarial Attack Using Generative Model https://www.winlab.rutgers.edu/~yychen/ AAAI 2021 文章目录 Enabling Fast and Universal Audio Adversarial Attack Using Generative ModelAbstractIntroductionLimitations of Prior WorkT…

每日一个小技巧:1招教你怎么将照片无损放大

照片是一种记录、分享和保存记忆的重要方式。它可以记录特殊的时刻和经历,如毕业典礼、婚礼、旅游等,为我们锁住美好回忆。不知道大家有没有经历过,在手机或者电脑上打开一张拍摄的照片,却发现它的尺寸太小了,手动放大…

C语言从入门到精通

文章目录 C语言1.helloworld1.1 pause1.2 cls清屏1.3 加法运算1.4 hello 2 常量变量和数据类型2.1 常量2.2 变量2.3 sizeof数据类型大小2.4 无符号整型2.5 字符类型2.5.1 字符类型简介2.5.2 字符类型运算 2.6 实数型2.7 进制和转换2.8 数据溢出 3. 运算符和分支循环语句3.1 字符…

D. Decorate Apple Tree(记录每个点,叶子节点数目)

Problem - D - Codeforces 在Arkady的花园里有一棵苹果树。它可以表示为连接着枝干的节点集合,以便从任何一个节点到达任何其他节点时只有一种方法。节点从1到n进行编号,节点1称为根。 节点v的子树是指一组节点u,使得从u到根的路径必须经过v…

基于SpringBoot+Vue+Java的社区医院管理服务系统(附源码+数据库)

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区…

【动态规划】从入门到实践---动态规划详解

目录 1.动态规划概念 一.定义数组元素的含义 二.找到数组元素之间的关系表达式 三.找到初始值 2.案例详解 一:爬楼梯 1.定义数组元素的含义 2.找到数组元素之间的关系表达式 3.找到初始值 案例二:最短路径 题目: 做题步骤&#xf…

【BeautifulSoup下】——05全栈开发——如桃花来

目录索引 CSS选择器:实例演示:*1.根据标签名去找,不用加任何修饰,多个条件用空格隔开,一层一层找:**2.class类名前加. :**3. 多个逐级条件之间用空格隔开:* 除了标签名选择器之外&am…

Unity - Render Doc - 解决 Waiting For Debugger 导致连接不了 APP 的问题

环境 Unity : 2020.3.37f1 Pipeline : BRP RDC : 1.26 问题 平常有一些公司内的游戏发布在移动端运行会有各种异常,但是 unity editor (android opengl es / dx) 下正常 如果没有真机抓帧分析,是搞不定的 然后 RenderDoc 在抓发布出来的调试包也抓不…

extern\const\static的使用详解

1.extern 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,extern 可以应用于全局变量、函数或模板声明。 关键字 extern 具有四种含义,具体取决于上下文: 在非 const 全局变量声明中,extern …

理解getTypeParameters的含义

使用java泛型有时会看到getTypeParameters方法,这个方法是什么意思,下面就来具体了解一下: 官方给出的解释如下: Returns an array of TypeVariable objects that represent the type variables declared by the generic declar…

第十九章 Unity 其他 API

本节介绍一些其他经常使用的Unity类。首先,我们回顾一下Vector3向量类,它既可以表示方向,也可以表示大小。它在游戏中可以用来表示角色的位置,物体的移动/旋转,设置两个游戏对象之间的距离。在我们之前的课程中&#x…

【Unity入门】22.动态创建实例

【Unity入门】动态创建实例 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)脚本实例化预制体对象 (1)Instantiate克隆创建对象 昨天我们学习了预制体这个概念&#…

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式

目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 Spring Spring 学习的…

ChatGPT学习研究总结

目录 ChatGPT研究总结 一、程序接入用途不大 二、思考:如何构建一个类似ChatGPT的自定义模型 一些ChatGPT研究学习资料(来源网络) (1)一文读懂ChatGPT模型原理 (2)MATLAB科研图像处理——…

Windows更新【bug】

Windows更新【bug】 前言推荐Windows更新问题解决 最后 前言 以下内容源自【bug】 仅供学习交流使用 推荐 Win11安全更新问题 仍为解决 Windows更新 问题 完成更新以维护设备安全性 你的设备缺少重要的安全更新。请确保设备保持打开状态并接通电源,以便更新可…

评价基于GPT和Bert的方法并用于生信文本识别PPI

检测蛋白质-蛋白质相互作用(PPI)对于理解遗传机制、疾病发病机制和药物设计至关重要。然而,随着生物医学文献的快速增长,越来越需要自动和准确地提取PPI以促进科学知识发现。预训练语言模型,例如生成式预训练Transform…

学历:门槛还是机会?

目录 一、学历和职业之间的关系认知 二、不同的文化和传统也会对学历带来不同的解读 三、在学习、生活及工作中学历带来的局限性 四、造成“孔乙己长衫”现象的深层次原因 五、给与学弟学妹们一点毕业就业的建议 是否应该追求高学历一直是社会上热议的话题。有人认为学历代…

Splunk 转移数据之collect 命令

1: 背景: 有些数据的输出结果需要很长时间,原因是查询的数据量很大,还有就是搜索的时间范围很大:一年,或者要统计过去几个月的count / 或者是比例等。 那么在这种背景下,就需要转移查询的数据结构,进行转移到另外一个index, 用另外一个新的index 进行实时展示。 下面…