前言

看完了ST官方demo RTC_Tamper
在官方板子STM32H743I-EVAL2上,验证理解了demo展示的知识点。

RTC_Tamper demo展示的知识点是STM32H743的RTC寄存器读写和入侵检测的响应。
这3个知识点蛮有用的,可以在RTC寄存器中存一些机要秘密, 不希望被人窥探的内容, 在发现机箱被开盖的时候,可以采取一些自毁的措施。

自己从头用CubeMx重建一个工程,来完成RTC寄存器的读写和入侵检测的响应实现。

试验

这个试验,需要用CubeMx设置2个引脚。

PC13 RTC入侵检测引脚


刚开始试验时,还不明白,为啥PC13的按键按下,就会进入侵检测的响应。
后来才想明白,这是硬件上的实现(因为PC13就是RTC的入侵检测引脚), 只要指定PC13为RTC_TAMP1, 按下PC13就会进入RTC入侵检测的中断响应.

LED指示灯

当程序全速运行时,不用STLINK带着跑时,如果想看到入侵检测前后的区别,至少需要一个指示。

STM32CubeMX的设置

入侵检测中断的设置

还需要将相关的中断选一下, 要不没有入侵检测中断响应函数。

引脚设置别名

PF10是LED, 设置别名后,在CubeMx中操作这个管脚的初始化时,会自动使用别名的PORT和PIN, 可维护性较好。不用我们自己再去定义管脚的别名宏了。

