STM32CubeMX配置STM32G0 Standby模式停止IWDG(HAL库开发)

1.打开STM32CubeMX选择好对应的芯片,打开IWDG

2.打开串口1进行调试

3.配置好时钟

4.写好项目名称,选好开发环境,最后获取代码。

5.打开工程,点击魔术棒,勾选Use Micro LIB

6.修改main.c

复制代码
#include "main.h"
#include "iwdg.h"
#include "usart.h"
#include "gpio.h"
#include <stdio.h>
#include <stm32_hal_legacy.h>


void SystemClock_Config(void);

extern	IWDG_HandleTypeDef hiwdg;

void PWR_Enter_Standby(void)
{
		__HAL_RCC_PWR_CLK_ENABLE();
		if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
		{
			__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);

			if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF2) != RESET)
			{
				__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);
			}

			if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF4) != RESET)
			{
				__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF4);
			}
		}
		HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_HIGH);
		__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);
		//HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN4_HIGH);
		HAL_PWR_EnterSTANDBYMode();
}
 

void IWDG_OBProgram(void)
{
  /* 配置用户选项字节:在停止模式下冻结独立看门狗计数器 */
  FLASH_OBProgramInitTypeDef obprogram_init;
  /* 读取用户选项字节 */
  HAL_FLASHEx_OBGetConfig(&obprogram_init);
  
	printf("SYS USERConfig = 0x%x\r\n", obprogram_init.USERConfig);
	/* 判断FLASH_OPTR寄存器的IWDG_STDBY位是否置位(不判断也行) */
  if(obprogram_init.USERConfig & FLASH_OPTR_IWDG_STDBY)
  {
		/* 置位则清零IWDG_STOP位 */
		obprogram_init.OptionType = OPTIONBYTE_USER;
		obprogram_init.USERType = OB_USER_IWDG_STDBY;
		obprogram_init.USERConfig = OB_IWDG_STDBY_FREEZE; 
		obprogram_init.RDPLevel = OB_RDP_LEVEL_0;		
		/* 以下流程是根据手册上提供的 */
		HAL_FLASH_Unlock();
		HAL_FLASH_OB_Unlock();
		HAL_FLASHEx_OBProgram(&obprogram_init);
		HAL_FLASH_OB_Lock();
		HAL_FLASH_Lock();
		/* OBL_LAUNCH:选项字节重载位,用来生效上述更改(如果OPTLOCK为0,将此位置1,则会导致复位,如果 OPTLOCK为1,则此位无法写入,MCU复位后此位默认置1) */
		HAL_FLASH_OB_Launch();

		HAL_FLASHEx_OBGetConfig(&obprogram_init);
		printf("SET USERConfig = 0x%x\r\n", obprogram_init.USERConfig);
  }
}

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	HAL_Delay(1000);

	MX_GPIO_Init();
	MX_USART1_UART_Init();
	/* USER CODE BEGIN 2 */
	MX_IWDG_Init();
	IWDG_OBProgram();
	printf("code init \r\n");

  while (1)
  {
		/* USER CODE END WHILE */
		HAL_IWDG_Refresh(&hiwdg); 
		//HAL_Delay(500);
		printf("PWR_Enter_Standby\r\n");
		PWR_Enter_Standby();
		printf("code start\r\n");
		/* 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};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses 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();
  }
}

/* USER CODE BEGIN 4 */

/* 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 */
  __disable_irq();
  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 */

7.串口打印,修改了OB_USER_IWDG_STDBY,系统看门狗复位一次后就没有再复位了。

源码链接:跳转链接

相关推荐
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机四层电梯系统
单片机·嵌入式硬件
CFZPL1 小时前
使用江科大串口发送函数发送freertos的vTaskList出现跑飞
单片机
F133168929572 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·51单片机·硬件工程·pcb工艺
易享电子3 小时前
基于单片机电器断路器保护器系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
爱倒腾的老唐5 小时前
01、如何学习单片机
单片机·嵌入式硬件·学习
点灯小铭5 小时前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
雾削木11 小时前
stm32解锁芯片
javascript·stm32·单片机·嵌入式硬件·gitee
热爱编程的小刘12 小时前
STM32学习路线开启篇:外部中断
stm32
璞致电子13 小时前
fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
linux·嵌入式硬件·学习·fpga开发·fpga·fpga开发板·xilinx开发板
三佛科技-1341638421213 小时前
手持小风扇MCU方案,智能风扇方案设计开发
单片机·嵌入式硬件