希望大佬指点一下,为什么按下按键没有反应,跳不出while循环,下面是主程序/* Includes ------------------------------------------------------------------*/
#include "main.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 ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
/* USER CODE BEGIN PV */
__IO FlagStatus TamperStatus;
__IO uint8_t RTCStatus = 0;
/* Backup registers table */
uint32_t aBKPDataReg[BACKUP_COUNT] =
{
RTC_BKP_DR0, RTC_BKP_DR1, RTC_BKP_DR2,
RTC_BKP_DR3, RTC_BKP_DR4
};
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t index = 0;
/* STM32G0xx HAL library initialization:
- Configure the Flash prefetch
- Systick timer is configured by default as source of time base, but user
can eventually implement his proper time base source (a general purpose
timer for example or other time source), keeping in mind that Time base
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
handled in milliseconds basis.
- Low Level Initialization
*/
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* Configure LED4 */
BSP_LED_Init(LED4);
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* Configure User push-button button */
BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
/* Clear the Tamper interrupt pending bit */
__HAL_RTC_TAMPER_CLEAR_FLAG(&hrtc, RTC_FLAG_TAMP1);
/* Write Data on the Back Up registers */
for (index = 0; index < BACKUP_COUNT; index++)
{
HAL_RTCEx_BKUPWrite(&hrtc, aBKPDataReg[index], 0xDF59 + (index * 0x5A));//将数据写入指定的RTC备份数据寄存器。
}
/* Check Data is stored on the Back Up registers */
for (index = 0; index < BACKUP_COUNT; index++)
{
if (HAL_RTCEx_BKUPRead(&hrtc, aBKPDataReg[index]) != (0xDF59 + (index * 0x5A)))//从指定的RTC备份数据寄存器中读取数据。
{
Error_Handler();
}
}
/* Reset flag after writing of backup register in order to wait for new button press 写入备份寄存器后重置标志,以等待按下新按钮*/
TamperStatus = RESET;
/* Wait for the tamper button is pressed */
while(TamperStatus != SET)
{
/* Toggle LED4 with a period of 1s */
BSP_LED_Toggle(LED4);
/* Delay */
HAL_Delay(2000);
}
/* Deactivate the tamper 停用篡改*/
HAL_RTCEx_DeactivateTamper(&hrtc, RTC_TAMPER_1);//禁用防拆功能。
/* 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 END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
//if(TamperStatus !=RESET)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* Turn LED4 on */
BSP_LED_Toggle(LED4);
/* Delay */
HAL_Delay(100);
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
RCC_OscInitStruct.PLL.PLLN = 70;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV10;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV5;
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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief RTC Initialization Function
* @param None
* @retval None
*/
static void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
RTC_TamperTypeDef sTamper = {0};
/* USER CODE BEGIN RTC_Init 1 */
/* USER CODE END RTC_Init 1 */
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;
hrtc.Init.OutPut = RTC_OUTPUT_TAMPER;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/** Enable the RTC Tamper 1
*/
sTamper.Tamper = RTC_TAMPER_1;
sTamper.Trigger = RTC_TAMPERTRIGGER_FALLINGEDGE; //RTCEx篡改触发器 下降沿
sTamper.NoErase = RTC_TAMPER_ERASE_BACKUP_ENABLE;//RTCEx篡改擦除备份
sTamper.MaskFlag = RTC_TAMPERMASK_FLAG_DISABLE; //RTCEx防篡改标记
sTamper.Filter = RTC_TAMPERFILTER_DISABLE; //篡改过滤器已禁用
sTamper.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV32768;//每个篡改输入的采样频率为:RTCCLK / 32768
sTamper.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_1RTCCLK;//在1个RTCCLK周期内进行采样之前,篡改引脚已预充电
sTamper.TamperPullUp = RTC_TAMPER_PULLUP_ENABLE;//防拆针在采样前已预充电
sTamper.TimeStampOnTamperDetection = RTC_TIMESTAMPONTAMPERDETECTION_ENABLE;//篡改检测时间戳记已保存
if (HAL_RTCEx_SetTamper_IT(&hrtc, &sTamper) != HAL_OK)//将篡改设置为IT模式
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
/* USER CODE END RTC_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
}
/* USER CODE BEGIN 4 */
/**
* @brief Tamper event callback function
* @param RTC handle
* @retval None
*/
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)//篡改事件回调函数
{
RTCStatus = 1;
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 */
/* Turn LED4 on */
BSP_LED_On(LED4);
/* User can add his own implementation to report the HAL error return state */
RTCStatus = 0xE;
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,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
|