用CubeMx重建的工程预览

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "rtc.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* Backup registers table */__IO FlagStatus TamperStatus = RESET;// BACKUP_COUNT define on main.h
uint32_t aBKPDataReg[BACKUP_COUNT] =
{RTC_BKP_DR0,  RTC_BKP_DR1,  RTC_BKP_DR2,RTC_BKP_DR3,  RTC_BKP_DR4,  RTC_BKP_DR5,RTC_BKP_DR6,  RTC_BKP_DR7,  RTC_BKP_DR8,RTC_BKP_DR9,  RTC_BKP_DR10, RTC_BKP_DR11,RTC_BKP_DR12, RTC_BKP_DR13, RTC_BKP_DR14,RTC_BKP_DR15, RTC_BKP_DR16, RTC_BKP_DR17,RTC_BKP_DR18, RTC_BKP_DR19, RTC_BKP_DR20,RTC_BKP_DR21, RTC_BKP_DR22, RTC_BKP_DR23,RTC_BKP_DR24, RTC_BKP_DR25, RTC_BKP_DR26,RTC_BKP_DR27, RTC_BKP_DR28, RTC_BKP_DR29,RTC_BKP_DR30, RTC_BKP_DR31
};/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */int index = 0;uint32_t ui_tmp = 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_RTC_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */HAL_Delay(100);HAL_GPIO_TogglePin(MY_LED1_GPIO_Port, MY_LED1_Pin);if (SET == TamperStatus) {TamperStatus = RESET;// 入侵检测发生// 先看看RTC备份寄存器是否是我设置的值/*##-4- Check Data is stored on the Back Up registers ######################*/for (index = 0; index < BACKUP_COUNT; index++){ui_tmp = HAL_RTCEx_BKUPRead(&hrtc, aBKPDataReg[index]);if (ui_tmp != (0xDF59 + (index * 0x5A))){// sTamper.NoErase = RTC_TAMPER_ERASE_BACKUP_ENABLE; // 允许擦除RTC备份, 设置了这个允许擦除的标记, 当入侵检测发生时, 由MCU硬件直接清RTC备份寄存器// 所以 ui_tmp 已经是0了// 这样看来, 可以在RTC备份寄存器中放一些机密的东西, 当机箱被开盖时, 就清掉这些秘密// 将PC.13RTC入侵检测引脚上拉,连接到机箱壳的数字地引脚上,当开盖时, 入侵检测引脚上就产生上升沿// 将 RTC入侵检测选项设置为上升沿触发 sTamper.Trigger = RTC_TAMPERTRIGGER_RISINGEDGE; , 就可以达到开盖自销毁数据的目的// 如果配合上FLASH重写 + IAP的功能, 还可以达到自销毁代码的功能// Error_Handler();ui_tmp = ui_tmp;}}// 清掉RTC备份寄存器/*##-6- Deactivate the tamper                 ##############################*/HAL_RTCEx_DeactivateTamper(&hrtc, RTC_TAMPER_1);// 检查是否RTC备份寄存器已经清掉了/*##-7- Check Data is cleared on the Back Up registers #####################*/for (index = 0; index < BACKUP_COUNT; index++){if (HAL_RTCEx_BKUPRead(&hrtc, aBKPDataReg[index]) != 0x00){Error_Handler();}}}/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};/** Supply configuration update enable */HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);/** Configure the main internal regulator output voltage */__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.LSIState = RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */// CubeMx留了很多 USER CODE BEGIN x 和 USER CODE END x , 将自己手写的代码放在这个边界里面
// TAMP_STAMP_IRQHandler() => HAL_RTCEx_TamperTimeStampIRQHandler() => HAL_RTCEx_Tamper1EventCallback()
// 实现弱函数 HAL_RTCEx_Tamper1EventCallback()
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef * hrtc)
{TamperStatus = SET;
}/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */do {HAL_Delay(10);} while (1);/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.h* @brief          : Header for main.c file.*                   This file contains the common defines of the application.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET *//* USER CODE END ET *//* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
#define BACKUP_COUNT RTC_BKP_NUMBER// aBKPDataReg define on main.c
extern uint32_t aBKPDataReg[BACKUP_COUNT];/* USER CODE END EC *//* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM *//* USER CODE END EM *//* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);/* USER CODE BEGIN EFP *//* USER CODE END EFP *//* Private defines -----------------------------------------------------------*/
#define MY_LED1_Pin GPIO_PIN_10
#define MY_LED1_GPIO_Port GPIOF
/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */#ifdef __cplusplus
}
#endif#endif /* __MAIN_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/********************************************************************************* File Name          : gpio.c* Description        : This file provides code for the configuration*                      of all used GPIO pins.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/
#include "gpio.h"
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 *//* USER CODE END 1 *//** Configure pins
*/
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(MY_LED1_GPIO_Port, MY_LED1_Pin, GPIO_PIN_RESET);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = MY_LED1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(MY_LED1_GPIO_Port, &GPIO_InitStruct);}/* USER CODE BEGIN 2 *//* USER CODE END 2 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/********************************************************************************* File Name          : gpio.h* Description        : This file contains all the functions prototypes for *                      the gpio  ******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __gpio_H
#define __gpio_H
#ifdef __cplusplusextern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_GPIO_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif
#endif /*__ pinoutConfig_H *//*** @}*//*** @}*//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/********************************************************************************* File Name          : RTC.c* Description        : This file provides code for the configuration*                      of the RTC instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/
#include "rtc.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */RTC_HandleTypeDef hrtc;/* RTC init function */
void MX_RTC_Init(void)
{int index = 0;uint32_t ui_tmp = 0;RTC_TamperTypeDef sTamper = {0};/** Initialize RTC Only */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;hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; // CubeMx生成的代码比官方Demo多了这句if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/** Enable the RTC Tamper 1 */sTamper.Tamper = RTC_TAMPER_1;sTamper.Interrupt = RTC_TAMPER1_INTERRUPT;sTamper.Trigger = RTC_TAMPERTRIGGER_RISINGEDGE; // 上升沿/下降沿 都可以sTamper.NoErase = RTC_TAMPER_ERASE_BACKUP_ENABLE; // 允许擦除RTC备份, 设置了这个允许擦除的标记, 当入侵检测发生时, 由MCU硬件直接清RTC备份寄存器sTamper.MaskFlag = RTC_TAMPERMASK_FLAG_DISABLE;sTamper.Filter = RTC_TAMPERFILTER_DISABLE;sTamper.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV32768;sTamper.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_1RTCCLK;sTamper.TamperPullUp = RTC_TAMPER_PULLUP_ENABLE;sTamper.TimeStampOnTamperDetection = RTC_TIMESTAMPONTAMPERDETECTION_ENABLE; // RTC_TIMESTAMPONTAMPERDETECTION_DISABLE 也可以if (HAL_RTCEx_SetTamper_IT(&hrtc, &sTamper) != HAL_OK){Error_Handler();}// 填充和校验RTC备份寄存器/* Clear the Tamper interrupt pending bit */__HAL_RTC_TAMPER_CLEAR_FLAG(&hrtc,RTC_FLAG_TAMP1F);/*##-3- Write Data on the Back Up registers ################################*/for (index = 0; index < BACKUP_COUNT; index++){HAL_RTCEx_BKUPWrite(&hrtc, aBKPDataReg[index], 0xDF59 + (index * 0x5A));}/*##-4- Check Data is stored on the Back Up registers ######################*/for (index = 0; index < BACKUP_COUNT; index++){ui_tmp = HAL_RTCEx_BKUPRead(&hrtc, aBKPDataReg[index]);if (ui_tmp != (0xDF59 + (index * 0x5A))){Error_Handler();}}
}void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* USER CODE BEGIN RTC_MspInit 0 *//* USER CODE END RTC_MspInit 0 *//* RTC clock enable */__HAL_RCC_RTC_ENABLE();/* RTC interrupt Init */HAL_NVIC_SetPriority(TAMP_STAMP_IRQn, 0, 0);HAL_NVIC_EnableIRQ(TAMP_STAMP_IRQn);/* USER CODE BEGIN RTC_MspInit 1 *//* USER CODE END RTC_MspInit 1 */}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* USER CODE BEGIN RTC_MspDeInit 0 *//* USER CODE END RTC_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_RTC_DISABLE();/* RTC interrupt Deinit */HAL_NVIC_DisableIRQ(TAMP_STAMP_IRQn);/* USER CODE BEGIN RTC_MspDeInit 1 *//* USER CODE END RTC_MspDeInit 1 */}
} /* USER CODE BEGIN 1 *//* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/********************************************************************************* File Name          : RTC.h* Description        : This file provides code for the configuration*                      of the RTC instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __rtc_H
#define __rtc_H
#ifdef __cplusplusextern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern RTC_HandleTypeDef hrtc;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_RTC_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif
#endif /*__ rtc_H *//*** @}*//*** @}*//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */
/********************************************************************************* @file    stm32h7xx_it.c* @brief   Interrupt Service Routines.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32h7xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD *//* USER CODE END TD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//* External variables --------------------------------------------------------*/
extern RTC_HandleTypeDef hrtc;
/* USER CODE BEGIN EV *//* USER CODE END EV *//******************************************************************************/
/*           Cortex Processor Interruption and Exception Handlers          */
/******************************************************************************/
/*** @brief This function handles Non maskable interrupt.*/
void NMI_Handler(void)
{/* USER CODE BEGIN NonMaskableInt_IRQn 0 *//* USER CODE END NonMaskableInt_IRQn 0 *//* USER CODE BEGIN NonMaskableInt_IRQn 1 *//* USER CODE END NonMaskableInt_IRQn 1 */
}/*** @brief This function handles Hard fault interrupt.*/
void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}/*** @brief This function handles Memory management fault.*/
void MemManage_Handler(void)
{/* USER CODE BEGIN MemoryManagement_IRQn 0 *//* USER CODE END MemoryManagement_IRQn 0 */while (1){/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 *//* USER CODE END W1_MemoryManagement_IRQn 0 */}
}/*** @brief This function handles Pre-fetch fault, memory access fault.*/
void BusFault_Handler(void)
{/* USER CODE BEGIN BusFault_IRQn 0 *//* USER CODE END BusFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_BusFault_IRQn 0 *//* USER CODE END W1_BusFault_IRQn 0 */}
}/*** @brief This function handles Undefined instruction or illegal state.*/
void UsageFault_Handler(void)
{/* USER CODE BEGIN UsageFault_IRQn 0 *//* USER CODE END UsageFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_UsageFault_IRQn 0 *//* USER CODE END W1_UsageFault_IRQn 0 */}
}/*** @brief This function handles System service call via SWI instruction.*/
void SVC_Handler(void)
{/* USER CODE BEGIN SVCall_IRQn 0 *//* USER CODE END SVCall_IRQn 0 *//* USER CODE BEGIN SVCall_IRQn 1 *//* USER CODE END SVCall_IRQn 1 */
}/*** @brief This function handles Debug monitor.*/
void DebugMon_Handler(void)
{/* USER CODE BEGIN DebugMonitor_IRQn 0 *//* USER CODE END DebugMonitor_IRQn 0 *//* USER CODE BEGIN DebugMonitor_IRQn 1 *//* USER CODE END DebugMonitor_IRQn 1 */
}/*** @brief This function handles Pendable request for system service.*/
void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}/*** @brief This function handles System tick timer.*/
void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */
}/******************************************************************************/
/* STM32H7xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32h7xx.s).                    */
/******************************************************************************//*** @brief This function handles RTC tamper and timestamp interrupts through EXTI line 18.*/
void TAMP_STAMP_IRQHandler(void)
{/* USER CODE BEGIN TAMP_STAMP_IRQn 0 *//* USER CODE END TAMP_STAMP_IRQn 0 */HAL_RTCEx_TamperTimeStampIRQHandler(&hrtc);/* USER CODE BEGIN TAMP_STAMP_IRQn 1 *//* USER CODE END TAMP_STAMP_IRQn 1 */
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */
/********************************************************************************* @file    stm32h7xx_it.h* @brief   This file contains the headers of the interrupt handlers.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32H7xx_IT_H
#define __STM32H7xx_IT_H#ifdef __cplusplusextern "C" {
#endif /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET *//* USER CODE END ET *//* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC *//* USER CODE END EC *//* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM *//* USER CODE END EM *//* Exported functions prototypes ---------------------------------------------*/
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TAMP_STAMP_IRQHandler(void);
/* USER CODE BEGIN EFP *//* USER CODE END EFP */#ifdef __cplusplus
}
#endif#endif /* __STM32H7xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : stm32h7xx_hal_msp.c* Description        : This file provides code for the MSP Initialization *                      and de-Initialization codes.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD *//* USER CODE END TD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN Define *//* USER CODE END Define *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN Macro *//* USER CODE END Macro *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* External functions --------------------------------------------------------*/
/* USER CODE BEGIN ExternalFunctions *//* USER CODE END ExternalFunctions *//* USER CODE BEGIN 0 *//* USER CODE END 0 */
/*** Initializes the Global MSP.*/
void HAL_MspInit(void)
{/* USER CODE BEGIN MspInit 0 *//* USER CODE END MspInit 0 */__HAL_RCC_SYSCFG_CLK_ENABLE();/* System interrupt init*//* USER CODE BEGIN MspInit 1 *//* USER CODE END MspInit 1 */
}/* USER CODE BEGIN 1 *//* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

总结

CubeMx生成的工程框架真干净.

从demo工程上看,确实能看出上游和下游厂商的区别。
上游厂商卖的是芯片,会讲芯片的功能特色讲的很细, 吸引用户去买芯片作产品.
下游厂商卖的是开发板和解决方案,不太会给用户讲细节的地方, 都是讲基础和主要的地方, 估计是精力和成本不允许。

即使是上游厂商的demo, 如果单步的仔细,也能看到废代码。
e.g. 如果RTC初始化时,设置了如下选项

sTamper.NoErase = RTC_TAMPER_ERASE_BACKUP_ENABLE; // 允许擦除RTC备份, 设置了这个允许擦除的标记, 当入侵检测发生时, 由MCU硬件直接清RTC备份寄存器

当入侵检测发生了,RTC寄存器的内容,已经由硬件清掉了,并不需要显式调用HAL_RTCEx_DeactivateTamper()

最新文章

  1. 12岁上中科大,17岁哈佛博士,31岁成哈佛教授,学神认识一下?
  2. spellchecker.php 漏洞,整理一些大汉版通的漏洞
  3. 智能硬件这5大领域竞争升级,将迎发展新模式
  4. Gartner2018新兴技术成熟度曲线:人机界线日益模糊!
  5. 转载:Apache commons开源工具简介
  6. java hashcode 多少位_hash-为什么XOR通常在Java hashCode()中使用,而很少使用按位运算符?...
  7. java中fileter用法,Java 8 使用Lambda表达式的FileFilter示例
  8. 【C++笔记】文件操作
  9. git init github
  10. OpenCvSharp4初识
  11. 无卡时代存取款的N种姿势:刷脸、扫码、手机Pay
  12. 易了千明之易语言套装视频教程第四套辅助制作
  13. 51单片机红外遥控小车
  14. 2022自动驾驶商业化落地,主流将是什么?丨曼孚科技
  15. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  16. 荣耀手机不出鸿蒙系统,惊喜!4部荣耀手机可升级至华为鸿蒙系统,网友表示:终于等到了...
  17. CentOS7开启Google TCP-BBR优化算法
  18. Linux版本的 免费的人脸识别技术。
  19. c语言int型数组长度求法及测试
  20. java实现短链接得到长链接!!!

热门文章

  1. Linux必备技能:vi的使用
  2. C++STL面试详解
  3. Go语言头秃之路(七)
  4. Echarts图表效果图(Make A Pie替代)
  5. python3爬取知乎某话题下的若干个问题及其回答
  6. Android相册列表和栏目数据表的字段结构
  7. HRM人力资源管理平台
  8. JAVA23种设计模式:单例设计模式【二】
  9. matlab实现二分法、牛顿法与割线法
  10. 使用wxParse解析富文本的总结以及解决苹果手机上视频无法播放的方法