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,系统看门狗复位一次后就没有再复位了。

源码链接:跳转链接

相关推荐
仰泳之鹅4 分钟前
【天气时钟】第一课:工程模板的搭建
单片机·嵌入式硬件
Moonquakes54011 分钟前
嵌入式开发基础学习笔记(LED实验C语言实现、蜂鸣器实验、SDK裸机驱动、链接脚本、BSP工程管理)
stm32·单片机·嵌入式硬件
思茂信息16 分钟前
CST仿真实例:手机Type-C接口ESD仿真
c语言·开发语言·单片机·嵌入式硬件·智能手机·cst·电磁仿真
梁洪飞18 分钟前
armv7 cache机制
linux·arm开发·嵌入式硬件·arm·memcache
我是海飞25 分钟前
杰理 AC792N 使用 WebSocket 连接百度语音大模型,实现 AI 对话
c语言·单片机·嵌入式·ai对话·杰理·websockey
别掩27 分钟前
光耦选型指南
单片机·嵌入式硬件
2023自学中27 分钟前
嵌入式系统中的非易失性存储设备
linux·嵌入式硬件
Zeku9 小时前
Linux内核中SPI 子系统的整体架构
stm32·freertos·linux驱动开发·linux应用开发
czhaii12 小时前
MP3音乐播放器【FatFs+SD/TF卡+I2S-DAC】@STC32G144K246,实时解码MP3
单片机·硬件工程
炸膛坦客13 小时前
FreeRTOS 学习:(二十五)任务时间统计相关 API 函数
stm32·操作系统·freertos